summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2016-12-22 23:16:00 +0100
committerest31 <MTest31@outlook.com>2016-12-22 23:16:00 +0100
commit81d56b94919dceb7b2e51d70b21a7ca22f852bd5 (patch)
tree1e9ef1be1b3295a8673d6e4f0bdeb4c2d3a6015f
parent8077612dcb48221281e726a60eb97bf73fde462b (diff)
parent231ac33d34dfaaddf292c5f31b1eae43eeefba2d (diff)
downloadminetest-81d56b94919dceb7b2e51d70b21a7ca22f852bd5.tar.gz
minetest-81d56b94919dceb7b2e51d70b21a7ca22f852bd5.tar.bz2
minetest-81d56b94919dceb7b2e51d70b21a7ca22f852bd5.zip
Merge 0.4.15 changes into stable-0.4
0.4.15 release!
-rw-r--r--.gitignore3
-rw-r--r--.travis.yml36
-rw-r--r--CMakeLists.txt6
-rw-r--r--README.txt102
-rw-r--r--build/android/Makefile30
-rw-r--r--build/android/build.gradle2
-rw-r--r--build/android/jni/Android.mk13
-rw-r--r--build/android/patches/sqlite3-readonly-fix.patch17
-rw-r--r--build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java5
-rw-r--r--builtin/common/misc_helpers.lua1
-rw-r--r--builtin/common/strict.lua3
-rw-r--r--builtin/common/vector.lua9
-rw-r--r--builtin/game/auth.lua16
-rw-r--r--builtin/game/chatcommands.lua124
-rw-r--r--builtin/game/constants.lua10
-rw-r--r--builtin/game/detached_inventory.lua4
-rw-r--r--builtin/game/falling.lua110
-rw-r--r--builtin/game/forceloading.lua41
-rw-r--r--builtin/game/init.lua14
-rw-r--r--builtin/game/item.lua11
-rw-r--r--builtin/game/item_entity.lua4
-rw-r--r--builtin/game/misc.lua64
-rw-r--r--builtin/game/mod_profiling.lua356
-rw-r--r--builtin/game/privileges.lua64
-rw-r--r--builtin/game/register.lua43
-rw-r--r--builtin/game/voxelarea.lua49
-rw-r--r--builtin/mainmenu/common.lua10
-rw-r--r--builtin/mainmenu/dlg_config_world.lua48
-rw-r--r--builtin/mainmenu/dlg_settings_advanced.lua108
-rw-r--r--builtin/mainmenu/generate_from_settingtypes.lua99
-rw-r--r--builtin/mainmenu/modmgr.lua18
-rw-r--r--builtin/mainmenu/tab_credits.lua17
-rw-r--r--builtin/mainmenu/tab_mods.lua24
-rw-r--r--builtin/mainmenu/tab_texturepacks.lua6
-rw-r--r--builtin/profiler/init.lua72
-rw-r--r--builtin/profiler/instrumentation.lua232
-rw-r--r--builtin/profiler/reporter.lua277
-rw-r--r--builtin/profiler/sampling.lua206
-rw-r--r--builtin/settingtypes.txt197
-rw-r--r--client/shaders/minimap_shader/opengl_vertex.glsl2
-rw-r--r--client/shaders/nodes_shader/opengl_fragment.glsl33
-rw-r--r--client/shaders/nodes_shader/opengl_vertex.glsl2
-rw-r--r--client/shaders/water_surface_shader/opengl_fragment.glsl33
-rw-r--r--client/shaders/water_surface_shader/opengl_vertex.glsl2
-rw-r--r--client/shaders/wielded_shader/opengl_fragment.glsl16
-rw-r--r--client/shaders/wielded_shader/opengl_vertex.glsl2
-rw-r--r--cmake/Modules/FindJson.cmake4
-rw-r--r--cmake/Modules/FindNcursesw.cmake2
-rw-r--r--doc/lua_api.txt510
-rw-r--r--doc/menu_lua_api.txt6
-rw-r--r--doc/old/ancient_main_comment.txt345
-rw-r--r--doc/old/changelog.txt147
-rw-r--r--doc/texture_overrides.txt35
-rw-r--r--doc/texture_packs.txt158
-rw-r--r--minetest.conf.example241
-rw-r--r--misc/minetest-xorg-icon-128.pngbin0 -> 11241 bytes
-rw-r--r--misc/minetest.appdata.xml9
-rw-r--r--misc/minetest.desktop2
-rw-r--r--misc/minetest.exe.manifest15
-rw-r--r--po/be/minetest.po256
-rw-r--r--po/ca/minetest.po371
-rw-r--r--po/cs/minetest.po578
-rw-r--r--po/da/minetest.po1491
-rw-r--r--po/de/minetest.po1092
-rw-r--r--po/eo/minetest.po382
-rw-r--r--po/es/minetest.po455
-rw-r--r--po/et/minetest.po426
-rw-r--r--po/fr/minetest.po1421
-rw-r--r--po/he/minetest.po315
-rw-r--r--po/hu/minetest.po615
-rw-r--r--po/id/minetest.po792
-rw-r--r--po/it/minetest.po553
-rw-r--r--po/ja/minetest.po551
-rw-r--r--po/jbo/minetest.po280
-rw-r--r--po/ko/minetest.po1459
-rw-r--r--po/ky/minetest.po377
-rw-r--r--po/lt/minetest.po355
-rw-r--r--po/minetest.pot248
-rw-r--r--po/nb/minetest.po348
-rw-r--r--po/nl/minetest.po1552
-rw-r--r--po/pl/minetest.po1575
-rw-r--r--po/pt/minetest.po772
-rw-r--r--po/pt_BR/minetest.po1520
-rw-r--r--po/ro/minetest.po376
-rw-r--r--po/ru/minetest.po844
-rw-r--r--po/sr_Cyrl/minetest.po4234
-rw-r--r--po/sw/minetest.po4657
-rw-r--r--po/tr/minetest.po336
-rw-r--r--po/uk/minetest.po433
-rw-r--r--po/zh_CN/minetest.po576
-rw-r--r--po/zh_TW/minetest.po529
-rw-r--r--src/CMakeLists.txt96
-rw-r--r--src/camera.cpp19
-rw-r--r--src/camera.h1
-rw-r--r--src/cavegen.cpp835
-rw-r--r--src/cavegen.h187
-rw-r--r--src/cguittfont/CGUITTFont.cpp30
-rw-r--r--src/cguittfont/CGUITTFont.h7
-rw-r--r--src/chat.cpp40
-rw-r--r--src/chat.h19
-rw-r--r--src/client.cpp140
-rw-r--r--src/client.h24
-rw-r--r--src/client/CMakeLists.txt1
-rw-r--r--src/client/clientlauncher.cpp27
-rw-r--r--src/client/inputhandler.h50
-rw-r--r--src/client/joystick_controller.cpp179
-rw-r--r--src/client/joystick_controller.h163
-rw-r--r--src/client/keys.h86
-rw-r--r--src/client/tile.cpp134
-rw-r--r--src/clientiface.cpp122
-rw-r--r--src/clientiface.h9
-rw-r--r--src/clientmap.cpp24
-rw-r--r--src/clientmap.h7
-rw-r--r--src/clientobject.cpp10
-rw-r--r--src/clientobject.h4
-rw-r--r--src/cmake_config.h.in2
-rw-r--r--src/collision.cpp124
-rw-r--r--src/constants.h2
-rw-r--r--src/content_cao.cpp190
-rw-r--r--src/content_cao.h11
-rw-r--r--src/content_mapblock.cpp203
-rw-r--r--src/content_nodemeta.cpp2
-rw-r--r--src/content_sao.cpp404
-rw-r--r--src/content_sao.h104
-rw-r--r--src/convert_json.h2
-rw-r--r--src/craftdef.cpp90
-rw-r--r--src/craftdef.h4
-rw-r--r--src/database-dummy.cpp11
-rw-r--r--src/database-dummy.h8
-rw-r--r--src/database-leveldb.cpp9
-rw-r--r--src/database-leveldb.h8
-rw-r--r--src/database-postgresql.cpp286
-rw-r--r--src/database-postgresql.h95
-rw-r--r--src/database-redis.cpp31
-rw-r--r--src/database-redis.h12
-rw-r--r--src/database-sqlite3.cpp25
-rw-r--r--src/database-sqlite3.h16
-rw-r--r--src/database.h2
-rw-r--r--src/defaultsettings.cpp22
-rw-r--r--src/dungeongen.cpp150
-rw-r--r--src/dungeongen.h36
-rw-r--r--src/emerge.cpp114
-rw-r--r--src/emerge.h20
-rw-r--r--src/environment.cpp457
-rw-r--r--src/environment.h57
-rw-r--r--src/exceptions.h5
-rw-r--r--src/filesys.cpp35
-rw-r--r--src/game.cpp883
-rw-r--r--src/game.h7
-rw-r--r--src/genericobject.cpp12
-rw-r--r--src/genericobject.h5
-rw-r--r--src/gettext.h10
-rw-r--r--src/guiChatConsole.cpp33
-rw-r--r--src/guiEngine.cpp41
-rw-r--r--src/guiEngine.h10
-rw-r--r--src/guiFormSpecMenu.cpp317
-rw-r--r--src/guiFormSpecMenu.h98
-rw-r--r--src/guiKeyChangeMenu.cpp4
-rw-r--r--src/guiTable.cpp4
-rw-r--r--src/guiVolumeChange.cpp82
-rw-r--r--src/guiVolumeChange.h3
-rw-r--r--src/hud.cpp6
-rw-r--r--src/hud.h9
-rw-r--r--src/intlGUIEditBox.cpp2
-rw-r--r--src/inventory.h5
-rw-r--r--src/irrlicht_changes/CMakeLists.txt7
-rw-r--r--src/irrlicht_changes/static_text.cpp679
-rw-r--r--src/irrlicht_changes/static_text.h268
-rw-r--r--src/itemdef.cpp14
-rw-r--r--src/itemdef.h3
-rw-r--r--src/itemgroup.h6
-rw-r--r--src/jsoncpp/json/CMakeLists.txt (renamed from src/json/CMakeLists.txt)0
-rw-r--r--src/jsoncpp/json/UPDATING (renamed from src/json/UPDATING)0
-rw-r--r--src/jsoncpp/json/json.h (renamed from src/json/json.h)0
-rw-r--r--src/jsoncpp/json/jsoncpp.cpp (renamed from src/json/jsoncpp.cpp)0
-rw-r--r--src/keycode.cpp560
-rw-r--r--src/keycode.h2
-rw-r--r--src/light.h6
-rw-r--r--src/localplayer.cpp50
-rw-r--r--src/localplayer.h75
-rw-r--r--src/main.cpp14
-rw-r--r--src/map.cpp615
-rw-r--r--src/map.h29
-rw-r--r--src/map_settings_manager.cpp194
-rw-r--r--src/map_settings_manager.h79
-rw-r--r--src/mapblock.h4
-rw-r--r--src/mapblock_mesh.cpp55
-rw-r--r--src/mapblock_mesh.h15
-rw-r--r--src/mapgen.cpp646
-rw-r--r--src/mapgen.h158
-rw-r--r--src/mapgen_flat.cpp409
-rw-r--r--src/mapgen_flat.h65
-rw-r--r--src/mapgen_fractal.cpp407
-rw-r--r--src/mapgen_fractal.h70
-rw-r--r--src/mapgen_singlenode.h19
-rw-r--r--src/mapgen_v5.cpp390
-rw-r--r--src/mapgen_v5.h66
-rw-r--r--src/mapgen_v6.cpp82
-rw-r--r--src/mapgen_v6.h20
-rw-r--r--src/mapgen_v7.cpp688
-rw-r--r--src/mapgen_v7.h103
-rw-r--r--src/mapgen_valleys.cpp390
-rw-r--r--src/mapgen_valleys.h65
-rw-r--r--src/mapnode.cpp16
-rw-r--r--src/mapnode.h9
-rw-r--r--src/mapsector.cpp28
-rw-r--r--src/mapsector.h4
-rw-r--r--src/mesh.cpp20
-rw-r--r--src/mesh.h4
-rw-r--r--src/mg_biome.cpp172
-rw-r--r--src/mg_biome.h172
-rw-r--r--src/mg_decoration.cpp131
-rw-r--r--src/mg_decoration.h14
-rw-r--r--src/mg_ore.cpp10
-rw-r--r--src/mg_ore.h3
-rw-r--r--src/mg_schematic.cpp4
-rw-r--r--src/mods.h2
-rw-r--r--src/nameidmapping.cpp2
-rw-r--r--src/nameidmapping.h12
-rw-r--r--src/network/clientpackethandler.cpp39
-rw-r--r--src/network/connection.cpp33
-rw-r--r--src/network/connection.h19
-rw-r--r--src/network/networkpacket.h1
-rw-r--r--src/network/networkprotocol.h8
-rw-r--r--src/network/serverpackethandler.cpp176
-rw-r--r--src/nodedef.cpp595
-rw-r--r--src/nodedef.h33
-rw-r--r--src/nodemetadata.cpp23
-rw-r--r--src/nodemetadata.h3
-rw-r--r--src/nodetimer.cpp72
-rw-r--r--src/nodetimer.h77
-rw-r--r--src/noise.cpp57
-rw-r--r--src/noise.h32
-rw-r--r--src/particles.cpp133
-rw-r--r--src/particles.h8
-rw-r--r--src/player.cpp183
-rw-r--r--src/player.h281
-rw-r--r--src/porting.cpp129
-rw-r--r--src/porting.h13
-rw-r--r--src/reflowscan.cpp206
-rw-r--r--src/reflowscan.h50
-rw-r--r--src/remoteplayer.cpp232
-rw-r--r--src/remoteplayer.h160
-rw-r--r--src/rollback.cpp71
-rw-r--r--src/rollback.h2
-rw-r--r--src/script/common/c_content.cpp44
-rw-r--r--src/script/common/c_content.h6
-rw-r--r--src/script/common/c_converter.cpp20
-rw-r--r--src/script/common/c_converter.h4
-rw-r--r--src/script/cpp_api/s_async.cpp3
-rw-r--r--src/script/cpp_api/s_async.h2
-rw-r--r--src/script/cpp_api/s_env.cpp4
-rw-r--r--src/script/cpp_api/s_node.cpp1
-rw-r--r--src/script/cpp_api/s_player.cpp6
-rw-r--r--src/script/cpp_api/s_player.h2
-rw-r--r--src/script/cpp_api/s_security.cpp148
-rw-r--r--src/script/cpp_api/s_security.h21
-rw-r--r--src/script/lua_api/l_areastore.cpp7
-rw-r--r--src/script/lua_api/l_craft.cpp92
-rw-r--r--src/script/lua_api/l_craft.h1
-rw-r--r--src/script/lua_api/l_env.cpp10
-rw-r--r--src/script/lua_api/l_inventory.cpp9
-rw-r--r--src/script/lua_api/l_inventory.h9
-rw-r--r--src/script/lua_api/l_item.cpp22
-rw-r--r--src/script/lua_api/l_item.h1
-rw-r--r--src/script/lua_api/l_mainmenu.cpp13
-rw-r--r--src/script/lua_api/l_mainmenu.h2
-rw-r--r--src/script/lua_api/l_mapgen.cpp218
-rw-r--r--src/script/lua_api/l_mapgen.h12
-rw-r--r--src/script/lua_api/l_nodetimer.cpp4
-rw-r--r--src/script/lua_api/l_noise.cpp2
-rw-r--r--src/script/lua_api/l_noise.h4
-rw-r--r--src/script/lua_api/l_object.cpp175
-rw-r--r--src/script/lua_api/l_object.h20
-rw-r--r--src/script/lua_api/l_particles.cpp35
-rw-r--r--src/script/lua_api/l_server.cpp31
-rw-r--r--src/script/lua_api/l_server.h3
-rw-r--r--src/script/lua_api/l_settings.cpp13
-rw-r--r--src/script/lua_api/l_settings.h3
-rw-r--r--src/script/lua_api/l_util.cpp109
-rw-r--r--src/script/lua_api/l_util.h12
-rw-r--r--src/script/lua_api/l_vmanip.cpp10
-rw-r--r--src/serialization.cpp2
-rw-r--r--src/server.cpp399
-rw-r--r--src/server.h106
-rw-r--r--src/serverlist.cpp2
-rw-r--r--src/serverlist.h2
-rw-r--r--src/serverobject.cpp1
-rw-r--r--src/serverobject.h41
-rw-r--r--src/settings.cpp71
-rw-r--r--src/settings.h39
-rw-r--r--src/settings_translation_file.cpp97
-rw-r--r--src/shader.cpp151
-rw-r--r--src/shader.h63
-rw-r--r--src/sky.cpp533
-rw-r--r--src/sound_openal.cpp27
-rw-r--r--src/subgame.cpp4
-rw-r--r--src/terminal_chat_console.cpp10
-rw-r--r--src/threading/event.cpp16
-rw-r--r--src/threading/event.h17
-rw-r--r--src/threading/mutex.cpp19
-rw-r--r--src/threading/mutex.h15
-rw-r--r--src/threading/mutex_auto_lock.h4
-rw-r--r--src/threading/thread.cpp28
-rw-r--r--src/threading/thread.h13
-rw-r--r--src/threads.h18
-rw-r--r--src/tool.cpp23
-rw-r--r--src/tool.h15
-rw-r--r--src/touchscreengui.cpp20
-rw-r--r--src/touchscreengui.h12
-rw-r--r--src/treegen.cpp14
-rw-r--r--src/treegen.h8
-rw-r--r--src/unittest/CMakeLists.txt6
-rw-r--r--src/unittest/test_filepath.cpp3
-rw-r--r--src/unittest/test_keycode.cpp129
-rw-r--r--src/unittest/test_map_settings_manager.cpp261
-rw-r--r--src/unittest/test_player.cpp88
-rw-r--r--src/unittest/test_settings.cpp7
-rw-r--r--src/unittest/test_threading.cpp3
-rw-r--r--src/util/CMakeLists.txt1
-rw-r--r--src/util/areastore.cpp1
-rw-r--r--src/util/auth.h2
-rw-r--r--src/util/cpp11_container.h43
-rw-r--r--src/util/enriched_string.cpp166
-rw-r--r--src/util/enriched_string.h91
-rw-r--r--src/util/numeric.cpp17
-rw-r--r--src/util/numeric.h37
-rw-r--r--src/util/srp.cpp2
-rw-r--r--src/util/string.cpp19
-rw-r--r--src/util/string.h86
-rw-r--r--src/voxelalgorithms.cpp594
-rw-r--r--src/voxelalgorithms.h21
-rw-r--r--textures/base/pack/halo.pngbin144 -> 144 bytes
-rw-r--r--textures/base/pack/no_screenshot.pngbin140 -> 586 bytes
-rw-r--r--textures/base/pack/smoke_puff.pngbin1233 -> 202 bytes
-rwxr-xr-xutil/buildbot/buildwin32.sh75
-rwxr-xr-xutil/buildbot/buildwin64.sh56
-rwxr-xr-xutil/travis/before_install.sh18
-rw-r--r--util/travis/common.sh8
-rwxr-xr-xutil/travis/script.sh7
340 files changed, 37316 insertions, 16831 deletions
diff --git a/.gitignore b/.gitignore
index f9c664da6..d7e0daab4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,7 @@
tags
!tags/
gtags.files
+.idea/*
## Files related to minetest development cycle
/*.patch
@@ -71,6 +72,8 @@ locale/
*.layout
*.o
*.a
+*.ninja
+.ninja*
## Android build files
build/android/src/main/assets
diff --git a/.travis.yml b/.travis.yml
index 9d1600818..534479efb 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,14 +1,4 @@
language: cpp
-compiler:
- - gcc
- - clang
-os:
- - osx
- - linux
-env:
- - PLATFORM=Win32
- - PLATFORM=Win64
- - PLATFORM=Unix
before_install: ./util/travis/before_install.sh
script: ./util/travis/script.sh
sudo: required
@@ -16,14 +6,26 @@ notifications:
email: false
matrix:
fast_finish: true
- exclude:
+ include:
- env: PLATFORM=Win32
- compiler: clang
+ compiler: gcc
+ os: linux
- env: PLATFORM=Win64
+ compiler: gcc
+ os: linux
+ - env: PLATFORM=Unix COMPILER=clang
compiler: clang
- - env: PLATFORM=Win32
- os: osx
- - env: PLATFORM=Win64
- os: osx
- - compiler: gcc
os: osx
+ - env: PLATFORM=Unix COMPILER=g++
+ compiler: gcc
+ os: linux
+ - env: PLATFORM=Unix COMPILER=clang
+ compiler: clang
+ os: linux
+ - env: PLATFORM=Unix COMPILER=g++-6
+ compiler: gcc
+ os: linux
+addons:
+ apt:
+ sources: &sources
+ - ubuntu-toolchain-r-test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 998cdc9a3..11ebe94a1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,7 +13,7 @@ set(PROJECT_NAME_CAPITALIZED "Minetest")
# Also remember to set PROTOCOL_VERSION in network/networkprotocol.h when releasing
set(VERSION_MAJOR 0)
set(VERSION_MINOR 4)
-set(VERSION_PATCH 14)
+set(VERSION_PATCH 15)
set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
# Change to false for releases
@@ -167,6 +167,7 @@ install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/fonts" DESTINATION "${SHAREDIR}")
install(FILES "README.txt" DESTINATION "${DOCDIR}")
install(FILES "doc/lua_api.txt" DESTINATION "${DOCDIR}")
install(FILES "doc/menu_lua_api.txt" DESTINATION "${DOCDIR}")
+install(FILES "doc/texture_packs.txt" DESTINATION "${DOCDIR}")
install(FILES "doc/world_format.txt" DESTINATION "${DOCDIR}")
install(FILES "minetest.conf.example" DESTINATION "${EXAMPLE_CONF_DIR}")
@@ -175,6 +176,9 @@ if(UNIX AND NOT APPLE)
install(FILES "misc/minetest.desktop" DESTINATION "${XDG_APPS_DIR}")
install(FILES "misc/minetest.appdata.xml" DESTINATION "${APPDATADIR}")
install(FILES "misc/minetest.svg" DESTINATION "${ICONDIR}/hicolor/scalable/apps")
+ install(FILES "misc/minetest-xorg-icon-128.png"
+ DESTINATION "${ICONDIR}/hicolor/128x128/apps"
+ RENAME "minetest.png")
endif()
if(APPLE)
diff --git a/README.txt b/README.txt
index 9ca9b331e..5d4d15263 100644
--- a/README.txt
+++ b/README.txt
@@ -27,39 +27,47 @@ This game is not finished
- Don't expect it to work as well as a finished game will.
- Please report any bugs. When doing that, debug.txt is useful.
-Default Controls
+Default controls
-----------------
-- WASD: move
-- Space: jump/climb
-- Shift: sneak/go down
-- Q: drop itemstack (+ SHIFT for single item)
-- I: inventory
-- Mouse: turn/look
-- Mouse left: dig/punch
-- Mouse right: place/use
-- Mouse wheel: select item
-- T: chat
-- 1-8: select item
-
-- Esc: pause menu (pauses only singleplayer game)
-- R: Enable/Disable full range view
+- Move mouse: Look around
+- W, A, S, D: Move
+- Space: Jump/move up
+- Shift: Sneak/move down
+- Q: Drop itemstack
+- Shift + Q: Drop single item
+- Left mouse button: Dig/punch/take item
+- Right mouse button: Place/use
+- Shift + right mouse button: Build (without using)
+- I: Inventory menu
+- Mouse wheel: Select item
+- 0-9: Select item
+- Z: Zoom (needs zoom privilege)
+- T: Chat
+- /: Commad
+
+- Esc: Pause menu/abort/exit (pauses only singleplayer game)
+- R: Enable/disable full range view
- +: Increase view range
- -: Decrease view range
-- K: Enable/Disable fly (needs fly privilege)
-- J: Enable/Disable fast (needs fast privilege)
-- H: Enable/Disable noclip (needs noclip privilege)
-
-- F1: Hide/Show HUD
-- F2: Hide/Show Chat
-- F3: Disable/Enable Fog
-- F4: Disable/Enable Camera update (Mapblocks are not updated anymore when disabled)
-- F5: Toogle through debug info screens
-- F6: Toogle through output data
-- F7: Toggle through camera modes
-- F10: Show/Hide console
+- K: Enable/disable fly mode (needs fly privilege)
+- J: Enable/disable fast mode (needs fast privilege)
+- H: Enable/disable noclip mode (needs noclip privilege)
+
+- F1: Hide/show HUD
+- F2: Hide/show chat
+- F3: Disable/enable fog
+- F4: Disable/enable camera update (Mapblocks are not updated anymore when disabled, disabled in release builds)
+- F5: Cycle through debug info screens
+- F6: Cycle through profiler info screens
+- F7: Cycle through camera modes
+- F8: Toggle cinematic mode
+- F9: Cycle through minimap modes
+- Shift + F9: Change minimap orientation
+- F10: Show/hide console
- F12: Take screenshot
+- P: Write stack traces into debug.txt
-- Settable in the configuration file, see the section below.
+Most controls are settable in the configuration file, see the section below.
Paths
------
@@ -103,7 +111,7 @@ Compiling on GNU/Linux:
-----------------------
Install dependencies. Here's an example for Debian/Ubuntu:
-$ sudo apt-get install build-essential libirrlicht-dev cmake libbz2-dev libpng12-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-get 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
For Fedora users:
$ sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl* openal* libvorbis* libXxf86vm-devel libogg-devel freetype-devel mesa-libGL-devel zlib-devel jsoncpp-devel irrlicht-devel bzip2-libs gmp-devel sqlite-devel luajit-devel leveldb-devel ncurses-devel doxygen spatialindex-devel bzip2-devel
@@ -111,10 +119,10 @@ $ sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libcurl* openal*
You can install git for easily keeping your copy up to date.
If you dont want git, read below on how to get the source without git.
This is an example for installing git on Debian/Ubuntu:
-$ sudo apt-get install git-core
+$ sudo apt-get install git
For Fedora users:
-$ sudo dnf install git-core
+$ sudo dnf install git
Download source (this is the URL to the latest of source repository, which might not work at all times) using git:
$ git clone --depth 1 https://github.com/minetest/minetest.git
@@ -169,7 +177,8 @@ ENABLE_CURSES - Build with (n)curses; Enables a server side terminal (comm
ENABLE_FREETYPE - Build with FreeType2; Allows using TTF fonts
ENABLE_GETTEXT - Build with Gettext; Allows using translations
ENABLE_GLES - Search for Open GLES headers & libraries and use them
-ENABLE_LEVELDB - Build with LevelDB; Enables use of LevelDB map backend (faster than SQLite3)
+ENABLE_LEVELDB - Build with LevelDB; Enables use of LevelDB map backend
+ENABLE_POSTGRESQL - Build with libpq; Enables use of PostgreSQL map backend (PostgreSQL 9.5 or greater required)
ENABLE_REDIS - Build with libhiredis; Enables use of Redis map backend
ENABLE_SPATIAL - Build with LibSpatial; Speeds up AreaStores
ENABLE_SOUND - Build with OpenAL, libogg & libvorbis; in-game Sounds
@@ -203,6 +212,8 @@ IRRLICHT_LIBRARY - Path to libIrrlicht.a/libIrrlicht.so/libIrrlic
LEVELDB_INCLUDE_DIR - Only when building with LevelDB; directory that contains db.h
LEVELDB_LIBRARY - Only when building with LevelDB; path to libleveldb.a/libleveldb.so/libleveldb.dll.a
LEVELDB_DLL - Only when building with LevelDB on Windows; path to libleveldb.dll
+POSTGRESQL_INCLUDE_DIR - Only when building with PostgreSQL; directory that contains libpq-fe.h
+POSTGRESQL_LIBRARY - Only when building with PostgreSQL; path to libpq.a/libpq.so
REDIS_INCLUDE_DIR - Only when building with Redis; directory that contains hiredis.h
REDIS_LIBRARY - Only when building with Redis; path to libhiredis.a/libhiredis.so
SPATIAL_INCLUDE_DIR - Only when building with LibSpatial; directory that contains spatialindex/SpatialIndex.h
@@ -249,6 +260,8 @@ Compiling on Windows:
http://www.winimage.com/zLibDll/index.html
* Zlib library (zlibwapi.lib and zlibwapi.dll from zlib125dll.zip):
http://www.winimage.com/zLibDll/index.html
+ * SQLite3 headers and library
+ https://www.sqlite.org/download.html
* Optional: gettext library and tools:
http://gnuwin32.sourceforge.net/downlinks/gettext.php
- This is used for other UI languages. Feel free to leave it out.
@@ -260,6 +273,10 @@ Compiling on Windows:
- Download all the other stuff to DIR and extract them into there.
("extract here", not "extract to packagename/")
NOTE: zlib125dll.zip needs to be extracted into zlib125dll
+ NOTE: You need to extract sqlite3.h & sqlite3ext.h from sqlite3 source
+ and sqlite3.dll & sqlite3.def from sqlite3 precompiled binaries
+ into "sqlite3" directory, and generate sqlite3.lib using command
+ "LIB /DEF:sqlite3.def /OUT:sqlite3.lib"
- All those packages contain a nice base directory in them, which
should end up being the direct subdirectories of DIR.
- You will end up with a directory structure like this (+=dir, -=file):
@@ -267,7 +284,9 @@ Compiling on Windows:
+ DIR
- zlib-1.2.5.tar.gz
- zlib125dll.zip
- - irrlicht-1.7.1.zip
+ - irrlicht-1.8.3.zip
+ - sqlite-amalgamation-3130000.zip (SQLite3 headers)
+ - sqlite-dll-win32-x86-3130000.zip (SQLite3 library for 32bit system)
- 110214175330.zip (or whatever, this is the minetest source)
+ zlib-1.2.5
- zlib.h
@@ -277,10 +296,15 @@ Compiling on Windows:
- readme.txt
+ dll32
...
- + irrlicht-1.7.1
+ + irrlicht-1.8.3
+ lib
+ include
...
+ + sqlite3
+ sqlite3.h
+ sqlite3ext.h
+ sqlite3.lib
+ sqlite3.dll
+ gettext (optional)
+bin
+include
@@ -307,7 +331,7 @@ Compiling on Windows:
BUILD_SERVER [ ]
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX DIR/minetest-install
- IRRLICHT_SOURCE_DIR DIR/irrlicht-1.7.1
+ IRRLICHT_SOURCE_DIR DIR/irrlicht-1.8.3
RUN_IN_PLACE [X]
WARN_ALL [ ]
ZLIB_DLL DIR/zlib125dll/dll32/zlibwapi.dll
@@ -318,6 +342,11 @@ Compiling on Windows:
GETTEXT_LIBRARIES DIR/gettext/lib/intl.lib
GETTEXT_MSGFMT DIR/gettext/bin/msgfmt
-----------------
+ - If CMake complains it couldn't find SQLITE3, choose "Advanced" box on the
+ right top corner, then specify the location of SQLITE3_INCLUDE_DIR and
+ SQLITE3_LIBRARY manually.
+ - If you want to build 64-bit minetest, you will need to build 64-bit version
+ of irrlicht engine manually, as only 32-bit pre-built library is provided.
- Hit "Configure"
- Hit "Configure" once again 8)
- If something is still coloured red, you have a problem.
@@ -382,6 +411,9 @@ Authors of media files
Everything not listed in here:
Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+ShadowNinja:
+ textures/base/pack/smoke_puff.png
+
Paramat:
textures/base/pack/menu_header.png
diff --git a/build/android/Makefile b/build/android/Makefile
index 4ac9760f8..6e7a389c9 100644
--- a/build/android/Makefile
+++ b/build/android/Makefile
@@ -91,7 +91,7 @@ IRRLICHT_TIMESTAMP = $(IRRLICHT_DIR)timestamp
IRRLICHT_TIMESTAMP_INT = $(ANDR_ROOT)/deps/irrlicht_timestamp
IRRLICHT_URL_SVN = https://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@$(IRRLICHT_REVISION)
-OPENSSL_VERSION = 1.0.2h
+OPENSSL_VERSION = 1.0.2j
OPENSSL_BASEDIR = openssl-$(OPENSSL_VERSION)
OPENSSL_DIR = $(ANDR_ROOT)/deps/$(OPENSSL_BASEDIR)/
OPENSSL_LIB = $(OPENSSL_DIR)/libssl.so.1.0.0
@@ -99,14 +99,14 @@ OPENSSL_TIMESTAMP = $(OPENSSL_DIR)timestamp
OPENSSL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/openssl_timestamp
OPENSSL_URL = https://www.openssl.org/source/openssl-$(OPENSSL_VERSION).tar.gz
-CURL_VERSION = 7.48.0
+CURL_VERSION = 7.52.0
CURL_DIR = $(ANDR_ROOT)/deps/curl-$(CURL_VERSION)
CURL_LIB = $(CURL_DIR)/lib/.libs/libcurl.a
CURL_TIMESTAMP = $(CURL_DIR)/timestamp
CURL_TIMESTAMP_INT = $(ANDR_ROOT)/deps/curl_timestamp
CURL_URL_HTTP = https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.bz2
-GMP_VERSION = 6.1.0
+GMP_VERSION = 6.1.2
GMP_DIR = $(ANDR_ROOT)/deps/gmp-$(GMP_VERSION)
GMP_LIB = $(GMP_DIR)/usr/lib/libgmp.so
GMP_TIMESTAMP = $(GMP_DIR)/timestamp
@@ -126,7 +126,7 @@ ICONV_TIMESTAMP = $(ICONV_DIR)timestamp
ICONV_TIMESTAMP_INT = $(ANDR_ROOT)/deps/iconv_timestamp
ICONV_URL_HTTP = https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$(ICONV_VERSION).tar.gz
-SQLITE3_FOLDER = sqlite-amalgamation-3120200
+SQLITE3_FOLDER = sqlite-amalgamation-3150200
SQLITE3_URL = https://www.sqlite.org/2016/$(SQLITE3_FOLDER).zip
ANDROID_SDK = $(shell grep '^sdk\.dir' local.properties | sed 's/^.*=[[:space:]]*//')
@@ -220,6 +220,8 @@ $(OPENAL_LIB): $(OPENAL_TIMESTAMP)
${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \
NDK_MODULE_PATH=${NDK_MODULE_PATH} APP_ABI=${TARGET_ABI} \
TARGET_ARCH_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \
+ PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+ PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \
TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \
TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \
@@ -266,6 +268,8 @@ $(OGG_LIB): $(OGG_TIMESTAMP)
${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \
NDK_MODULE_PATH=${NDK_MODULE_PATH} \
APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \
+ PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+ PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \
TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \
TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \
@@ -313,6 +317,7 @@ $(OPENSSL_LIB): $(OPENSSL_TIMESTAMP) $(GMP_LIB)
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-openssl; \
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
+ --platform=android-9 \
--install-dir=$${TOOLCHAIN}; \
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
CC=${CROSS_PREFIX}gcc ./Configure enable-gmp -DL_ENDIAN -I${GMP_DIR} -L${GMP_DIR}/usr/lib android-${TARGET_ARCH};\
@@ -363,6 +368,7 @@ $(LEVELDB_LIB): $(LEVELDB_TIMESTAMP)
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-leveldb; \
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
+ --platform=android-9 \
--install-dir=$${TOOLCHAIN}; \
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
export CC=${CROSS_PREFIX}gcc; \
@@ -416,6 +422,8 @@ $(FREETYPE_LIB) : $(FREETYPE_TIMESTAMP)
${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \
NDK_MODULE_PATH=${NDK_MODULE_PATH} \
APP_PLATFORM=${APP_PLATFORM} APP_ABI=${TARGET_ABI} \
+ PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+ PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \
TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \
TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \
@@ -469,6 +477,7 @@ $(ICONV_LIB) : $(ICONV_TIMESTAMP)
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-iconv; \
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
+ --platform=android-9 \
--install-dir=$${TOOLCHAIN}; \
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
export CC=${CROSS_PREFIX}gcc; \
@@ -531,6 +540,8 @@ $(IRRLICHT_LIB): $(IRRLICHT_TIMESTAMP) $(FREETYPE_LIB)
${ANDROID_NDK}/ndk-build NDEBUG=${NDEBUG} \
NDK_MODULE_PATH=${NDK_MODULE_PATH} \
APP_ABI=${TARGET_ABI} APP_PLATFORM=${APP_PLATFORM} \
+ PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+ PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \
TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \
TARGET_CXXFLAGS+="${TARGET_CXXFLAGS_ADDON}" || exit 1; \
@@ -581,6 +592,7 @@ $(CURL_LIB): $(CURL_TIMESTAMP) $(OPENSSL_LIB)
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-curl; \
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
+ --platform=android-9 \
--install-dir=$${TOOLCHAIN}; \
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
export CC=${CROSS_PREFIX}gcc; \
@@ -640,6 +652,7 @@ $(GMP_LIB): $(GMP_TIMESTAMP)
export TOOLCHAIN=/tmp/ndk-${TARGET_HOST}-gmp; \
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh \
--toolchain=${TARGET_TOOLCHAIN}${COMPILER_VERSION} \
+ --platform=android-9 \
--install-dir=$${TOOLCHAIN}; \
export PATH="$${TOOLCHAIN}/bin:$${PATH}"; \
export CC=${CROSS_PREFIX}gcc; \
@@ -665,7 +678,9 @@ deps/${SQLITE3_FOLDER}/sqlite3.c :
cd deps; \
wget ${SQLITE3_URL}; \
unzip ${SQLITE3_FOLDER}.zip; \
- ln -s ${SQLITE3_FOLDER} sqlite
+ ln -s ${SQLITE3_FOLDER} sqlite; \
+ cd ${SQLITE3_FOLDER}; \
+ patch sqlite3.c < ${ANDR_ROOT}/patches/sqlite3-readonly-fix.patch
clean_sqlite3:
cd deps && $(RM) -rf ${SQLITE3_FOLDER} && $(RM) -f ${SQLITE3_FOLDER}.zip && \
@@ -752,9 +767,11 @@ clean_assets :
apk: local.properties assets $(ICONV_LIB) $(IRRLICHT_LIB) $(CURL_LIB) $(GMP_LIB) $(LEVELDB_TARGET) \
$(OPENAL_LIB) $(OGG_LIB) prep_srcdir $(ANDR_ROOT)/jni/src/android_version.h \
$(ANDR_ROOT)/jni/src/android_version_githash.h sqlite3_download
- @${ANDROID_NDK}/ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH} \
+ + @${ANDROID_NDK}/ndk-build NDK_MODULE_PATH=${NDK_MODULE_PATH} \
GPROF=${GPROF} APP_ABI=${TARGET_ABI} HAVE_LEVELDB=${HAVE_LEVELDB} \
APP_PLATFORM=${APP_PLATFORM} \
+ PRIVATE_CC=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}gcc \
+ PRIVATE_CXX=${NDK_MODULE_PATH}/${TARGET_TOOLCHAIN}${COMPILER_VERSION}/prebuilt/linux-x86_64/bin/${TARGET_TOOLCHAIN}g++ \
TARGET_LIBDIR=${TARGET_LIBDIR} \
TARGET_CFLAGS+="${TARGET_CFLAGS_ADDON}" \
TARGET_LDFLAGS+="${TARGET_LDFLAGS_ADDON}" \
@@ -831,4 +848,3 @@ $(ANDR_ROOT)/jni/src/android_version.h : prep_srcdir
fi
clean : clean_apk clean_assets
-
diff --git a/build/android/build.gradle b/build/android/build.gradle
index 391e250ad..20c13e385 100644
--- a/build/android/build.gradle
+++ b/build/android/build.gradle
@@ -14,7 +14,7 @@ android {
buildToolsVersion "23.0.3"
defaultConfig {
- versionCode 14
+ versionCode 16
versionName "${System.env.VERSION_STR}.${versionCode}"
minSdkVersion 9
targetSdkVersion 9
diff --git a/build/android/jni/Android.mk b/build/android/jni/Android.mk
index e8534eaac..c2186efaf 100644
--- a/build/android/jni/Android.mk
+++ b/build/android/jni/Android.mk
@@ -99,7 +99,7 @@ LOCAL_C_INCLUDES := \
jni/src \
jni/src/script \
jni/src/lua/src \
- jni/src/json \
+ jni/src/jsoncpp \
jni/src/cguittfont \
deps/irrlicht/include \
deps/libiconv/include \
@@ -169,6 +169,7 @@ LOCAL_SRC_FILES := \
jni/src/log.cpp \
jni/src/main.cpp \
jni/src/map.cpp \
+ jni/src/map_settings_manager.cpp \
jni/src/mapblock.cpp \
jni/src/mapblock_mesh.cpp \
jni/src/mapgen.cpp \
@@ -202,6 +203,8 @@ LOCAL_SRC_FILES := \
jni/src/porting.cpp \
jni/src/profiler.cpp \
jni/src/quicktune.cpp \
+ jni/src/reflowscan.cpp \
+ jni/src/remoteplayer.cpp \
jni/src/rollback.cpp \
jni/src/rollback_interface.cpp \
jni/src/serialization.cpp \
@@ -224,6 +227,7 @@ LOCAL_SRC_FILES := \
jni/src/util/auth.cpp \
jni/src/util/base64.cpp \
jni/src/util/directiontables.cpp \
+ jni/src/util/enriched_string.cpp \
jni/src/util/numeric.cpp \
jni/src/util/pointedthing.cpp \
jni/src/util/serialize.cpp \
@@ -237,6 +241,7 @@ LOCAL_SRC_FILES := \
jni/src/unittest/test_connection.cpp \
jni/src/unittest/test_filepath.cpp \
jni/src/unittest/test_inventory.cpp \
+ jni/src/unittest/test_map_settings_manager.cpp \
jni/src/unittest/test_mapnode.cpp \
jni/src/unittest/test_nodedef.cpp \
jni/src/unittest/test_noderesolver.cpp \
@@ -256,7 +261,9 @@ LOCAL_SRC_FILES := \
jni/src/settings.cpp \
jni/src/wieldmesh.cpp \
jni/src/client/clientlauncher.cpp \
- jni/src/client/tile.cpp
+ jni/src/client/tile.cpp \
+ jni/src/client/joystick_controller.cpp \
+ jni/src/irrlicht_changes/static_text.cpp
# intentionally kept out (we already build openssl itself): jni/src/util/sha256.c
@@ -356,7 +363,7 @@ LOCAL_SRC_FILES += \
jni/src/threading/thread.cpp
# JSONCPP
-LOCAL_SRC_FILES += jni/src/json/jsoncpp.cpp
+LOCAL_SRC_FILES += jni/src/jsoncpp/json/jsoncpp.cpp
LOCAL_SHARED_LIBRARIES := iconv openal ogg vorbis gmp
LOCAL_STATIC_LIBRARIES := Irrlicht freetype curl ssl crypto android_native_app_glue $(PROFILER_LIBS)
diff --git a/build/android/patches/sqlite3-readonly-fix.patch b/build/android/patches/sqlite3-readonly-fix.patch
new file mode 100644
index 000000000..be19055ee
--- /dev/null
+++ b/build/android/patches/sqlite3-readonly-fix.patch
@@ -0,0 +1,17 @@
+--- sqlite3.c 2016-11-29 02:29:24.000000000 +0000
++++ sqlite3.c 2016-12-08 22:54:54.206465377 +0000
+@@ -30445,7 +30445,14 @@
+ #if OS_VXWORKS
+ struct vxworksFileId *pId; /* Unique file ID for vxworks. */
+ #else
+- ino_t ino; /* Inode number */
++ #ifdef ANDROID
++ // Bionic's struct stat has a 64 bit st_ino on both 32 and
++ // 64 bit architectures. ino_t remains 32 bits wide on 32 bit
++ // architectures and can lead to inode truncation.
++ unsigned long long ino; /* Inode number */
++ #else
++ ino_t ino; /* Inode number */
++ #endif
+ #endif
+ };
diff --git a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
index 3173a71f4..159521a50 100644
--- a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
+++ b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
@@ -19,11 +19,6 @@ public class MtNativeActivity extends NativeActivity {
public void onDestroy() {
super.onDestroy();
}
-
- @Override
- public void onBackPressed() {
- }
-
public void copyAssets() {
Intent intent = new Intent(this, MinetestAssetCopy.class);
diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua
index e4653d41d..c2dc7514d 100644
--- a/builtin/common/misc_helpers.lua
+++ b/builtin/common/misc_helpers.lua
@@ -382,7 +382,6 @@ if INIT == "game" then
itemstack, pointed_thing)
return
end
- local pitch = placer:get_look_pitch()
local fdir = core.dir_to_facedir(placer:get_look_dir())
local wield_name = itemstack:get_name()
diff --git a/builtin/common/strict.lua b/builtin/common/strict.lua
index 05ceadf7a..23ba3d727 100644
--- a/builtin/common/strict.lua
+++ b/builtin/common/strict.lua
@@ -5,6 +5,9 @@ local WARN_INIT = false
function core.global_exists(name)
+ if type(name) ~= "string" then
+ error("core.global_exists: " .. tostring(name) .. " is not a string")
+ end
return rawget(_G, name) ~= nil
end
diff --git a/builtin/common/vector.lua b/builtin/common/vector.lua
index e9ed3aab3..90ba3cc8b 100644
--- a/builtin/common/vector.lua
+++ b/builtin/common/vector.lua
@@ -31,6 +31,14 @@ function vector.normalize(v)
end
end
+function vector.floor(v)
+ return {
+ x = math.floor(v.x),
+ y = math.floor(v.y),
+ z = math.floor(v.z)
+ }
+end
+
function vector.round(v)
return {
x = math.floor(v.x + 0.5),
@@ -130,4 +138,3 @@ function vector.divide(a, b)
z = a.z / b}
end
end
-
diff --git a/builtin/game/auth.lua b/builtin/game/auth.lua
index deb811b14..46fe3d342 100644
--- a/builtin/game/auth.lua
+++ b/builtin/game/auth.lua
@@ -199,3 +199,19 @@ core.register_on_joinplayer(function(player)
record_login(player:get_player_name())
end)
+core.register_on_prejoinplayer(function(name, ip)
+ local auth = core.auth_table
+ if auth[name] ~= nil then
+ return
+ end
+
+ local name_lower = name:lower()
+ for k in pairs(auth) do
+ if k:lower() == name_lower then
+ return string.format("\nCannot create new player called '%s'. "..
+ "Another account called '%s' is already registered. "..
+ "Please check the spelling if it's your account "..
+ "or use a different nickname.", name, k)
+ end
+ end
+end)
diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua
index 3350140ee..2bd93855b 100644
--- a/builtin/game/chatcommands.lua
+++ b/builtin/game/chatcommands.lua
@@ -14,19 +14,6 @@ function core.register_chatcommand(cmd, def)
core.chatcommands[cmd] = def
end
-if core.setting_getbool("mod_profiling") then
- local tracefct = profiling_print_log
- profiling_print_log = nil
- core.register_chatcommand("save_mod_profile",
- {
- params = "",
- description = "save mod profiling data to logfile " ..
- "(depends on default loglevel)",
- func = tracefct,
- privs = { server=true }
- })
-end
-
core.register_on_chat_message(function(name, message)
local cmd, param = string.match(message, "^/([^ ]+) *(.*)")
if not param then
@@ -51,6 +38,12 @@ core.register_on_chat_message(function(name, message)
return true -- Handled chat message
end)
+if core.setting_getbool("profiler.load") then
+ -- Run after register_chatcommand and its register_on_chat_message
+ -- Before any chattcommands that should be profiled
+ profiler.init_chatcommand()
+end
+
-- Parses a "range" string in the format of "here (number)" or
-- "(x1, y1, z1) (x2, y2, z2)", returning two position vectors
local function parse_range_str(player_name, str)
@@ -102,7 +95,7 @@ core.register_chatcommand("help", {
description = "Get help for commands or list privileges",
func = function(name, param)
local function format_help_line(cmd, def)
- local msg = "/"..cmd
+ local msg = core.colorize("#00ffff", "/"..cmd)
if def.params and def.params ~= "" then
msg = msg .. " " .. def.params
end
@@ -154,60 +147,79 @@ core.register_chatcommand("help", {
core.register_chatcommand("privs", {
params = "<name>",
description = "print out privileges of player",
- func = function(name, param)
- param = (param ~= "" and param or name)
- return true, "Privileges of " .. param .. ": "
+ func = function(caller, param)
+ param = param:trim()
+ local name = (param ~= "" and param or caller)
+ return true, "Privileges of " .. name .. ": "
.. core.privs_to_string(
- core.get_player_privs(param), ' ')
+ core.get_player_privs(name), ' ')
end,
})
+
+local function handle_grant_command(caller, grantname, grantprivstr)
+ local caller_privs = minetest.get_player_privs(caller)
+ if not (caller_privs.privs or caller_privs.basic_privs) then
+ return false, "Your privileges are insufficient."
+ end
+
+ if not core.auth_table[grantname] then
+ return false, "Player " .. grantname .. " does not exist."
+ end
+ local grantprivs = core.string_to_privs(grantprivstr)
+ if grantprivstr == "all" then
+ grantprivs = core.registered_privileges
+ end
+ local privs = core.get_player_privs(grantname)
+ local privs_unknown = ""
+ local basic_privs =
+ core.string_to_privs(core.setting_get("basic_privs") or "interact,shout")
+ for priv, _ in pairs(grantprivs) do
+ if not basic_privs[priv] and not caller_privs.privs then
+ return false, "Your privileges are insufficient."
+ end
+ if not core.registered_privileges[priv] then
+ privs_unknown = privs_unknown .. "Unknown privilege: " .. priv .. "\n"
+ end
+ privs[priv] = true
+ end
+ if privs_unknown ~= "" then
+ return false, privs_unknown
+ 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, ' '))
+ end
+ return true, "Privileges of " .. grantname .. ": "
+ .. core.privs_to_string(
+ core.get_player_privs(grantname), ' ')
+end
+
core.register_chatcommand("grant", {
params = "<name> <privilege>|all",
description = "Give privilege to player",
func = function(name, param)
- if not core.check_player_privs(name, {privs=true}) and
- not core.check_player_privs(name, {basic_privs=true}) then
- return false, "Your privileges are insufficient."
- end
local grantname, grantprivstr = string.match(param, "([^ ]+) (.+)")
if not grantname or not grantprivstr then
return false, "Invalid parameters (see /help grant)"
- elseif not core.auth_table[grantname] then
- return false, "Player " .. grantname .. " does not exist."
- end
- local grantprivs = core.string_to_privs(grantprivstr)
- if grantprivstr == "all" then
- grantprivs = core.registered_privileges
- end
- local privs = core.get_player_privs(grantname)
- local privs_unknown = ""
- local basic_privs =
- core.string_to_privs(core.setting_get("basic_privs") or "interact,shout")
- for priv, _ in pairs(grantprivs) do
- if not basic_privs[priv] and
- not core.check_player_privs(name, {privs=true}) then
- return false, "Your privileges are insufficient."
- end
- if not core.registered_privileges[priv] then
- privs_unknown = privs_unknown .. "Unknown privilege: " .. priv .. "\n"
- end
- privs[priv] = true
- end
- if privs_unknown ~= "" then
- return false, privs_unknown
- end
- core.set_player_privs(grantname, privs)
- core.log("action", name..' granted ('..core.privs_to_string(grantprivs, ', ')..') privileges to '..grantname)
- if grantname ~= name then
- core.chat_send_player(grantname, name
- .. " granted you privileges: "
- .. core.privs_to_string(grantprivs, ' '))
- end
- return true, "Privileges of " .. grantname .. ": "
- .. core.privs_to_string(
- core.get_player_privs(grantname), ' ')
+ end
+ return handle_grant_command(name, grantname, grantprivstr)
+ end,
+})
+
+core.register_chatcommand("grantme", {
+ params = "<privilege>|all",
+ description = "Grant privileges to yourself",
+ func = function(name, param)
+ if param == "" then
+ return false, "Invalid parameters (see /help grantme)"
+ end
+ return handle_grant_command(name, name, param)
end,
})
+
core.register_chatcommand("revoke", {
params = "<name> <privilege>|all",
description = "Remove privilege from player",
diff --git a/builtin/game/constants.lua b/builtin/game/constants.lua
index d0b7c753c..50c515b24 100644
--- a/builtin/game/constants.lua
+++ b/builtin/game/constants.lua
@@ -4,14 +4,24 @@
-- Constants values for use with the Lua API
--
+-- mapnode.h
-- Built-in Content IDs (for use with VoxelManip API)
core.CONTENT_UNKNOWN = 125
core.CONTENT_AIR = 126
core.CONTENT_IGNORE = 127
+-- emerge.h
-- Block emerge status constants (for use with core.emerge_area)
core.EMERGE_CANCELLED = 0
core.EMERGE_ERRORED = 1
core.EMERGE_FROM_MEMORY = 2
core.EMERGE_FROM_DISK = 3
core.EMERGE_GENERATED = 4
+
+-- constants.h
+-- Size of mapblocks in nodes
+core.MAP_BLOCKSIZE = 16
+
+-- light.h
+-- Maximum value for node 'light_source' parameter
+core.LIGHT_MAX = 14
diff --git a/builtin/game/detached_inventory.lua b/builtin/game/detached_inventory.lua
index b5d106b04..420e89ff2 100644
--- a/builtin/game/detached_inventory.lua
+++ b/builtin/game/detached_inventory.lua
@@ -2,7 +2,7 @@
core.detached_inventories = {}
-function core.create_detached_inventory(name, callbacks)
+function core.create_detached_inventory(name, callbacks, player_name)
local stuff = {}
stuff.name = name
if callbacks then
@@ -15,6 +15,6 @@ function core.create_detached_inventory(name, callbacks)
end
stuff.mod_origin = core.get_current_modname() or "??"
core.detached_inventories[name] = stuff
- return core.create_detached_inventory_raw(name)
+ return core.create_detached_inventory_raw(name, player_name)
end
diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua
index 57bb98cfd..4696ce481 100644
--- a/builtin/game/falling.lua
+++ b/builtin/game/falling.lua
@@ -1,5 +1,7 @@
-- Minetest: builtin/item.lua
+local builtin_shared = ...
+
--
-- Falling stuff
--
@@ -41,19 +43,20 @@ core.register_entity(":__builtin:falling_node", {
end,
on_step = function(self, dtime)
- -- Set gravity
+ -- Set gravity
local acceleration = self.object:getacceleration()
if not vector.equals(acceleration, {x = 0, y = -10, z = 0}) then
self.object:setacceleration({x = 0, y = -10, z = 0})
end
- -- Turn to actual sand when collides to ground or just move
+ -- Turn to actual node when colliding with ground, or continue to move
local pos = self.object:getpos()
- local bcp = {x = pos.x, y = pos.y - 0.7, z = pos.z} -- Position of bottom center point
- local bcn = core.get_node(bcp)
- local bcd = core.registered_nodes[bcn.name]
- -- Note: walkable is in the node definition, not in item groups
- if not bcd or
- (bcd.walkable or
+ -- Position of bottom center point
+ local bcp = {x = pos.x, y = pos.y - 0.7, z = pos.z}
+ -- Avoid bugs caused by an unloaded node below
+ local bcn = core.get_node_or_nil(bcp)
+ local bcd = bcn and core.registered_nodes[bcn.name]
+ if bcn and
+ (not bcd or bcd.walkable or
(core.get_item_group(self.node.name, "float") ~= 0 and
bcd.liquidtype ~= "none")) then
if bcd and bcd.leveled and
@@ -75,20 +78,20 @@ core.register_entity(":__builtin:falling_node", {
local np = {x = bcp.x, y = bcp.y + 1, z = bcp.z}
-- Check what's here
local n2 = core.get_node(np)
+ local nd = core.registered_nodes[n2.name]
-- If it's not air or liquid, remove node and replace it with
-- it's drops
- if n2.name ~= "air" and (not core.registered_nodes[n2.name] or
- core.registered_nodes[n2.name].liquidtype == "none") then
+ if n2.name ~= "air" and (not nd or nd.liquidtype == "none") then
core.remove_node(np)
- if core.registered_nodes[n2.name].buildable_to == false then
+ if nd.buildable_to == false then
-- Add dropped items
local drops = core.get_node_drops(n2.name, "")
- for _, dropped_item in ipairs(drops) do
+ for _, dropped_item in pairs(drops) do
core.add_item(np, dropped_item)
end
end
-- Run script hook
- for _, callback in ipairs(core.registered_on_dignodes) do
+ for _, callback in pairs(core.registered_on_dignodes) do
callback(np, n2)
end
end
@@ -97,7 +100,7 @@ core.register_entity(":__builtin:falling_node", {
core.add_node(np, self.node)
end
self.object:remove()
- nodeupdate(np)
+ core.check_for_falling(np)
return
end
local vel = self.object:getvelocity()
@@ -108,15 +111,17 @@ core.register_entity(":__builtin:falling_node", {
end
})
-function spawn_falling_node(p, node)
+local function spawn_falling_node(p, node)
local obj = core.add_entity(p, "__builtin:falling_node")
- obj:get_luaentity():set_node(node)
+ if obj then
+ obj:get_luaentity():set_node(node)
+ end
end
-function drop_attached_node(p)
+local function drop_attached_node(p)
local nn = core.get_node(p).name
core.remove_node(p)
- for _, item in ipairs(core.get_node_drops(nn, "")) do
+ for _, item in pairs(core.get_node_drops(nn, "")) do
local pos = {
x = p.x + math.random()/2 - 0.25,
y = p.y + math.random()/2 - 0.25,
@@ -126,11 +131,15 @@ function drop_attached_node(p)
end
end
-function check_attached_node(p, n)
+function builtin_shared.check_attached_node(p, n)
local def = core.registered_nodes[n.name]
local d = {x = 0, y = 0, z = 0}
if def.paramtype2 == "wallmounted" then
- d = core.wallmounted_to_dir(n.param2)
+ -- 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}
else
d.y = -1
end
@@ -147,19 +156,23 @@ end
-- Some common functions
--
-function nodeupdate_single(p)
+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 n_bottom = core.get_node(p_bottom)
- -- Note: walkable is in the node definition, not in item groups
- if core.registered_nodes[n_bottom.name] and
+ -- 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]
+ if d_bottom and
+
(core.get_item_group(n.name, "float") == 0 or
- core.registered_nodes[n_bottom.name].liquidtype == "none") and
- (n.name ~= n_bottom.name or (core.registered_nodes[n_bottom.name].leveled and
- core.get_node_level(p_bottom) < core.get_node_max_level(p_bottom))) and
- (not core.registered_nodes[n_bottom.name].walkable or
- core.registered_nodes[n_bottom.name].buildable_to) then
+ d_bottom.liquidtype == "none") and
+
+ (n.name ~= n_bottom.name or (d_bottom.leveled and
+ core.get_node_level(p_bottom) <
+ core.get_node_max_level(p_bottom))) and
+
+ (not d_bottom.walkable or d_bottom.buildable_to) then
n.level = core.get_node_level(p)
core.remove_node(p)
spawn_falling_node(p, n)
@@ -168,7 +181,7 @@ function nodeupdate_single(p)
end
if core.get_item_group(n.name, "attached_node") ~= 0 then
- if not check_attached_node(p, n) then
+ if not builtin_shared.check_attached_node(p, n) then
drop_attached_node(p)
return true
end
@@ -181,7 +194,7 @@ end
-- We don't walk diagonals, only our direct neighbors, and self.
-- 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 nodeupdate_neighbors = {
+local check_for_falling_neighbors = {
{x = -1, y = -1, z = 0},
{x = 1, y = -1, z = 0},
{x = 0, y = -1, z = -1},
@@ -195,7 +208,7 @@ local nodeupdate_neighbors = {
{x = 0, y = 1, z = 0},
}
-function nodeupdate(p)
+function core.check_for_falling(p)
-- Round p to prevent falling entities to get stuck.
p = vector.round(p)
@@ -214,10 +227,10 @@ function nodeupdate(p)
n = n + 1
s[n] = {p = p, v = v}
-- Select next node from neighbor list.
- p = vector.add(p, nodeupdate_neighbors[v])
+ p = vector.add(p, check_for_falling_neighbors[v])
-- Now we check out the node. If it is in need of an update,
-- it will let us know in the return value (true = updated).
- if not nodeupdate_single(p) then
+ if not core.check_single_for_falling(p) then
-- If we don't need to "recurse" (walk) to it then pop
-- our previous pos off the stack and continue from there,
-- with the v value we were at when we last were at that
@@ -249,12 +262,33 @@ end
-- Global callbacks
--
-function on_placenode(p, node)
- nodeupdate(p)
+local function on_placenode(p, node)
+ core.check_for_falling(p)
end
core.register_on_placenode(on_placenode)
-function on_dignode(p, node)
- nodeupdate(p)
+local function on_dignode(p, node)
+ core.check_for_falling(p)
end
core.register_on_dignode(on_dignode)
+
+local function on_punchnode(p, node)
+ core.check_for_falling(p)
+end
+core.register_on_punchnode(on_punchnode)
+
+--
+-- Globally exported functions
+--
+
+-- TODO remove this function after the 0.4.15 release
+function nodeupdate(p)
+ core.log("deprecated", "nodeupdate: deprecated, please use core.check_for_falling instead")
+ core.check_for_falling(p)
+end
+
+-- TODO remove this function after the 0.4.15 release
+function nodeupdate_single(p)
+ core.log("deprecated", "nodeupdate_single: deprecated, please use core.check_single_for_falling instead")
+ core.check_single_for_falling(p)
+end
diff --git a/builtin/game/forceloading.lua b/builtin/game/forceloading.lua
index 8c9fbf512..8a05de36c 100644
--- a/builtin/game/forceloading.lua
+++ b/builtin/game/forceloading.lua
@@ -5,9 +5,10 @@ core.forceload_block = nil
core.forceload_free_block = nil
local blocks_forceloaded
+local blocks_temploaded = {}
local total_forceloaded = 0
-local BLOCKSIZE = 16
+local BLOCKSIZE = core.MAP_BLOCKSIZE
local function get_blockpos(pos)
return {
x = math.floor(pos.x/BLOCKSIZE),
@@ -15,32 +16,52 @@ local function get_blockpos(pos)
z = math.floor(pos.z/BLOCKSIZE)}
end
-function core.forceload_block(pos)
+-- When we create/free a forceload, it's either transient or persistent. We want
+-- to add to/remove from the table that corresponds to the type of forceload, but
+-- we also need the other table because whether we forceload a block depends on
+-- both tables.
+-- This function returns the "primary" table we are adding to/removing from, and
+-- the other table.
+local function get_relevant_tables(transient)
+ if transient then
+ return blocks_temploaded, blocks_forceloaded
+ else
+ return blocks_forceloaded, blocks_temploaded
+ end
+end
+
+function core.forceload_block(pos, transient)
local blockpos = get_blockpos(pos)
local hash = core.hash_node_position(blockpos)
- if blocks_forceloaded[hash] ~= nil then
- blocks_forceloaded[hash] = blocks_forceloaded[hash] + 1
+ local relevant_table, other_table = get_relevant_tables(transient)
+ if relevant_table[hash] ~= nil then
+ relevant_table[hash] = relevant_table[hash] + 1
return true
+ elseif other_table[hash] ~= nil then
+ relevant_table[hash] = 1
else
if total_forceloaded >= (tonumber(core.setting_get("max_forceloaded_blocks")) or 16) then
return false
end
total_forceloaded = total_forceloaded+1
- blocks_forceloaded[hash] = 1
+ relevant_table[hash] = 1
forceload_block(blockpos)
return true
end
end
-function core.forceload_free_block(pos)
+function core.forceload_free_block(pos, transient)
local blockpos = get_blockpos(pos)
local hash = core.hash_node_position(blockpos)
- if blocks_forceloaded[hash] == nil then return end
- if blocks_forceloaded[hash] > 1 then
- blocks_forceloaded[hash] = blocks_forceloaded[hash] - 1
+ local relevant_table, other_table = get_relevant_tables(transient)
+ if relevant_table[hash] == nil then return end
+ if relevant_table[hash] > 1 then
+ relevant_table[hash] = relevant_table[hash] - 1
+ elseif other_table[hash] ~= nil then
+ relevant_table[hash] = nil
else
total_forceloaded = total_forceloaded-1
- blocks_forceloaded[hash] = nil
+ relevant_table[hash] = nil
forceload_free_block(blockpos)
end
end
diff --git a/builtin/game/init.lua b/builtin/game/init.lua
index a6cfa3bf8..b5e2f7cca 100644
--- a/builtin/game/init.lua
+++ b/builtin/game/init.lua
@@ -3,14 +3,18 @@ local scriptpath = core.get_builtin_path()..DIR_DELIM
local commonpath = scriptpath.."common"..DIR_DELIM
local gamepath = scriptpath.."game"..DIR_DELIM
+-- Shared between builtin files, but
+-- not exposed to outer context
+local builtin_shared = {}
+
dofile(commonpath.."vector.lua")
dofile(gamepath.."constants.lua")
-dofile(gamepath.."item.lua")
+assert(loadfile(gamepath.."item.lua"))(builtin_shared)
dofile(gamepath.."register.lua")
-if core.setting_getbool("mod_profiling") then
- dofile(gamepath.."mod_profiling.lua")
+if core.setting_getbool("profiler.load") then
+ profiler = dofile(scriptpath.."profiler"..DIR_DELIM.."init.lua")
end
dofile(gamepath.."item_entity.lua")
@@ -21,8 +25,10 @@ dofile(gamepath.."auth.lua")
dofile(gamepath.."chatcommands.lua")
dofile(gamepath.."static_spawn.lua")
dofile(gamepath.."detached_inventory.lua")
-dofile(gamepath.."falling.lua")
+assert(loadfile(gamepath.."falling.lua"))(builtin_shared)
dofile(gamepath.."features.lua")
dofile(gamepath.."voxelarea.lua")
dofile(gamepath.."forceloading.lua")
dofile(gamepath.."statbars.lua")
+
+profiler = nil
diff --git a/builtin/game/item.lua b/builtin/game/item.lua
index 36c2c1a68..bf456a4e0 100644
--- a/builtin/game/item.lua
+++ b/builtin/game/item.lua
@@ -1,5 +1,7 @@
-- Minetest: builtin/item.lua
+local builtin_shared = ...
+
local function copy_pointed_thing(pointed_thing)
return {
type = pointed_thing.type,
@@ -250,7 +252,9 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2)
local newnode = {name = def.name, param1 = 0, param2 = param2}
-- Calculate direction for wall mounted stuff like torches and signs
- if def.paramtype2 == 'wallmounted' and not param2 then
+ if def.place_param2 ~= nil then
+ newnode.param2 = def.place_param2
+ elseif def.paramtype2 == 'wallmounted' and not param2 then
local dir = {
x = under.x - above.x,
y = under.y - above.y,
@@ -273,7 +277,7 @@ function core.item_place_node(itemstack, placer, pointed_thing, param2)
-- Check if the node is attached and if it can be placed there
if core.get_item_group(def.name, "attached_node") ~= 0 and
- not check_attached_node(place_to, newnode) then
+ not builtin_shared.check_attached_node(place_to, newnode) then
core.log("action", "attached node " .. def.name ..
" can not be placed at " .. core.pos_to_string(place_to))
return itemstack, false
@@ -470,6 +474,9 @@ function core.node_dig(pos, node, digger)
-- Wear out tool
if not core.setting_getbool("creative_mode") then
wielded:add_wear(dp.wear)
+ if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then
+ core.sound_play(wdef.sound.breaks, {pos = pos, gain = 0.5})
+ end
end
end
digger:set_wielded_item(wielded)
diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua
index a66bf33d0..be158c119 100644
--- a/builtin/game/item_entity.lua
+++ b/builtin/game/item_entity.lua
@@ -31,7 +31,6 @@ core.register_entity(":__builtin:item", {
spritediv = {x = 1, y = 1},
initial_sprite_basepos = {x = 0, y = 0},
is_visible = false,
- infotext = "",
},
itemstring = '',
@@ -51,7 +50,6 @@ core.register_entity(":__builtin:item", {
local c = s
local itemtable = stack:to_table()
local itemname = nil
- local description = ""
if itemtable then
itemname = stack:to_table().name
end
@@ -60,7 +58,6 @@ core.register_entity(":__builtin:item", {
if core.registered_items[itemname] then
item_texture = core.registered_items[itemname].inventory_image
item_type = core.registered_items[itemname].type
- description = core.registered_items[itemname].description
end
local prop = {
is_visible = true,
@@ -69,7 +66,6 @@ core.register_entity(":__builtin:item", {
visual_size = {x = s, y = s},
collisionbox = {-c, -c, -c, c, c, c},
automatic_rotate = math.pi * 0.5,
- infotext = description,
}
self.object:set_properties(prop)
end,
diff --git a/builtin/game/misc.lua b/builtin/game/misc.lua
index de41cfc91..7caa9e7ba 100644
--- a/builtin/game/misc.lua
+++ b/builtin/game/misc.lua
@@ -38,7 +38,7 @@ core.register_globalstep(function(dtime)
end)
function core.after(after, func, ...)
- assert(tonumber(time) and type(func) == "function",
+ assert(tonumber(after) and type(func) == "function",
"Invalid core.after invocation")
jobs[#jobs + 1] = {
func = func,
@@ -48,11 +48,13 @@ function core.after(after, func, ...)
}
end
-function core.check_player_privs(player_or_name, ...)
- local name = player_or_name
- -- Check if we have been provided with a Player object.
- if type(name) ~= "string" then
+function core.check_player_privs(name, ...)
+ local arg_type = type(name)
+ if (arg_type == "userdata" or arg_type == "table") and
+ name.get_player_name then -- If it quacks like a Player...
name = name:get_player_name()
+ elseif arg_type ~= "string" then
+ error("Invalid core.check_player_privs argument type: " .. arg_type, 2)
end
local requested_privs = {...}
@@ -85,11 +87,21 @@ end
local player_list = {}
core.register_on_joinplayer(function(player)
- player_list[player:get_player_name()] = player
+ local player_name = player:get_player_name()
+ player_list[player_name] = player
+ if not minetest.is_singleplayer() then
+ core.chat_send_all("*** " .. player_name .. " joined the game.")
+ end
end)
-core.register_on_leaveplayer(function(player)
- player_list[player:get_player_name()] = nil
+core.register_on_leaveplayer(function(player, timed_out)
+ local player_name = player:get_player_name()
+ player_list[player_name] = nil
+ local announcement = "*** " .. player_name .. " left the game."
+ if timed_out then
+ announcement = announcement .. " (timed out)"
+ end
+ core.chat_send_all(announcement)
end)
function core.get_connected_players()
@@ -197,3 +209,39 @@ function core.http_add_fetch(httpenv)
return httpenv
end
+
+if minetest.setting_getbool("disable_escape_sequences") then
+
+ function core.get_color_escape_sequence(color)
+ return ""
+ end
+
+ function core.get_background_escape_sequence(color)
+ return ""
+ end
+
+ function core.colorize(color, message)
+ return message
+ end
+
+else
+
+ local ESCAPE_CHAR = string.char(0x1b)
+ function core.get_color_escape_sequence(color)
+ return ESCAPE_CHAR .. "(c@" .. color .. ")"
+ end
+
+ function core.get_background_escape_sequence(color)
+ return ESCAPE_CHAR .. "(b@" .. color .. ")"
+ end
+
+ function core.colorize(color, message)
+ return core.get_color_escape_sequence(color) .. message .. core.get_color_escape_sequence("#ffffff")
+ end
+
+end
+
+function core.close_formspec(player_name, formname)
+ return minetest.show_formspec(player_name, formname, "")
+end
+
diff --git a/builtin/game/mod_profiling.lua b/builtin/game/mod_profiling.lua
deleted file mode 100644
index df2d10221..000000000
--- a/builtin/game/mod_profiling.lua
+++ /dev/null
@@ -1,356 +0,0 @@
--- Minetest: builtin/game/mod_profiling.lua
-
-local mod_statistics = {}
-mod_statistics.step_total = 0
-mod_statistics.data = {}
-mod_statistics.stats = {}
-mod_statistics.stats["total"] = {
- min_us = math.huge,
- max_us = 0,
- avg_us = 0,
- min_per = 100,
- max_per = 100,
- avg_per = 100
-}
-
-local replacement_table = {
- "register_globalstep",
- "register_on_placenode",
- "register_on_dignode",
- "register_on_punchnode",
- "register_on_generated",
- "register_on_newplayer",
- "register_on_dieplayer",
- "register_on_respawnplayer",
- "register_on_prejoinplayer",
- "register_on_joinplayer",
- "register_on_leaveplayer",
- "register_on_cheat",
- "register_on_chat_message",
- "register_on_player_receive_fields",
- "register_on_mapgen_init",
- "register_on_craft",
- "register_craft_predict",
- "register_on_item_eat"
-}
-
---------------------------------------------------------------------------------
-function mod_statistics.log_time(type, modname, time_in_us)
-
- if modname == nil then
- modname = "builtin"
- end
-
- if mod_statistics.data[modname] == nil then
- mod_statistics.data[modname] = {}
- end
-
- if mod_statistics.data[modname][type] == nil then
- mod_statistics.data[modname][type] = 0
- end
-
- mod_statistics.data[modname][type] =
- mod_statistics.data[modname][type] + time_in_us
- mod_statistics.step_total = mod_statistics.step_total + time_in_us
-end
-
---------------------------------------------------------------------------------
-function mod_statistics.update_statistics(dtime)
- for modname,types in pairs(mod_statistics.data) do
-
- if mod_statistics.stats[modname] == nil then
- mod_statistics.stats[modname] = {
- min_us = math.huge,
- max_us = 0,
- avg_us = 0,
- min_per = 100,
- max_per = 0,
- avg_per = 0
- }
- end
-
- local modtime = 0
- for type,time in pairs(types) do
- modtime = modtime + time
- if mod_statistics.stats[modname].types == nil then
- mod_statistics.stats[modname].types = {}
- end
- if mod_statistics.stats[modname].types[type] == nil then
- mod_statistics.stats[modname].types[type] = {
- min_us = math.huge,
- max_us = 0,
- avg_us = 0,
- min_per = 100,
- max_per = 0,
- avg_per = 0
- }
- end
-
- local toupdate = mod_statistics.stats[modname].types[type]
-
- --update us values
- toupdate.min_us = math.min(time, toupdate.min_us)
- toupdate.max_us = math.max(time, toupdate.max_us)
- --TODO find better algorithm
- toupdate.avg_us = toupdate.avg_us * 0.99 + modtime * 0.01
-
- --update percentage values
- local cur_per = (time/mod_statistics.step_total) * 100
- toupdate.min_per = math.min(toupdate.min_per, cur_per)
-
- toupdate.max_per = math.max(toupdate.max_per, cur_per)
-
- --TODO find better algorithm
- toupdate.avg_per = toupdate.avg_per * 0.99 + cur_per * 0.01
-
- mod_statistics.data[modname][type] = 0
- end
-
- --per mod statistics
- --update us values
- mod_statistics.stats[modname].min_us =
- math.min(modtime, mod_statistics.stats[modname].min_us)
- mod_statistics.stats[modname].max_us =
- math.max(modtime, mod_statistics.stats[modname].max_us)
- --TODO find better algorithm
- mod_statistics.stats[modname].avg_us =
- mod_statistics.stats[modname].avg_us * 0.99 + modtime * 0.01
-
- --update percentage values
- local cur_per = (modtime/mod_statistics.step_total) * 100
- mod_statistics.stats[modname].min_per =
- math.min(mod_statistics.stats[modname].min_per, cur_per)
-
- mod_statistics.stats[modname].max_per =
- math.max(mod_statistics.stats[modname].max_per, cur_per)
-
- --TODO find better algorithm
- mod_statistics.stats[modname].avg_per =
- mod_statistics.stats[modname].avg_per * 0.99 + cur_per * 0.01
- end
-
- --update "total"
- mod_statistics.stats["total"].min_us =
- math.min(mod_statistics.step_total, mod_statistics.stats["total"].min_us)
- mod_statistics.stats["total"].max_us =
- math.max(mod_statistics.step_total, mod_statistics.stats["total"].max_us)
- --TODO find better algorithm
- mod_statistics.stats["total"].avg_us =
- mod_statistics.stats["total"].avg_us * 0.99 +
- mod_statistics.step_total * 0.01
-
- mod_statistics.step_total = 0
-end
-
---------------------------------------------------------------------------------
-local function build_callback(log_id, fct)
- return function( toregister )
- local modname = core.get_current_modname()
-
- fct(function(...)
- local starttime = core.get_us_time()
- -- note maximum 10 return values are supported unless someone finds
- -- a way to store a variable lenght return value list
- local r0, r1, r2, r3, r4, r5, r6, r7, r8, r9 = toregister(...)
- local delta = core.get_us_time() - starttime
- mod_statistics.log_time(log_id, modname, delta)
- return r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
- end
- )
- end
-end
-
---------------------------------------------------------------------------------
-function profiling_print_log(cmd, filter)
-
- print("Filter:" .. dump(filter))
-
- core.log("action", "Values below show times/percentages per server step.")
- core.log("action", "Following suffixes are used for entities:")
- core.log("action", "\t#oa := on_activate, #os := on_step, #op := on_punch, #or := on_rightclick, #gs := get_staticdata")
- core.log("action",
- string.format("%16s | %25s | %10s | %10s | %10s | %9s | %9s | %9s",
- "modname", "type" , "min µs", "max µs", "avg µs", "min %", "max %", "avg %")
- )
- core.log("action",
- "-----------------+---------------------------+-----------+" ..
- "-----------+-----------+-----------+-----------+-----------")
- for modname,statistics in pairs(mod_statistics.stats) do
- if modname ~= "total" then
-
- if (filter == "") or (modname == filter) then
- if modname:len() > 16 then
- modname = "..." .. modname:sub(-13)
- end
-
- core.log("action",
- string.format("%16s | %25s | %9d | %9d | %9d | %9d | %9d | %9d",
- modname,
- " ",
- statistics.min_us,
- statistics.max_us,
- statistics.avg_us,
- statistics.min_per,
- statistics.max_per,
- statistics.avg_per)
- )
- if core.setting_getbool("detailed_profiling") then
- if statistics.types ~= nil then
- for type,typestats in pairs(statistics.types) do
-
- if type:len() > 25 then
- type = "..." .. type:sub(-22)
- end
-
- core.log("action",
- string.format(
- "%16s | %25s | %9d | %9d | %9d | %9d | %9d | %9d",
- " ",
- type,
- typestats.min_us,
- typestats.max_us,
- typestats.avg_us,
- typestats.min_per,
- typestats.max_per,
- typestats.avg_per)
- )
- end
- end
- end
- end
- end
- end
- core.log("action",
- "-----------------+---------------------------+-----------+" ..
- "-----------+-----------+-----------+-----------+-----------")
-
- if filter == "" then
- core.log("action",
- string.format("%16s | %25s | %9d | %9d | %9d | %9d | %9d | %9d",
- "total",
- " ",
- mod_statistics.stats["total"].min_us,
- mod_statistics.stats["total"].max_us,
- mod_statistics.stats["total"].avg_us,
- mod_statistics.stats["total"].min_per,
- mod_statistics.stats["total"].max_per,
- mod_statistics.stats["total"].avg_per)
- )
- end
- core.log("action", " ")
-
- return true
-end
-
---------------------------------------------------------------------------------
-local function initialize_profiling()
- core.log("action", "Initialize tracing")
-
- mod_statistics.entity_callbacks = {}
-
- -- first register our own globalstep handler
- core.register_globalstep(mod_statistics.update_statistics)
-
- local rp_register_entity = core.register_entity
- core.register_entity = function(name, prototype)
- local modname = core.get_current_modname()
- local new_on_activate = nil
- local new_on_step = nil
- local new_on_punch = nil
- local new_rightclick = nil
- local new_get_staticdata = nil
-
- if prototype.on_activate ~= nil then
- local cbid = name .. "#oa"
- mod_statistics.entity_callbacks[cbid] = prototype.on_activate
- new_on_activate = function(self, staticdata, dtime_s)
- local starttime = core.get_us_time()
- mod_statistics.entity_callbacks[cbid](self, staticdata, dtime_s)
- local delta = core.get_us_time() -starttime
- mod_statistics.log_time(cbid, modname, delta)
- end
- end
-
- if prototype.on_step ~= nil then
- local cbid = name .. "#os"
- mod_statistics.entity_callbacks[cbid] = prototype.on_step
- new_on_step = function(self, dtime)
- local starttime = core.get_us_time()
- mod_statistics.entity_callbacks[cbid](self, dtime)
- local delta = core.get_us_time() -starttime
- mod_statistics.log_time(cbid, modname, delta)
- end
- end
-
- if prototype.on_punch ~= nil then
- local cbid = name .. "#op"
- mod_statistics.entity_callbacks[cbid] = prototype.on_punch
- new_on_punch = function(self, hitter)
- local starttime = core.get_us_time()
- mod_statistics.entity_callbacks[cbid](self, hitter)
- local delta = core.get_us_time() -starttime
- mod_statistics.log_time(cbid, modname, delta)
- end
- end
-
- if prototype.rightclick ~= nil then
- local cbid = name .. "#rc"
- mod_statistics.entity_callbacks[cbid] = prototype.rightclick
- new_rightclick = function(self, clicker)
- local starttime = core.get_us_time()
- mod_statistics.entity_callbacks[cbid](self, clicker)
- local delta = core.get_us_time() -starttime
- mod_statistics.log_time(cbid, modname, delta)
- end
- end
-
- if prototype.get_staticdata ~= nil then
- local cbid = name .. "#gs"
- mod_statistics.entity_callbacks[cbid] = prototype.get_staticdata
- new_get_staticdata = function(self)
- local starttime = core.get_us_time()
- local retval = mod_statistics.entity_callbacks[cbid](self)
- local delta = core.get_us_time() -starttime
- mod_statistics.log_time(cbid, modname, delta)
- return retval
- end
- end
-
- prototype.on_activate = new_on_activate
- prototype.on_step = new_on_step
- prototype.on_punch = new_on_punch
- prototype.rightclick = new_rightclick
- prototype.get_staticdata = new_get_staticdata
-
- rp_register_entity(name,prototype)
- end
-
- for i,v in ipairs(replacement_table) do
- local to_replace = core[v]
- core[v] = build_callback(v, to_replace)
- end
-
- local rp_register_abm = core.register_abm
- core.register_abm = function(spec)
-
- local modname = core.get_current_modname()
-
- local replacement_spec = {
- nodenames = spec.nodenames,
- neighbors = spec.neighbors,
- interval = spec.interval,
- chance = spec.chance,
- action = function(pos, node, active_object_count, active_object_count_wider)
- local starttime = core.get_us_time()
- spec.action(pos, node, active_object_count, active_object_count_wider)
- local delta = core.get_us_time() - starttime
- mod_statistics.log_time("abm", modname, delta)
- end
- }
- rp_register_abm(replacement_spec)
- end
-
- core.log("action", "Mod profiling initialized")
-end
-
-initialize_profiling()
diff --git a/builtin/game/privileges.lua b/builtin/game/privileges.lua
index bd5ead624..56e090f4c 100644
--- a/builtin/game/privileges.lua
+++ b/builtin/game/privileges.lua
@@ -26,18 +26,46 @@ function core.register_privilege(name, param)
end
core.register_privilege("interact", "Can interact with things and modify the world")
-core.register_privilege("teleport", "Can use /teleport command")
-core.register_privilege("bring", "Can teleport other players")
-core.register_privilege("settime", "Can use /time")
-core.register_privilege("privs", "Can modify privileges")
-core.register_privilege("basic_privs", "Can modify 'shout' and 'interact' privileges")
-core.register_privilege("server", "Can do server maintenance stuff")
-core.register_privilege("protection_bypass", "Can bypass node protection in the world")
core.register_privilege("shout", "Can speak in chat")
-core.register_privilege("ban", "Can ban and unban players")
-core.register_privilege("kick", "Can kick players")
-core.register_privilege("give", "Can use /give and /giveme")
-core.register_privilege("password", "Can use /setpassword and /clearpassword")
+core.register_privilege("basic_privs", "Can modify 'shout' and 'interact' privileges")
+core.register_privilege("privs", "Can modify privileges")
+
+core.register_privilege("teleport", {
+ description = "Can use /teleport command",
+ give_to_singleplayer = false,
+})
+core.register_privilege("bring", {
+ description = "Can teleport other players",
+ give_to_singleplayer = false,
+})
+core.register_privilege("settime", {
+ description = "Can use /time",
+ give_to_singleplayer = false,
+})
+core.register_privilege("server", {
+ description = "Can do server maintenance stuff",
+ give_to_singleplayer = false,
+})
+core.register_privilege("protection_bypass", {
+ description = "Can bypass node protection in the world",
+ give_to_singleplayer = false,
+})
+core.register_privilege("ban", {
+ description = "Can ban and unban players",
+ give_to_singleplayer = false,
+})
+core.register_privilege("kick", {
+ description = "Can kick players",
+ give_to_singleplayer = false,
+})
+core.register_privilege("give", {
+ description = "Can use /give and /giveme",
+ give_to_singleplayer = false,
+})
+core.register_privilege("password", {
+ description = "Can use /setpassword and /clearpassword",
+ give_to_singleplayer = false,
+})
core.register_privilege("fly", {
description = "Can fly using the free_move mode",
give_to_singleplayer = false,
@@ -50,5 +78,15 @@ core.register_privilege("noclip", {
description = "Can fly through walls",
give_to_singleplayer = false,
})
-core.register_privilege("rollback", "Can use the rollback functionality")
-
+core.register_privilege("rollback", {
+ description = "Can use the rollback functionality",
+ give_to_singleplayer = false,
+})
+core.register_privilege("zoom", {
+ description = "Can zoom the camera",
+ give_to_singleplayer = false,
+})
+core.register_privilege("debug", {
+ description = "Allows enabling various debug options that may affect gameplay",
+ give_to_singleplayer = false,
+})
diff --git a/builtin/game/register.lua b/builtin/game/register.lua
index f330491a2..90f095e9f 100644
--- a/builtin/game/register.lua
+++ b/builtin/game/register.lua
@@ -7,6 +7,9 @@
local register_item_raw = core.register_item_raw
core.register_item_raw = nil
+local unregister_item_raw = core.unregister_item_raw
+core.unregister_item_raw = nil
+
local register_alias_raw = core.register_alias_raw
core.register_alias_raw = nil
@@ -124,6 +127,11 @@ function core.register_item(name, itemdef)
fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
}
end
+ if itemdef.light_source and itemdef.light_source > core.LIGHT_MAX then
+ itemdef.light_source = core.LIGHT_MAX
+ core.log("warning", "Node 'light_source' value exceeds maximum," ..
+ " limiting to maximum: " ..name)
+ end
setmetatable(itemdef, {__index = core.nodedef_default})
core.registered_nodes[itemdef.name] = itemdef
elseif itemdef.type == "craft" then
@@ -172,6 +180,27 @@ function core.register_item(name, itemdef)
register_item_raw(itemdef)
end
+function core.unregister_item(name)
+ if not core.registered_items[name] then
+ core.log("warning", "Not unregistering item " ..name..
+ " because it doesn't exist.")
+ return
+ end
+ -- Erase from registered_* table
+ local type = core.registered_items[name].type
+ if type == "node" then
+ core.registered_nodes[name] = nil
+ elseif type == "craft" then
+ core.registered_craftitems[name] = nil
+ elseif type == "tool" then
+ core.registered_tools[name] = nil
+ end
+ core.registered_items[name] = nil
+
+
+ unregister_item_raw(name)
+end
+
function core.register_node(name, nodedef)
nodedef.type = "node"
core.register_item(name, nodedef)
@@ -242,6 +271,20 @@ function core.register_alias(name, convert_to)
end
end
+function core.register_alias_force(name, convert_to)
+ if forbidden_item_names[name] then
+ error("Unable to register alias: Name is forbidden: " .. name)
+ end
+ if core.registered_items[name] ~= nil then
+ core.unregister_item(name)
+ core.log("info", "Removed item " ..name..
+ " while attempting to force add an alias")
+ end
+ --core.log("Registering alias: " .. name .. " -> " .. convert_to)
+ core.registered_aliases[name] = convert_to
+ register_alias_raw(name, convert_to)
+end
+
function core.on_craft(itemstack, player, old_craft_list, craft_inv)
for _, func in ipairs(core.registered_on_crafts) do
itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack
diff --git a/builtin/game/voxelarea.lua b/builtin/game/voxelarea.lua
index 6d926c940..724761414 100644
--- a/builtin/game/voxelarea.lua
+++ b/builtin/game/voxelarea.lua
@@ -50,7 +50,7 @@ end
function VoxelArea:position(i)
local p = {}
local MinEdge = self.MinEdge
-
+
i = i - 1
p.z = math.floor(i / self.zstride) + MinEdge.z
@@ -84,23 +84,46 @@ end
function VoxelArea:iter(minx, miny, minz, maxx, maxy, maxz)
local i = self:index(minx, miny, minz) - 1
- local last = self:index(maxx, maxy, maxz)
- local ystride = self.ystride
- local zstride = self.zstride
- local yoff = (last+1) % ystride
- local zoff = (last+1) % zstride
- local ystridediff = (i - last) % ystride
- local zstridediff = (i - last) % zstride
+ local xrange = maxx - minx + 1
+ local nextaction = i + 1 + xrange
+
+ local y = 0
+ local yrange = maxy - miny + 1
+ local yreqstride = self.ystride - xrange
+
+ local z = 0
+ local zrange = maxz - minz + 1
+ local multistride = self.zstride - ((yrange - 1) * self.ystride + xrange)
+
return function()
+ -- continue i until it needs to jump
i = i + 1
- if i % zstride == zoff then
- i = i + zstridediff
- elseif i % ystride == yoff then
- i = i + ystridediff
+ if i ~= nextaction then
+ return i
end
- if i <= last then
+
+ -- continue y until maxy is exceeded
+ y = y + 1
+ if y ~= yrange then
+ -- set i to index(minx, miny + y, minz + z) - 1
+ i = i + yreqstride
+ nextaction = i + xrange
return i
end
+
+ -- continue z until maxz is exceeded
+ z = z + 1
+ if z == zrange then
+ -- cuboid finished, return nil
+ return
+ end
+
+ -- set i to index(minx, miny, minz + z) - 1
+ i = i + multistride
+
+ y = 0
+ nextaction = i + xrange
+ return i
end
end
diff --git a/builtin/mainmenu/common.lua b/builtin/mainmenu/common.lua
index 1fd89ff77..da3667828 100644
--- a/builtin/mainmenu/common.lua
+++ b/builtin/mainmenu/common.lua
@@ -248,14 +248,18 @@ end
--------------------------------------------------------------------------------
function is_server_protocol_compat(server_proto_min, server_proto_max)
- return min_supp_proto <= (server_proto_max or 24) and max_supp_proto >= (server_proto_min or 13)
+ 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.
+ return true
+ 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
- local s_p_min = server_proto_min or 13
- local s_p_max = server_proto_max or 24
+ local s_p_min = server_proto_min
+ local s_p_max = server_proto_max
if s_p_min ~= s_p_max then
server_prot_ver_info = fgettext_ne("Server supports protocol versions between $1 and $2. ",
diff --git a/builtin/mainmenu/dlg_config_world.lua b/builtin/mainmenu/dlg_config_world.lua
index eb0319ba0..7b3ab9852 100644
--- a/builtin/mainmenu/dlg_config_world.lua
+++ b/builtin/mainmenu/dlg_config_world.lua
@@ -16,6 +16,9 @@
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--------------------------------------------------------------------------------
+
+local enabled_all = false
+
local function modname_valid(name)
return not name:find("[^a-z0-9_]")
end
@@ -44,13 +47,18 @@ local function get_formspec(data)
if mod == nil then
mod = {name=""}
end
+
+ local hard_deps, soft_deps = modmgr.get_dependencies(mod.path)
retval = retval ..
"label[0,0.7;" .. fgettext("Mod:") .. "]" ..
"label[0.75,0.7;" .. mod.name .. "]" ..
- "label[0,1.25;" .. fgettext("Depends:") .. "]" ..
- "textlist[0,1.75;5,4.25;world_config_depends;" ..
- modmgr.get_dependencies(mod.path) .. ";0]" ..
+ "label[0,1.25;" .. fgettext("Dependencies:") .. "]" ..
+ "textlist[0,1.75;5,2.125;world_config_depends;" ..
+ hard_deps .. ";0]" ..
+ "label[0,3.875;" .. fgettext("Optional dependencies:") .. "]" ..
+ "textlist[0,4.375;5,1.8;world_config_optdepends;" ..
+ soft_deps .. ";0]" ..
"button[3.25,7;2.5,0.5;btn_config_world_save;" .. fgettext("Save") .. "]" ..
"button[5.75,7;2.5,0.5;btn_config_world_cancel;" .. fgettext("Cancel") .. "]"
@@ -80,11 +88,15 @@ local function get_formspec(data)
end
end
end
-
- retval = retval ..
- "button[8.75,0.125;2.5,0.5;btn_all_mods;" .. fgettext("Enable all") .. "]" ..
- "textlist[5.5,0.75;5.75,5.25;world_config_modlist;"
-
+ if enabled_all then
+ retval = retval ..
+ "button[8.75,0.125;2.5,0.5;btn_disable_all_mods;" .. fgettext("Disable all") .. "]" ..
+ "textlist[5.5,0.75;5.75,5.4;world_config_modlist;"
+ else
+ retval = retval ..
+ "button[8.75,0.125;2.5,0.5;btn_enable_all_mods;" .. fgettext("Enable all") .. "]" ..
+ "textlist[5.5,0.75;5.75,5.4;world_config_modlist;"
+ end
retval = retval .. modmgr.render_modlist(data.list)
retval = retval .. ";" .. data.selected_mod .."]"
@@ -229,15 +241,27 @@ local function handle_buttons(this, fields)
return true
end
- if fields["btn_all_mods"] then
+ if fields.btn_enable_all_mods then
local list = this.data.list:get_raw_list()
- for i=1,#list,1 do
- if list[i].typ ~= "game_mod" and
- not list[i].is_modpack then
+ for i = 1, #list do
+ if list[i].typ ~= "game_mod" and not list[i].is_modpack then
list[i].enabled = true
end
end
+ enabled_all = true
+ return true
+ end
+
+ if fields.btn_disable_all_mods then
+ local list = this.data.list:get_raw_list()
+
+ for i = 1, #list do
+ if list[i].typ ~= "game_mod" and not list[i].is_modpack then
+ list[i].enabled = false
+ end
+ end
+ enabled_all = false
return true
end
diff --git a/builtin/mainmenu/dlg_settings_advanced.lua b/builtin/mainmenu/dlg_settings_advanced.lua
index f5e80c252..b0d923768 100644
--- a/builtin/mainmenu/dlg_settings_advanced.lua
+++ b/builtin/mainmenu/dlg_settings_advanced.lua
@@ -479,13 +479,13 @@ local function handle_change_setting_buttons(this, fields)
return true
end
if setting.min and new_value < setting.min then
- this.data.error_message = fgettext_ne("The value must be greater than $1.", setting.min)
+ this.data.error_message = fgettext_ne("The value must be at least $1.", setting.min)
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())
return true
end
if setting.max and new_value > setting.max then
- this.data.error_message = fgettext_ne("The value must be lower than $1.", setting.max)
+ this.data.error_message = fgettext_ne("The value must not be larger than $1.", setting.max)
this.data.entered_text = fields["te_setting_value"]
core.update_formspec(this:get_formspec())
return true
@@ -659,102 +659,12 @@ function create_adv_settings_dlg()
return dlg
end
-local function create_minetest_conf_example()
- local result = "# This file contains a list of all available settings and their default value for minetest.conf\n" ..
- "\n" ..
- "# By default, all the settings are commented and not functional.\n" ..
- "# Uncomment settings by removing the preceding #.\n" ..
- "\n" ..
- "# minetest.conf is read by default from:\n" ..
- "# ../minetest.conf\n" ..
- "# ../../minetest.conf\n" ..
- "# Any other path can be chosen by passing the path as a parameter\n" ..
- "# to the program, eg. \"minetest.exe --config ../minetest.conf.example\".\n" ..
- "\n" ..
- "# Further documentation:\n" ..
- "# http://wiki.minetest.net/\n" ..
- "\n"
-
- local settings = parse_config_file(true, false)
- for _, entry in ipairs(settings) do
- if entry.type == "category" then
- if entry.level == 0 then
- result = result .. "#\n# " .. entry.name .. "\n#\n\n"
- else
- for i = 1, entry.level do
- result = result .. "#"
- end
- result = result .. "# " .. entry.name .. "\n\n"
- end
- else
- if entry.comment ~= "" then
- for _, comment_line in ipairs(entry.comment:split("\n", true)) do
- result = result .."# " .. comment_line .. "\n"
- end
- end
- result = result .. "# type: " .. entry.type
- if entry.min then
- result = result .. " min: " .. entry.min
- end
- if entry.max then
- result = result .. " max: " .. entry.max
- end
- if entry.values then
- result = result .. " values: " .. table.concat(entry.values, ", ")
- end
- if entry.possible then
- result = result .. " possible values: " .. entry.possible:gsub(",", ", ")
- end
- result = result .. "\n"
- local append = ""
- if entry.default ~= "" then
- append = " " .. entry.default
- end
- result = result .. "# " .. entry.name .. " =" .. append .. "\n\n"
- end
- end
- return result
-end
+-- Generate minetest.conf.example and settings_translation_file.cpp
-local function create_translation_file()
- local result = "// This file is automatically generated\n" ..
- "// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files\n" ..
- "// To update it, refer to the bottom of builtin/mainmenu/tab_settings.lua\n\n" ..
- "fake_function() {\n"
+-- *** Please note ***
+-- There is text in minetest.conf.example that will not be generated from
+-- settingtypes.txt but must be preserved:
+-- The documentation of mapgen noise parameter formats (title plus 16 lines)
+-- Noise parameter 'mgv5_np_ground' in group format (13 lines)
- local settings = parse_config_file(true, false)
- for _, entry in ipairs(settings) do
- if entry.type == "category" then
- local name_escaped = entry.name:gsub("\"", "\\\"")
- result = result .. "\tgettext(\"" .. name_escaped .. "\");\n"
- else
- if entry.readable_name then
- local readable_name_escaped = entry.readable_name:gsub("\"", "\\\"")
- result = result .. "\tgettext(\"" .. readable_name_escaped .. "\");\n"
- end
- if entry.comment ~= "" then
- local comment_escaped = entry.comment:gsub("\n", "\\n")
- comment_escaped = comment_escaped:gsub("\"", "\\\"")
- result = result .. "\tgettext(\"" .. comment_escaped .. "\");\n"
- end
- end
- end
- result = result .. "}\n"
- return result
-end
-
-if false then
- local file = io.open("minetest.conf.example", "w")
- if file then
- file:write(create_minetest_conf_example())
- file:close()
- end
-end
-
-if false then
- local file = io.open("src/settings_translation_file.cpp", "w")
- if file then
- file:write(create_translation_file())
- file:close()
- end
-end
+--assert(loadfile(core.get_mainmenu_path()..DIR_DELIM.."generate_from_settingtypes.lua"))(parse_config_file(true, false))
diff --git a/builtin/mainmenu/generate_from_settingtypes.lua b/builtin/mainmenu/generate_from_settingtypes.lua
new file mode 100644
index 000000000..6c9ba27fb
--- /dev/null
+++ b/builtin/mainmenu/generate_from_settingtypes.lua
@@ -0,0 +1,99 @@
+local settings = ...
+
+local concat = table.concat
+local insert = table.insert
+local sprintf = string.format
+local rep = string.rep
+
+local minetest_example_header = [[
+# This file contains a list of all available settings and their default value for minetest.conf
+
+# By default, all the settings are commented and not functional.
+# Uncomment settings by removing the preceding #.
+
+# minetest.conf is read by default from:
+# ../minetest.conf
+# ../../minetest.conf
+# Any other path can be chosen by passing the path as a parameter
+# to the program, eg. "minetest.exe --config ../minetest.conf.example".
+
+# Further documentation:
+# http://wiki.minetest.net/
+
+]]
+
+local function create_minetest_conf_example()
+ local result = { minetest_example_header }
+ for _, entry in ipairs(settings) do
+ if entry.type == "category" then
+ if entry.level == 0 then
+ insert(result, "#\n# " .. entry.name .. "\n#\n\n")
+ else
+ insert(result, rep("#", entry.level))
+ insert(result, "# " .. entry.name .. "\n\n")
+ end
+ else
+ if entry.comment ~= "" then
+ for _, comment_line in ipairs(entry.comment:split("\n", true)) do
+ insert(result, "# " .. comment_line .. "\n")
+ end
+ end
+ insert(result, "# type: " .. entry.type)
+ if entry.min then
+ insert(result, " min: " .. entry.min)
+ end
+ if entry.max then
+ insert(result, " max: " .. entry.max)
+ end
+ if entry.values then
+ insert(result, " values: " .. concat(entry.values, ", "))
+ end
+ if entry.possible then
+ insert(result, " possible values: " .. entry.possible:gsub(",", ", "))
+ end
+ insert(result, "\n")
+ local append
+ if entry.default ~= "" then
+ append = " " .. entry.default
+ end
+ insert(result, sprintf("# %s =%s\n\n", entry.name, append or ""))
+ end
+ end
+ return concat(result)
+end
+
+local translation_file_header = [[
+// This file is automatically generated
+// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files
+// To update it, refer to the bottom of builtin/mainmenu/dlg_settings_advanced.lua
+
+fake_function() {]]
+
+local function create_translation_file()
+ local result = { translation_file_header }
+ for _, entry in ipairs(settings) do
+ if entry.type == "category" then
+ insert(result, sprintf("\tgettext(%q);", entry.name))
+ else
+ if entry.readable_name then
+ insert(result, sprintf("\tgettext(%q);", entry.readable_name))
+ end
+ if entry.comment ~= "" then
+ local comment_escaped = entry.comment:gsub("\n", "\\n")
+ comment_escaped = comment_escaped:gsub("\"", "\\\"")
+ insert(result, "\tgettext(\"" .. comment_escaped .. "\");")
+ end
+ end
+ end
+ insert(result, "}\n")
+ return concat(result, "\n")
+end
+
+local file = assert(io.open("minetest.conf.example", "w"))
+file:write(create_minetest_conf_example())
+file:close()
+
+file = assert(io.open("src/settings_translation_file.cpp", "w"))
+file:write(create_translation_file())
+file:close()
+
diff --git a/builtin/mainmenu/modmgr.lua b/builtin/mainmenu/modmgr.lua
index f996df7ba..2b7b371bf 100644
--- a/builtin/mainmenu/modmgr.lua
+++ b/builtin/mainmenu/modmgr.lua
@@ -284,27 +284,33 @@ end
--------------------------------------------------------------------------------
function modmgr.get_dependencies(modfolder)
- local toadd = ""
+ local toadd_hard = ""
+ local toadd_soft = ""
if modfolder ~= nil then
local filename = modfolder ..
DIR_DELIM .. "depends.txt"
+ local hard_dependencies = {}
+ local soft_dependencies = {}
local dependencyfile = io.open(filename,"r")
-
if dependencyfile then
local dependency = dependencyfile:read("*l")
while dependency do
- if toadd ~= "" then
- toadd = toadd .. ","
+ dependency = dependency:gsub("\r", "")
+ if string.sub(dependency, -1, -1) == "?" then
+ table.insert(soft_dependencies, string.sub(dependency, 1, -2))
+ else
+ table.insert(hard_dependencies, dependency)
end
- toadd = toadd .. dependency
dependency = dependencyfile:read()
end
dependencyfile:close()
end
+ toadd_hard = table.concat(hard_dependencies, ",")
+ toadd_soft = table.concat(soft_dependencies, ",")
end
- return toadd
+ return toadd_hard, toadd_soft
end
--------------------------------------------------------------------------------
diff --git a/builtin/mainmenu/tab_credits.lua b/builtin/mainmenu/tab_credits.lua
index 4d2ffd7f4..c2ad19183 100644
--- a/builtin/mainmenu/tab_credits.lua
+++ b/builtin/mainmenu/tab_credits.lua
@@ -29,20 +29,23 @@ local core_developers = {
"Loic Blot (nerzhul/nrz) <loic.blot@unix-experience.fr>",
"Matt Gregory (paramat)",
"est31 <MTest31@outlook.com>",
- "Craig Robbins (Zeno)",
+ "Craig Robbins (Zeno) <craig.d.robbins@gmail.com>",
+ "Auke Kok (sofar) <sofar@foo-projects.org>",
+ "Andrew Ward (rubenwardy) <rubenwardy@gmail.com>",
}
local active_contributors = {
- "Auke Kok (sofar) <sofar@foo-projects.org>",
"Duane Robertson <duane@duanerobertson.com>",
"SmallJoker <mk939@ymail.com>",
- "Andrew Ward (rubenwardy) <rubenwardy@gmail.com>",
+ "Lars Hofhansl <larsh@apache.org>",
"Jeija <jeija@mesecons.net>",
"Gregory Currie (gregorycu)",
"Sokomine <wegwerf@anarres.dyndns.org>",
"TeTpaAka",
"Jean-Patrick G (kilbith) <jeanpatrick.guerrero@gmail.com>",
"Diego Martínez (kaeza) <kaeza@users.sf.net>",
+ "Dániel Juhász (juhdanad) <juhdanad@gmail.com>",
+ "Rogier <rogier777@gmail.com>",
}
local previous_core_developers = {
@@ -76,17 +79,13 @@ return {
caption = fgettext("Credits"),
cbf_formspec = function(tabview, name, tabdata)
local logofile = defaulttexturedir .. "logo.png"
+ local version = core.get_version()
return "image[0.5,1;" .. core.formspec_escape(logofile) .. "]" ..
- "label[0.5,3.2;Minetest " .. core.get_version() .. "]" ..
+ "label[0.5,3.2;" .. version.project .. " " .. version.string .. "]" ..
"label[0.5,3.5;http://minetest.net]" ..
"tablecolumns[color;text]" ..
"tableoptions[background=#00000000;highlight=#00000000;border=false]" ..
"table[3.5,-0.25;8.5,5.8;list_credits;" ..
- "#FFFF00," .. "Dedication of the current release" .. ",," ..
- "The 0.4.14 release is dedicated to the memory of" .. ",," ..
- "Minetest developer Maciej Kasatkin (RealBadAngel)" .. ",," ..
- "who died on March 24 2016." .. ",," ..
- "Our thoughts are with his family and friends." .. ",,," ..
"#FFFF00," .. fgettext("Core Developers") .. ",," ..
table.concat(core_developers, ",,") .. ",,," ..
"#FFFF00," .. fgettext("Active Contributors") .. ",," ..
diff --git a/builtin/mainmenu/tab_mods.lua b/builtin/mainmenu/tab_mods.lua
index 5b59aa110..4a5b6c041 100644
--- a/builtin/mainmenu/tab_mods.lua
+++ b/builtin/mainmenu/tab_mods.lua
@@ -98,12 +98,24 @@ local function get_formspec(tabview, name, tabdata)
.. fgettext("Uninstall selected modpack") .. "]"
else
--show dependencies
-
- retval = retval .. "," .. fgettext("Depends:") .. ","
-
- local toadd = modmgr.get_dependencies(selected_mod.path)
-
- retval = retval .. toadd .. ";0]"
+ local toadd_hard, toadd_soft = modmgr.get_dependencies(selected_mod.path)
+ if toadd_hard == "" and toadd_soft == "" then
+ retval = retval .. "," .. fgettext("No dependencies.")
+ else
+ if toadd_hard ~= "" then
+ retval = retval .. "," .. fgettext("Dependencies:") .. ","
+ retval = retval .. toadd_hard
+ end
+ if toadd_soft ~= "" then
+ if toadd_hard ~= "" then
+ retval = retval .. ","
+ end
+ retval = retval .. "," .. fgettext("Optional dependencies:") .. ","
+ retval = retval .. toadd_soft
+ end
+ end
+
+ retval = retval .. ";0]"
retval = retval .. "button[5.5,4.85;4.5,0.5;btn_mod_mgr_delete_mod;"
.. fgettext("Uninstall selected mod") .. "]"
diff --git a/builtin/mainmenu/tab_texturepacks.lua b/builtin/mainmenu/tab_texturepacks.lua
index a102fd61d..4638beaa1 100644
--- a/builtin/mainmenu/tab_texturepacks.lua
+++ b/builtin/mainmenu/tab_texturepacks.lua
@@ -73,7 +73,7 @@ local function get_formspec(tabview, name, tabdata)
if not file_exists(infofile) then
infofile = current_texture_path .. DIR_DELIM .. "info.txt"
if file_exists(infofile) then
- core.log("info.txt is depreciated. description.txt should be used instead.")
+ core.log("deprecated", "info.txt is deprecated. description.txt should be used instead.")
end
end
@@ -96,8 +96,8 @@ local function get_formspec(tabview, name, tabdata)
return retval ..
render_texture_pack_list(list) ..
";" .. index .. "]" ..
- "image[0.25,0.25;4.0,3.7;" .. core.formspec_escape(screenfile or no_screenshot) .. "]" ..
- "textarea[0.6,3.5;3.7,1.5;;" .. core.formspec_escape(infotext or "") .. ";]"
+ "image[0.25,0.25;4.05,2.7;" .. core.formspec_escape(screenfile or no_screenshot) .. "]" ..
+ "textarea[0.6,2.85;3.7,1.5;;" .. core.formspec_escape(infotext or "") .. ";]"
end
--------------------------------------------------------------------------------
diff --git a/builtin/profiler/init.lua b/builtin/profiler/init.lua
new file mode 100644
index 000000000..c1597d280
--- /dev/null
+++ b/builtin/profiler/init.lua
@@ -0,0 +1,72 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+local profiler_path = core.get_builtin_path()..DIR_DELIM.."profiler"..DIR_DELIM
+local profiler = {}
+local sampler = assert(loadfile(profiler_path .. "sampling.lua"))(profiler)
+local instrumentation = assert(loadfile(profiler_path .. "instrumentation.lua"))(profiler, sampler)
+local reporter = dofile(profiler_path .. "reporter.lua")
+profiler.instrument = instrumentation.instrument
+
+---
+-- Delayed registration of the /profiler chat command
+-- Is called later, after `core.register_chatcommand` was set up.
+--
+function profiler.init_chatcommand()
+ local instrument_profiler = core.setting_getbool("instrument.profiler") or false
+ if instrument_profiler then
+ instrumentation.init_chatcommand()
+ end
+
+ local param_usage = "print [filter] | dump [filter] | save [format [filter]] | reset"
+ core.register_chatcommand("profiler", {
+ description = "handle the profiler and profiling data",
+ params = param_usage,
+ privs = { server=true },
+ func = function(name, param)
+ local command, arg0 = string.match(param, "([^ ]+) ?(.*)")
+ local args = arg0 and string.split(arg0, " ")
+
+ if command == "dump" then
+ core.log("action", reporter.print(sampler.profile, arg0))
+ return true, "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"
+ 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
+ )
+ end
+ })
+
+ if not instrument_profiler then
+ instrumentation.init_chatcommand()
+ end
+end
+
+sampler.init()
+instrumentation.init()
+
+return profiler
diff --git a/builtin/profiler/instrumentation.lua b/builtin/profiler/instrumentation.lua
new file mode 100644
index 000000000..4311215b2
--- /dev/null
+++ b/builtin/profiler/instrumentation.lua
@@ -0,0 +1,232 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+local format, pairs, type = string.format, pairs, type
+local core, get_current_modname = core, core.get_current_modname
+local profiler, sampler = ...
+local instrument_builtin = core.setting_getbool("instrument.builtin") or false
+
+local register_functions = {
+ register_globalstep = 0,
+ register_playerevent = 0,
+ register_on_placenode = 0,
+ register_on_dignode = 0,
+ register_on_punchnode = 0,
+ register_on_generated = 0,
+ register_on_newplayer = 0,
+ register_on_dieplayer = 0,
+ register_on_respawnplayer = 0,
+ register_on_prejoinplayer = 0,
+ register_on_joinplayer = 0,
+ register_on_leaveplayer = 0,
+ register_on_cheat = 0,
+ register_on_chat_message = 0,
+ register_on_player_receive_fields = 0,
+ register_on_craft = 0,
+ register_craft_predict = 0,
+ register_on_protection_violation = 0,
+ register_on_item_eat = 0,
+ register_on_punchplayer = 0,
+ register_on_player_hpchange = 0,
+}
+
+---
+-- Create an unique instrument name.
+-- Generate a missing label with a running index number.
+--
+local counts = {}
+local function generate_name(def)
+ local class, label, func_name = def.class, def.label, def.func_name
+ if label then
+ if class or func_name then
+ return format("%s '%s' %s", class or "", label, func_name or ""):trim()
+ end
+ return format("%s", label):trim()
+ elseif label == false then
+ return format("%s", class or func_name):trim()
+ end
+
+ local index_id = def.mod .. (class or func_name)
+ local index = counts[index_id] or 1
+ counts[index_id] = index + 1
+ return format("%s[%d] %s", class or func_name, index, class and func_name or ""):trim()
+end
+
+---
+-- Keep `measure` and the closure in `instrument` lean, as these, and their
+-- directly called functions are the overhead that is caused by instrumentation.
+--
+local time, log = core.get_us_time, sampler.log
+local function measure(modname, instrument_name, start, ...)
+ log(modname, instrument_name, time() - start)
+ return ...
+end
+--- Automatically instrument a function to measure and log to the sampler.
+-- def = {
+-- mod = "",
+-- class = "",
+-- func_name = "",
+-- -- if nil, will create a label based on registration order
+-- label = "" | false,
+-- }
+local function instrument(def)
+ if not def or not def.func then
+ return
+ end
+ def.mod = def.mod or get_current_modname()
+ local modname = def.mod
+ local instrument_name = generate_name(def)
+ local func = def.func
+
+ if not instrument_builtin and modname == "*builtin*" then
+ return func
+ end
+
+ return function(...)
+ -- This tail-call allows passing all return values of `func`
+ -- 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(...))
+ end
+end
+
+local function can_be_called(func)
+ -- It has to be a function or callable table
+ return type(func) == "function" or
+ ((type(func) == "table" or type(func) == "userdata") and
+ getmetatable(func) and getmetatable(func).__call)
+end
+
+local function assert_can_be_called(func, func_name, level)
+ if not can_be_called(func) then
+ -- Then throw an *helpful* error, by pointing on our caller instead of us.
+ error(format("Invalid argument to %s. Expected function-like type instead of '%s'.", func_name, type(func)), level + 1)
+ end
+end
+
+---
+-- Wraps a registration function `func` in such a way,
+-- that it will automatically instrument any callback function passed as first argument.
+--
+local function instrument_register(func, func_name)
+ local register_name = func_name:gsub("^register_", "", 1)
+ return function(callback, ...)
+ assert_can_be_called(callback, func_name, 2)
+ register_functions[func_name] = register_functions[func_name] + 1
+ return func(instrument {
+ func = callback,
+ func_name = register_name
+ }), ...
+ end
+end
+
+local function init_chatcommand()
+ if core.setting_getbool("instrument.chatcommand") or true then
+ local orig_register_chatcommand = core.register_chatcommand
+ core.register_chatcommand = function(cmd, def)
+ def.func = instrument {
+ func = def.func,
+ label = "/" .. cmd,
+ }
+ orig_register_chatcommand(cmd, def)
+ end
+ end
+end
+
+---
+-- Start instrumenting selected functions
+--
+local function init()
+ local is_set = core.setting_getbool
+ if is_set("instrument.entity") or true then
+ -- Explicitly declare entity api-methods.
+ -- Simple iteration would ignore lookup via __index.
+ local entity_instrumentation = {
+ "on_activate",
+ "on_step",
+ "on_punch",
+ "rightclick",
+ "get_staticdata",
+ }
+ -- Wrap register_entity() to instrument them on registration.
+ local orig_register_entity = core.register_entity
+ core.register_entity = function(name, prototype)
+ local modname = get_current_modname()
+ for _, func_name in pairs(entity_instrumentation) do
+ prototype[func_name] = instrument {
+ func = prototype[func_name],
+ mod = modname,
+ func_name = func_name,
+ label = prototype.label,
+ }
+ end
+ orig_register_entity(name,prototype)
+ end
+ end
+
+ if is_set("instrument.abm") or true then
+ -- Wrap register_abm() to automatically instrument abms.
+ local orig_register_abm = core.register_abm
+ core.register_abm = function(spec)
+ spec.action = instrument {
+ func = spec.action,
+ class = "ABM",
+ label = spec.label,
+ }
+ orig_register_abm(spec)
+ end
+ end
+
+ if is_set("instrument.lbm") or true then
+ -- Wrap register_lbm() to automatically instrument lbms.
+ local orig_register_lbm = core.register_lbm
+ core.register_lbm = function(spec)
+ spec.action = instrument {
+ func = spec.action,
+ class = "LBM",
+ label = spec.label or spec.name,
+ }
+ orig_register_lbm(spec)
+ end
+ end
+
+ if is_set("instrument.global_callback") or true then
+ for func_name, _ in pairs(register_functions) do
+ core[func_name] = instrument_register(core[func_name], func_name)
+ end
+ end
+
+ if is_set("instrument.profiler") or false then
+ -- Measure overhead of instrumentation, but keep it down for functions
+ -- So keep the `return` for better optimization.
+ profiler.empty_instrument = instrument {
+ func = function() return end,
+ mod = "*profiler*",
+ class = "Instrumentation overhead",
+ label = false,
+ }
+ end
+end
+
+return {
+ register_functions = register_functions,
+ instrument = instrument,
+ init = init,
+ init_chatcommand = init_chatcommand,
+}
diff --git a/builtin/profiler/reporter.lua b/builtin/profiler/reporter.lua
new file mode 100644
index 000000000..5b38ed4df
--- /dev/null
+++ b/builtin/profiler/reporter.lua
@@ -0,0 +1,277 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+local DIR_DELIM, LINE_DELIM = DIR_DELIM, "\n"
+local table, unpack, string, pairs, io, os = table, unpack, string, pairs, io, os
+local rep, sprintf, tonumber = string.rep, string.format, tonumber
+local core, setting_get = core, core.setting_get
+local reporter = {}
+
+---
+-- Shorten a string. End on an ellipsis if shortened.
+--
+local function shorten(str, length)
+ if str and str:len() > length then
+ return "..." .. str:sub(-(length-3))
+ end
+ return str
+end
+
+local function filter_matches(filter, text)
+ return not filter or string.match(text, filter)
+end
+
+local function format_number(number, fmt)
+ number = tonumber(number)
+ if not number then
+ return "N/A"
+ end
+ return sprintf(fmt or "%d", number)
+end
+
+local Formatter = {
+ new = function(self, object)
+ object = object or {}
+ object.out = {} -- output buffer
+ self.__index = self
+ return setmetatable(object, self)
+ end,
+ __tostring = function (self)
+ return table.concat(self.out, LINE_DELIM)
+ end,
+ print = function(self, text, ...)
+ if (...) then
+ text = sprintf(text, ...)
+ end
+
+ if text then
+ -- Avoid format unicode issues.
+ text = text:gsub("Ms", "µs")
+ end
+
+ table.insert(self.out, text or LINE_DELIM)
+ end,
+ flush = function(self)
+ table.insert(self.out, LINE_DELIM)
+ local text = table.concat(self.out, LINE_DELIM)
+ self.out = {}
+ return text
+ end
+}
+
+local widths = { 55, 9, 9, 9, 5, 5, 5 }
+local txt_row_format = sprintf(" %%-%ds | %%%ds | %%%ds | %%%ds | %%%ds | %%%ds | %%%ds", unpack(widths))
+
+local HR = {}
+for i=1, #widths do
+ HR[i]= rep("-", widths[i])
+end
+-- ' | ' should break less with github than '-+-', when people are pasting there
+HR = sprintf("-%s-", table.concat(HR, " | "))
+
+local TxtFormatter = Formatter:new {
+ format_row = function(self, modname, instrument_name, statistics)
+ local label
+ if instrument_name then
+ label = shorten(instrument_name, widths[1] - 5)
+ label = sprintf(" - %s %s", label, rep(".", widths[1] - 5 - label:len()))
+ else -- Print mod_stats
+ label = shorten(modname, widths[1] - 2) .. ":"
+ end
+
+ self:print(txt_row_format, label,
+ format_number(statistics.time_min),
+ format_number(statistics.time_max),
+ format_number(statistics:get_time_avg()),
+ format_number(statistics.part_min, "%.1f"),
+ format_number(statistics.part_max, "%.1f"),
+ format_number(statistics:get_part_avg(), "%.1f")
+ )
+ 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)
+
+ if filter then
+ self:print("The output is limited to '%s'", filter)
+ end
+
+ self:print()
+ self:print(
+ txt_row_format,
+ "instrumentation", "min Ms", "max Ms", "avg Ms", "min %", "max %", "avg %"
+ )
+ self:print(HR)
+ for modname,mod_stats in pairs(profile.stats) do
+ if filter_matches(filter, modname) then
+ self:format_row(modname, nil, mod_stats)
+
+ if mod_stats.instruments ~= nil then
+ for instrument_name, instrument_stats in pairs(mod_stats.instruments) do
+ self:format_row(nil, instrument_name, instrument_stats)
+ end
+ end
+ end
+ end
+ self:print(HR)
+ if not filter then
+ self:format_row("total", nil, profile.stats_total)
+ end
+ end
+}
+
+local CsvFormatter = Formatter:new {
+ format_row = function(self, modname, instrument_name, statistics)
+ self:print(
+ "%q,%q,%d,%d,%d,%d,%d,%f,%f,%f",
+ modname, instrument_name,
+ statistics.samples,
+ statistics.time_min,
+ statistics.time_max,
+ statistics:get_time_avg(),
+ statistics.time_all,
+ statistics.part_min,
+ statistics.part_max,
+ statistics:get_part_avg()
+ )
+ end,
+ format = function(self, filter)
+ self:print(
+ "%q,%q,%q,%q,%q,%q,%q,%q,%q,%q",
+ "modname", "instrumentation",
+ "samples",
+ "time min µs",
+ "time max µs",
+ "time avg µs",
+ "time all µs",
+ "part min %",
+ "part max %",
+ "part avg %"
+ )
+ for modname, mod_stats in pairs(self.profile.stats) do
+ if filter_matches(filter, modname) then
+ self:format_row(modname, "*", mod_stats)
+
+ if mod_stats.instruments ~= nil then
+ for instrument_name, instrument_stats in pairs(mod_stats.instruments) do
+ self:format_row(modname, instrument_name, instrument_stats)
+ end
+ end
+ end
+ end
+ end
+}
+
+local function format_statistics(profile, format, filter)
+ local formatter
+ if format == "csv" then
+ formatter = CsvFormatter:new {
+ profile = profile
+ }
+ else
+ formatter = TxtFormatter:new {
+ profile = profile
+ }
+ end
+ formatter:format(filter)
+ return formatter:flush()
+end
+
+---
+-- Format the profile ready for display and
+-- @return string to be printed to the console
+--
+function reporter.print(profile, filter)
+ if filter == "" then filter = nil end
+ return format_statistics(profile, "txt", filter)
+end
+
+---
+-- Serialize the profile data and
+-- @return serialized data to be saved to a file
+--
+local function serialize_profile(profile, format, filter)
+ if format == "lua" or format == "json" or format == "json_pretty" then
+ local stats = filter and {} or profile.stats
+ if filter then
+ for modname, mod_stats in pairs(profile.stats) do
+ if filter_matches(filter, modname) then
+ stats[modname] = mod_stats
+ end
+ end
+ end
+ if format == "lua" then
+ return core.serialize(stats)
+ elseif format == "json" then
+ return core.write_json(stats)
+ elseif format == "json_pretty" then
+ return core.write_json(stats, true)
+ end
+ end
+ -- Fall back to textual formats.
+ return format_statistics(profile, format, filter)
+end
+
+local worldpath = core.get_worldpath()
+local function get_save_path(format, filter)
+ local report_path = setting_get("profiler.report_path") or ""
+ if report_path ~= "" then
+ core.mkdir(sprintf("%s%s%s", worldpath, DIR_DELIM, report_path))
+ end
+ return (sprintf(
+ "%s/%s/profile-%s%s.%s",
+ worldpath,
+ report_path,
+ os.date("%Y%m%dT%H%M%S"),
+ filter and ("-" .. filter) or "",
+ format
+ ):gsub("[/\\]+", DIR_DELIM))-- Clean up delims
+end
+
+---
+-- Save the profile to the world path.
+-- @return success, log message
+--
+function reporter.save(profile, format, filter)
+ if not format or format == "" then
+ format = setting_get("profiler.default_report_format") or "txt"
+ end
+ if filter == "" then
+ filter = nil
+ end
+
+ local path = get_save_path(format, filter)
+
+ local output, io_err = io.open(path, "w")
+ if not output then
+ return false, "Saving of profile failed with: " .. 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
+ end
+ output:write(content)
+ output:close()
+
+ local logmessage = "Profile saved to " .. path
+ core.log("action", logmessage)
+ return true, logmessage
+end
+
+return reporter
diff --git a/builtin/profiler/sampling.lua b/builtin/profiler/sampling.lua
new file mode 100644
index 000000000..1d1ef256d
--- /dev/null
+++ b/builtin/profiler/sampling.lua
@@ -0,0 +1,206 @@
+--Minetest
+--Copyright (C) 2016 T4im
+--
+--This program is free software; you can redistribute it and/or modify
+--it under the terms of the GNU Lesser General Public License as published by
+--the Free Software Foundation; either version 2.1 of the License, or
+--(at your option) any later version.
+--
+--This program is distributed in the hope that it will be useful,
+--but WITHOUT ANY WARRANTY; without even the implied warranty of
+--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+--GNU Lesser General Public License for more details.
+--
+--You should have received a copy of the GNU Lesser General Public License along
+--with this program; if not, write to the Free Software Foundation, Inc.,
+--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+local setmetatable = setmetatable
+local pairs, format = pairs, string.format
+local min, max, huge = math.min, math.max, math.huge
+local core = core
+
+local profiler = ...
+-- Split sampler and profile up, to possibly allow for rotation later.
+local sampler = {}
+local profile
+local stats_total
+local logged_time, logged_data
+
+local _stat_mt = {
+ get_time_avg = function(self)
+ return self.time_all/self.samples
+ end,
+ get_part_avg = function(self)
+ if not self.part_all then
+ return 100 -- Extra handling for "total"
+ end
+ return self.part_all/self.samples
+ end,
+}
+_stat_mt.__index = _stat_mt
+
+function sampler.reset()
+ -- Accumulated logged time since last sample.
+ -- This helps determining, the relative time a mod used up.
+ logged_time = 0
+ -- The measurements taken through instrumentation since last sample.
+ logged_data = {}
+
+ profile = {
+ -- Current mod statistics (max/min over the entire mod lifespan)
+ -- Mod specific instrumentation statistics are nested within.
+ stats = {},
+ -- Current stats over all mods.
+ stats_total = setmetatable({
+ samples = 0,
+ time_min = huge,
+ time_max = 0,
+ time_all = 0,
+ part_min = 100,
+ part_max = 100
+ }, _stat_mt)
+ }
+ stats_total = profile.stats_total
+
+ -- Provide access to the most recent profile.
+ sampler.profile = profile
+end
+
+---
+-- Log a measurement for the sampler to pick up later.
+-- Keep `log` and its often called functions lean.
+-- It will directly add to the instrumentation overhead.
+--
+function sampler.log(modname, instrument_name, time_diff)
+ if time_diff <= 0 then
+ if time_diff < 0 then
+ -- This **might** have happened on a semi-regular basis with huge mods,
+ -- resulting in negative statistics (perhaps midnight time jumps or ntp corrections?).
+ core.log("warning", format(
+ "Time travel of %s::%s by %dµs.",
+ modname, instrument_name, time_diff
+ ))
+ end
+ -- Throwing these away is better, than having them mess with the overall result.
+ return
+ end
+
+ local mod_data = logged_data[modname]
+ if mod_data == nil then
+ mod_data = {}
+ logged_data[modname] = mod_data
+ end
+
+ mod_data[instrument_name] = (mod_data[instrument_name] or 0) + time_diff
+ -- Update logged time since last sample.
+ logged_time = logged_time + time_diff
+end
+
+---
+-- Return a requested statistic.
+-- Initialize if necessary.
+--
+local function get_statistic(stats_table, name)
+ local statistic = stats_table[name]
+ if statistic == nil then
+ statistic = setmetatable({
+ samples = 0,
+ time_min = huge,
+ time_max = 0,
+ time_all = 0,
+ part_min = 100,
+ part_max = 0,
+ part_all = 0,
+ }, _stat_mt)
+ stats_table[name] = statistic
+ end
+ return statistic
+end
+
+---
+-- Update a statistic table
+--
+local function update_statistic(stats_table, time)
+ stats_table.samples = stats_table.samples + 1
+
+ -- Update absolute time (µs) spend by the subject
+ stats_table.time_min = min(stats_table.time_min, time)
+ stats_table.time_max = max(stats_table.time_max, time)
+ stats_table.time_all = stats_table.time_all + time
+
+ -- Update relative time (%) of this sample spend by the subject
+ local current_part = (time/logged_time) * 100
+ stats_table.part_min = min(stats_table.part_min, current_part)
+ stats_table.part_max = max(stats_table.part_max, current_part)
+ stats_table.part_all = stats_table.part_all + current_part
+end
+
+---
+-- Sample all logged measurements each server step.
+-- Like any globalstep function, this should not be too heavy,
+-- but does not add to the instrumentation overhead.
+--
+local function sample(dtime)
+ -- Rare, but happens and is currently of no informational value.
+ if logged_time == 0 then
+ return
+ end
+
+ for modname, instruments in pairs(logged_data) do
+ local mod_stats = get_statistic(profile.stats, modname)
+ if mod_stats.instruments == nil then
+ -- Current statistics for each instrumentation component
+ mod_stats.instruments = {}
+ end
+
+ local mod_time = 0
+ for instrument_name, time in pairs(instruments) do
+ if time > 0 then
+ mod_time = mod_time + time
+ local instrument_stats = get_statistic(mod_stats.instruments, instrument_name)
+
+ -- Update time of this sample spend by the instrumented function.
+ update_statistic(instrument_stats, time)
+ -- Reset logged data for the next sample.
+ instruments[instrument_name] = 0
+ end
+ end
+
+ -- Update time of this sample spend by this mod.
+ update_statistic(mod_stats, mod_time)
+ end
+
+ -- Update the total time spend over all mods.
+ stats_total.time_min = min(stats_total.time_min, logged_time)
+ stats_total.time_max = max(stats_total.time_max, logged_time)
+ stats_total.time_all = stats_total.time_all + logged_time
+
+ stats_total.samples = stats_total.samples + 1
+ logged_time = 0
+end
+
+---
+-- Setup empty profile and register the sampling function
+--
+function sampler.init()
+ sampler.reset()
+
+ if core.setting_getbool("instrument.profiler") then
+ core.register_globalstep(function()
+ if logged_time == 0 then
+ return
+ end
+ return profiler.empty_instrument()
+ end)
+ core.register_globalstep(profiler.instrument {
+ func = sample,
+ mod = "*profiler*",
+ class = "Sampler (update stats)",
+ label = false,
+ })
+ else
+ core.register_globalstep(sample)
+ end
+end
+
+return sampler
diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt
index ad269d8b0..1818b5a18 100644
--- a/builtin/settingtypes.txt
+++ b/builtin/settingtypes.txt
@@ -3,7 +3,7 @@
# General format:
# name (Readable name) type type_args
#
-# Note that the parts are seperated by exactly one space
+# Note that the parts are separated by exactly one space
#
# `type` can be:
# - int
@@ -70,7 +70,7 @@ fast_move (Fast movement) bool false
# This requires the "noclip" privilege on the server.
noclip (Noclip) bool false
-# Smooths camera when moving and looking around.
+# Smooths camera when looking around. Also called look or mouse smoothing.
# Useful for recording videos.
cinematic (Cinematic mode) bool false
@@ -104,6 +104,17 @@ random_input (Random input) bool false
# Continuous forward movement (only used for testing).
continuous_forward (Continuous forward) bool false
+# Enable Joysticks
+enable_joysticks (Enable Joysticks) bool false
+
+# 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
+
+# The sensitivity of the joystick axes for moving the
+# ingame view frustum around.
+joystick_frustum_sensitivity (Joystick frustum sensitivity) float 170
+
# Key for moving the player forward.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
keymap_forward (Forward key) key KEY_KEY_W
@@ -165,9 +176,13 @@ keymap_fastmove (Fast key) key KEY_KEY_J
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
keymap_noclip (Noclip key) key KEY_KEY_H
+# Key for toggling autorun.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+keymap_autorun (Autorun key) key
+
# Key for toggling cinematic mode.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
-keymap_cinematic (Cinematic mode key) key KEY_F8
+keymap_cinematic (Cinematic mode key) key
# Key for toggling display of minimap.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
@@ -193,7 +208,7 @@ keymap_toggle_chat (Chat toggle key) key KEY_F2
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
keymap_toggle_force_fog_off (Fog toggle key) key KEY_F3
-# Key for toggling the camrea update. Only used for development
+# Key for toggling the camera update. Only used for development
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
keymap_toggle_update_camera (Camera update toggle key) key
@@ -236,7 +251,7 @@ remote_port (Remote port) int 30000 1 65535
# Enable if you want to connect to 0.4.12 servers and before.
# Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.
# Disabling this option will protect your password better.
-send_pre_v25_init (Support older servers) bool true
+send_pre_v25_init (Support older servers) bool false
# Save the map received by the client on disk.
enable_local_map_saving (Saving map received from server) bool false
@@ -324,7 +339,7 @@ fsaa (FSAA) enum 0 0,1,2,4,8,16
[***Shaders]
-# Shaders allow advanced visul effects and may increase performance on some video cards.
+# Shaders allow advanced visual effects and may increase performance on some video cards.
# Thy only work with the OpenGL video backend.
enable_shaders (Shaders) bool true
@@ -403,8 +418,7 @@ fps_max (Maximum FPS) int 60
pause_fps_max (FPS in pause menu) int 20
# View distance in nodes.
-# Min = 20
-viewing_range (Viewing range) int 100
+viewing_range (Viewing range) int 100 20 4000
# Width component of the initial window size.
screenW (Screen width) int 800
@@ -424,6 +438,10 @@ vsync (V-Sync) bool false
# Field of view in degrees.
fov (Field of view) int 72 30 160
+# Field of view while zooming in degrees.
+# This requires the "zoom" privilege on the server.
+zoom_fov (Field of view for zoom) int 15 15 160
+
# Adjust the gamma encoding for the light tables. Lower numbers are brighter.
# This setting is for the client only and is ignored by the server.
display_gamma (Gamma) float 1.8 1.0 3.0
@@ -510,6 +528,9 @@ ambient_occlusion_gamma (Ambient occlusion gamma) float 2.2 0.25 4.0
# Enables animation of inventory items.
inventory_items_animations (Inventory items animations) bool false
+# Fraction of the visible distance at which fog starts to be rendered
+fog_start (Fog Start) float 0.4 0.0 0.99
+
[**Menus]
# Use a cloud animation for the main menu background.
@@ -530,7 +551,7 @@ gui_scaling_filter (GUI scaling filter) bool false
# When gui_scaling_filter_txr2img is true, copy those images
# from hardware to software for scaling. When false, fall back
# to the old scaling method, for video drivers that don't
-# propery support downloading textures back from hardware.
+# properly support downloading textures back from hardware.
gui_scaling_filter_txr2img (GUI scaling filter txr2img) bool true
# Delay showing tooltips, stated in milliseconds.
@@ -542,13 +563,13 @@ freetype (Freetype fonts) bool true
# Path to TrueTypeFont or bitmap.
font_path (Font path) path fonts/liberationsans.ttf
-font_size (Font size) int 15
+font_size (Font size) int 16
# Font shadow offset, if 0 then shadow will not be drawn.
font_shadow (Font shadow) int 1
# Font shadow alpha (opaqueness, between 0 and 255).
-font_shadow_alpha (Font shadow alpha) int 128 0 255
+font_shadow_alpha (Font shadow alpha) int 127 0 255
mono_font_path (Monospace font path) path fonts/liberationmono.ttf
@@ -615,6 +636,11 @@ server_announce (Announce server) bool false
# If you want to announce your ipv6 address, use serverlist_url = v6.servers.minetest.net.
serverlist_url (Serverlist URL) string servers.minetest.net
+# Disable escape sequences, e.g. chat coloring.
+# Use this if you want to run a server with pre-0.4.14 clients and you want to disable
+# the escape sequences generated by mods.
+disable_escape_sequences (Disable escape sequences) bool false
+
[*Network]
# Network port to listen (UDP).
@@ -642,15 +668,15 @@ ipv6_server (IPv6 server) bool false
[**Advanced]
-# How many blocks are flying in the wire simultaneously per client.
-max_simultaneous_block_sends_per_client (Maximum simultaneously blocks send per client) int 10
+# Maximum number of blocks that are simultaneously sent per client.
+max_simultaneous_block_sends_per_client (Maximum simultaneous block sends per client) int 10
-# How many blocks are flying in the wire simultaneously for the whole server.
-max_simultaneous_block_sends_server_total (Maximum simultaneously bocks send total) int 40
+# Maximum number of blocks that are simultaneously sent in total.
+max_simultaneous_block_sends_server_total (Maximum simultaneous block sends total) int 40
# To reduce lag, block transfers are slowed down when a player is building something.
# This determines how long they are slowed down after placing or removing a node.
-full_block_send_enable_min_time_from_building () float 2.0
+full_block_send_enable_min_time_from_building (Delay in sending blocks after building) float 2.0
# Maximum number of packets sent per send step, if you have a slow connection
# try reducing it, but don't reduce it to a number below double of targeted
@@ -750,6 +776,15 @@ time_speed (Time speed) int 72
# Interval of saving important changes in the world, stated in seconds.
server_map_save_interval (Map save interval) float 5.3
+# Set the maximum character length of a chat message sent by clients.
+# chat_message_max_size int 500
+
+# Limit a single player to send X messages per 10 seconds.
+# chat_message_limit_per_10sec float 10.0
+
+# Kick player if send more than X messages per 10 seconds.
+# chat_message_limit_trigger_kick int 50
+
[**Physics]
movement_acceleration_default (Default acceleration) float 3
@@ -774,15 +809,6 @@ movement_gravity (Gravity) float 9.81
# - error: abort on usage of deprecated call (suggested for mod developers).
deprecated_lua_api_handling (Deprecated Lua API handling) enum legacy legacy,log,error
-# Useful for mod developers.
-mod_profiling (Mod profiling) bool false
-
-# Detailed mod profile data. Useful for mod developers.
-detailed_profiling (Detailed mod profiling) bool false
-
-# Profiler data print interval. 0 = disable. Useful for developers.
-profiler_print_interval (Profiling print interval) int 0
-
# Number of extra blocks that can be loaded by /clearobjects at once.
# This is a trade-off between sqlite transaction overhead and
# memory consumption (4096=100MB, as a rule of thumb).
@@ -793,7 +819,7 @@ max_clearobjects_extra_loaded_blocks (Max. clearobjects extra blocks) int 4096
server_unload_unused_data_timeout (Unload unused server data) int 29
# Maximum number of statically stored objects in a block.
-max_objects_per_block (Maxmimum objects per block) int 49
+max_objects_per_block (Maximum objects per block) int 64
# See http://www.sqlite.org/pragma.html#pragma_synchronous
sqlite_synchronous (Synchronous SQLite) enum 2 0,1,2
@@ -825,11 +851,18 @@ liquid_queue_purge_time (Liquid queue purge time) int 0
# Liquid update interval in seconds.
liquid_update (Liquid update tick) float 1.0
+# At this distance the server will aggressively optimize which blocks are sent to clients.
+# Small values potentially improve performance a lot, at the expense of visible rendering glitches.
+# (some blocks will not be rendered under water and in caves, as well as sometimes on land)
+# Setting this to a value greater than max_block_send_distance disables this optimization.
+# Stated in mapblocks (16 nodes)
+block_send_optimize_distance (block send optimize distance) int 4 2
+
[*Mapgen]
# Name of map generator to be used when creating a new world.
# Creating a world in the main menu will override this.
-mg_name (Mapgen name) enum v6 v5,v6,v7,flat,valleys,fractal,singlenode
+mg_name (Mapgen name) enum v7 v5,v6,v7,flat,valleys,fractal,singlenode
# Water surface level of the world.
water_level (Water level) int 1
@@ -848,8 +881,6 @@ map_generation_limit (Map generation limit) int 31000 0 31000
# 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.
-# The default flags set in the engine are: caves, light, decorations
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
mg_flags (Mapgen flags) flags caves,dungeons,light,decorations caves,dungeons,light,decorations,nocaves,nodungeons,nolight,nodecorations
@@ -910,8 +941,6 @@ mgv5_np_cave2 (Mapgen v5 cave2 noise parameters) noise_params 0, 12, (50, 50, 50
# Map generation attributes specific to Mapgen v6.
# When snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.
-# The default flags set in the engine are: biomeblend, mudflow
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
mgv6_spflags (Mapgen v6 flags) flags jungles,biomeblend,mudflow,snowbiomes,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees
@@ -936,15 +965,27 @@ mgv6_np_apple_trees (Mapgen v6 apple trees noise parameters) noise_params 0, 1,
[***Mapgen v7]
# Map generation attributes specific to Mapgen v7.
-# The 'ridges' flag controls the rivers.
-# The default flags set in the engine are: mountains, ridges
-# The flags string modifies the engine defaults.
+# The 'ridges' flag enables the rivers.
+# Floatlands are currently experimental and subject to change.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
-mgv7_spflags (Mapgen v7 flags) flags mountains,ridges mountains,ridges,nomountains,noridges
+mgv7_spflags (Mapgen v7 flags) flags mountains,ridges mountains,ridges,floatlands,nomountains,noridges,nofloatlands
# Controls width of tunnels, a smaller value creates wider tunnels.
-mgv7_cave_width (Mapgen v7 cave width) float 0.3
+mgv7_cave_width (Mapgen v7 cave width) float 0.09
+
+# Controls the density of floatland mountain terrain.
+# Is an offset added to the 'np_mountain' noise value.
+mgv7_float_mount_density (Mapgen v7 floatland mountain density) float 0.6
+
+# Typical maximum height, above and below midpoint, of floatland mountain terrain.
+mgv7_float_mount_height (Mapgen v7 floatland mountain height) float 128.0
+
+# Y-level of floatland midpoint and lake surface.
+mgv7_floatland_level (Mapgen v7 floatland level) int 1280
+
+# Y-level to which floatland shadows extend.
+mgv7_shadow_limit (Mapgen v7 shadow limit) int 1024
mgv7_np_terrain_base (Mapgen v7 terrain base noise parameters) noise_params 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0
mgv7_np_terrain_alt (Mapgen v7 terrain altitude noise parameters) noise_params 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0
@@ -952,18 +993,18 @@ mgv7_np_terrain_persist (Mapgen v7 terrain persistation noise parameters) noise_
mgv7_np_height_select (Mapgen v7 height select noise parameters) noise_params -8, 16, (500, 500, 500), 4213, 6, 0.7, 2.0
mgv7_np_filler_depth (Mapgen v7 filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
mgv7_np_mount_height (Mapgen v7 mount height noise parameters) noise_params 256, 112, (1000, 1000, 1000), 72449, 3, 0.6, 2.0
-mgv7_np_ridge_uwater (Mapgen v7 ridge water noise parameters) noise_params 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0
+mgv7_np_ridge_uwater (Mapgen v7 river course noise parameters) noise_params 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0
+mgv7_np_floatland_base (Mapgen v7 floatland base terrain noise parameters) noise_params -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0
+mgv7_np_float_base_height (Mapgen v7 floatland base terrain height noise parameters) noise_params 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0
mgv7_np_mountain (Mapgen v7 mountain noise parameters) noise_params -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0
-mgv7_np_ridge (Mapgen v7 ridge noise parameters) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
-mgv7_np_cave1 (Mapgen v7 cave1 noise parameters) noise_params 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
-mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+mgv7_np_ridge (Mapgen v7 river channel wall noise parameters) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
+mgv7_np_cave1 (Mapgen v7 cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
[***Mapgen flat]
# Map generation attributes specific to Mapgen flat.
# Occasional lakes and hills can be added to the flat world.
-# The default flags set in the engine are: none
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
mgflat_spflags (Mapgen flat flags) flags lakes,hills,,nolakes,nohills
@@ -975,7 +1016,7 @@ mgflat_ground_level (Mapgen flat ground level) int 8
mgflat_large_cave_depth (Mapgen flat large cave depth) int -33
# Controls width of tunnels, a smaller value creates wider tunnels.
-mgflat_cave_width (Mapgen flat cave width) float 0.3
+mgflat_cave_width (Mapgen flat cave width) float 0.09
# Terrain noise threshold for lakes.
# Controls proportion of world area covered by lakes.
@@ -999,13 +1040,13 @@ mgflat_hill_steepness (Mapgen flat hill steepness) float 64.0
mgflat_np_terrain (Mapgen flat terrain noise parameters) noise_params 0, 1, (600, 600, 600), 7244, 5, 0.6, 2.0
mgflat_np_filler_depth (Mapgen flat filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
-mgflat_np_cave1 (Mapgen flat cave1 noise parameters) noise_params 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
-mgflat_np_cave2 (Mapgen flat cave2 noise parameters) noise_params 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+mgflat_np_cave1 (Mapgen flat cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgflat_np_cave2 (Mapgen flat cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
[***Mapgen fractal]
# Controls width of tunnels, a smaller value creates wider tunnels.
-mgfractal_cave_width (Mapgen fractal cave width) float 0.3
+mgfractal_cave_width (Mapgen fractal cave width) float 0.09
# Choice of 18 fractals from 9 formulas.
# 1 = 4D "Roundy" mandelbrot set.
@@ -1066,8 +1107,8 @@ mgfractal_julia_w (Mapgen fractal julia w) float 0.33
mgfractal_np_seabed (Mapgen fractal seabed noise parameters) noise_params -14, 9, (600, 600, 600), 41900, 5, 0.6, 2.0
mgfractal_np_filler_depth (Mapgen fractal filler depth noise parameters) noise_params 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
-mgfractal_np_cave1 (Mapgen fractal cave1 noise parameters) noise_params 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
-mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+mgfractal_np_cave1 (Mapgen fractal cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
# Mapgen Valleys parameters
[***Mapgen Valleys]
@@ -1079,8 +1120,6 @@ mgfractal_np_cave2 (Mapgen fractal cave2 noise parameters) noise_params 0, 12, (
# 'altitude_chill' makes higher elevations colder, which may cause biome issues.
# 'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,
# it may interfere with delicately adjusted biomes.
-# The default flags set in the engine are: altitude_chill, humid_rivers
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
mg_valleys_spflags (Valleys C Flags) flags altitude_chill,humid_rivers altitude_chill,noaltitude_chill,humid_rivers,nohumid_rivers
@@ -1109,16 +1148,16 @@ mgvalleys_river_size (River Size) int 5
mgvalleys_water_features (Water Features) int 0
# Controls width of tunnels, a smaller value creates wider tunnels.
-mgvalleys_cave_width (Cave width) float 0.3
+mgvalleys_cave_width (Cave width) float 0.09
# Noise parameters
[****Noises]
# Caves and tunnels form at the intersection of the two noises
-mgvalleys_np_cave1 (Cave noise #1) noise_params 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
+mgvalleys_np_cave1 (Cave noise #1) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
# Caves and tunnels form at the intersection of the two noises
-mgvalleys_np_cave2 (Cave noise #2) noise_params 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+mgvalleys_np_cave2 (Cave noise #2) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
# The depth of dirt or other filler
mgvalleys_np_filler_depth (Filler Depth) noise_params 0, 1.2, (256, 256, 256), 1605, 3, 0.5, 2.0
@@ -1153,10 +1192,55 @@ secure.enable_security (Enable mod security) bool false
# functions even when mod security is on (via request_insecure_environment()).
secure.trusted_mods (Trusted mods) string
-# Comma-seperated list of mods that are allowed to access HTTP APIs, which
+# Comma-separated list of mods that are allowed to access HTTP APIs, which
# allow them to upload and download data to/from the internet.
secure.http_mods (HTTP Mods) string
+[*Advanced]
+
+[**Profiling]
+# Load the game profiler to collect game profiling data.
+# Provides a /profiler command to access the compiled profile.
+# Useful for mod developers and server operators.
+profiler.load (Load the game profiler) bool false
+
+# The default format in which profiles are being saved,
+# when calling `/profiler save [format]` without format.
+profiler.default_report_format (Default report format) enum txt txt,csv,lua,json,json_pretty
+
+# The file path relative to your worldpath in which profiles will be saved to.
+#
+profiler.report_path (Report path) string ""
+
+[***Instrumentation]
+
+# Instrument the methods of entities on registration.
+instrument.entity (Entity methods) bool true
+
+# Instrument the action function of Active Block Modifiers on registration.
+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 global callback functions on registration.
+# (anything you pass to a minetest.register_*() function)
+instrument.global_callback (Global callbacks) bool true
+
+[****Advanced]
+# Instrument builtin.
+# This is usually only needed by core/builtin contributors
+instrument.builtin (Builtin) bool false
+
+# Have the profiler instrument itself:
+# * Instrument an empty function.
+# This estimates the overhead, that instrumentation is adding (+1 function call).
+# * Instrument the sampler being used to update the statistics.
+instrument.profiler (Profiler) bool false
+
[Client and Server]
# Name of the player.
@@ -1166,7 +1250,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 ,be,cs,da,de,eo,es,et,fr,hu,id,it,ja,jbo,ko,ky,lt,nb,nl,pl,pt,pt_BR,ro,ru,tr,uk,zh_CN,zh_TW
+language (Language) enum ,be,ca,cs,da,de,en,eo,es,et,fr,he,hu,id,it,ja,jbo,ko,ky,lt,nb,nl,pl,pt,pt_BR,ro,ru,sr_Cyrl,tr,uk,zh_CN,zh_TW
# Level of logging to be written to debug.txt:
# - <nothing> (no logging)
@@ -1212,3 +1296,6 @@ modstore_download_url (Modstore download URL) string https://forum.minetest.net/
modstore_listmods_url (Modstore mods list URL) string https://forum.minetest.net/mmdb/mods/
modstore_details_url (Modstore details URL) string https://forum.minetest.net/mmdb/mod/*/
+
+# Print the engine's profiling data in regular intervals (in seconds). 0 = disable. Useful for developers.
+profiler_print_interval (Engine profiling data print interval) int 0
diff --git a/client/shaders/minimap_shader/opengl_vertex.glsl b/client/shaders/minimap_shader/opengl_vertex.glsl
index 06df5a3cf..88f9356d5 100644
--- a/client/shaders/minimap_shader/opengl_vertex.glsl
+++ b/client/shaders/minimap_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
uniform mat4 mWorld;
void main(void)
diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl
index 6862842a7..71ded2b9d 100644
--- a/client/shaders/nodes_shader/opengl_fragment.glsl
+++ b/client/shaders/nodes_shader/opengl_fragment.glsl
@@ -19,6 +19,8 @@ bool normalTexturePresent = false;
const float e = 2.718281828459;
const float BS = 10.0;
+const float fogStart = FOG_START;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
#ifdef ENABLE_TONE_MAPPING
@@ -194,24 +196,25 @@ void main(void)
vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0);
-#if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT
- float alpha = gl_Color.a;
- if (fogDistance != 0.0) {
- float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
- alpha = mix(alpha, 0.0, d);
- }
- col = vec4(col.rgb, alpha);
-#else
+#ifdef ENABLE_TONE_MAPPING
+ col = applyToneMapping(col);
+#endif
+
if (fogDistance != 0.0) {
- float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
- col = mix(col, skyBgColor, d);
+ // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+ // the fog will only be rendered correctly if the last operation before the
+ // clamp() is an addition. Else, the clamp() seems to be ignored.
+ // E.g. the following won't work:
+ // float clarity = clamp(fogShadingParameter
+ // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+ // As additions usually come for free following a multiplication, the new formula
+ // should be more efficient as well.
+ // Note: clarity = (1 - fogginess)
+ float clarity = clamp(fogShadingParameter
+ - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+ col = mix(skyBgColor, col, clarity);
}
col = vec4(col.rgb, base.a);
-#endif
-#ifdef ENABLE_TONE_MAPPING
- gl_FragColor = applyToneMapping(col);
-#else
gl_FragColor = col;
-#endif
}
diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl
index 28c5f197e..44c48cc4c 100644
--- a/client/shaders/nodes_shader/opengl_vertex.glsl
+++ b/client/shaders/nodes_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
uniform mat4 mWorld;
uniform float dayNightRatio;
diff --git a/client/shaders/water_surface_shader/opengl_fragment.glsl b/client/shaders/water_surface_shader/opengl_fragment.glsl
index 1fa669541..c4e78470d 100644
--- a/client/shaders/water_surface_shader/opengl_fragment.glsl
+++ b/client/shaders/water_surface_shader/opengl_fragment.glsl
@@ -21,6 +21,8 @@ bool texSeamless = false;
const float e = 2.718281828459;
const float BS = 10.0;
+const float fogStart = FOG_START;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
#ifdef ENABLE_TONE_MAPPING
@@ -150,24 +152,25 @@ vec4 base = texture2D(baseTexture, uv).rgba;
vec4 col = vec4(color.rgb * gl_Color.rgb, 1.0);
-#if MATERIAL_TYPE == TILE_MATERIAL_LIQUID_TRANSPARENT || MATERIAL_TYPE == TILE_MATERIAL_LIQUID_OPAQUE
- float alpha = gl_Color.a;
- if (fogDistance != 0.0) {
- float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
- alpha = mix(alpha, 0.0, d);
- }
- col = vec4(col.rgb, alpha);
-#else
+#ifdef ENABLE_TONE_MAPPING
+ col = applyToneMapping(col);
+#endif
+
if (fogDistance != 0.0) {
- float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
- col = mix(col, skyBgColor, d);
+ // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+ // the fog will only be rendered correctly if the last operation before the
+ // clamp() is an addition. Else, the clamp() seems to be ignored.
+ // E.g. the following won't work:
+ // float clarity = clamp(fogShadingParameter
+ // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+ // As additions usually come for free following a multiplication, the new formula
+ // should be more efficient as well.
+ // Note: clarity = (1 - fogginess)
+ float clarity = clamp(fogShadingParameter
+ - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+ col = mix(skyBgColor, col, clarity);
}
col = vec4(col.rgb, base.a);
-#endif
-#ifdef ENABLE_TONE_MAPPING
- gl_FragColor = applyToneMapping(col);
-#else
gl_FragColor = col;
-#endif
}
diff --git a/client/shaders/water_surface_shader/opengl_vertex.glsl b/client/shaders/water_surface_shader/opengl_vertex.glsl
index 9b461f4c1..a930e7b8f 100644
--- a/client/shaders/water_surface_shader/opengl_vertex.glsl
+++ b/client/shaders/water_surface_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
uniform mat4 mWorld;
uniform float dayNightRatio;
diff --git a/client/shaders/wielded_shader/opengl_fragment.glsl b/client/shaders/wielded_shader/opengl_fragment.glsl
index 75dd1b674..ba7a8f12d 100644
--- a/client/shaders/wielded_shader/opengl_fragment.glsl
+++ b/client/shaders/wielded_shader/opengl_fragment.glsl
@@ -19,6 +19,8 @@ bool texSeamless = false;
const float e = 2.718281828459;
const float BS = 10.0;
+const float fogStart = FOG_START;
+const float fogShadingParameter = 1 / ( 1 - fogStart);
void get_texture_flags()
{
@@ -107,8 +109,18 @@ void main(void)
vec4 col = vec4(color.rgb, base.a);
col *= gl_Color;
if (fogDistance != 0.0) {
- float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
- col = mix(col, skyBgColor, d);
+ // Due to a bug in some (older ?) graphics stacks (possibly in the glsl compiler ?),
+ // the fog will only be rendered correctly if the last operation before the
+ // clamp() is an addition. Else, the clamp() seems to be ignored.
+ // E.g. the following won't work:
+ // float clarity = clamp(fogShadingParameter
+ // * (fogDistance - length(eyeVec)) / fogDistance), 0.0, 1.0);
+ // As additions usually come for free following a multiplication, the new formula
+ // should be more efficient as well.
+ // Note: clarity = (1 - fogginess)
+ float clarity = clamp(fogShadingParameter
+ - fogShadingParameter * length(eyeVec) / fogDistance, 0.0, 1.0);
+ col = mix(skyBgColor, col, clarity);
}
gl_FragColor = vec4(col.rgb, base.a);
}
diff --git a/client/shaders/wielded_shader/opengl_vertex.glsl b/client/shaders/wielded_shader/opengl_vertex.glsl
index c33b0a7d3..86c626896 100644
--- a/client/shaders/wielded_shader/opengl_vertex.glsl
+++ b/client/shaders/wielded_shader/opengl_vertex.glsl
@@ -1,6 +1,4 @@
uniform mat4 mWorldViewProj;
-uniform mat4 mInvWorld;
-uniform mat4 mTransWorld;
uniform mat4 mWorld;
uniform float dayNightRatio;
diff --git a/cmake/Modules/FindJson.cmake b/cmake/Modules/FindJson.cmake
index 1558b0fcf..e69d6c4c0 100644
--- a/cmake/Modules/FindJson.cmake
+++ b/cmake/Modules/FindJson.cmake
@@ -20,8 +20,8 @@ endif()
if(NOT JSONCPP_FOUND)
message(STATUS "Using bundled JSONCPP library.")
- set(JSON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/json)
+ set(JSON_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/jsoncpp)
set(JSON_LIBRARY jsoncpp)
- add_subdirectory(json)
+ add_subdirectory(jsoncpp/json)
endif()
diff --git a/cmake/Modules/FindNcursesw.cmake b/cmake/Modules/FindNcursesw.cmake
index b8c7f78f2..e572c704a 100644
--- a/cmake/Modules/FindNcursesw.cmake
+++ b/cmake/Modules/FindNcursesw.cmake
@@ -115,7 +115,7 @@ if(CURSES_USE_NCURSESW)
get_filename_component(_cursesParentDir "${_cursesLibDir}" PATH)
find_path(CURSES_INCLUDE_PATH
- NAMES ncursesw/ncurses.h ncursesw/curses.h
+ NAMES ncursesw/ncurses.h ncursesw/curses.h ncurses.h curses.h
HINTS "${_cursesParentDir}/include"
)
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 593e0c438..34c64b8df 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Modding API Reference 0.4.14
+Minetest Lua Modding API Reference 0.4.15
=========================================
* More information at <http://www.minetest.net/>
* Developer Wiki: <http://dev.minetest.net/>
@@ -65,15 +65,19 @@ e.g.
The game directory can contain the file minetest.conf, which will be used
to set default settings when running the particular game.
It can also contain a settingtypes.txt in the same format as the one in builtin.
-This settingtypes.txt will be parsed by the menu and the settings will be displayed in the "Games" category in the settings tab.
+This settingtypes.txt will be parsed by the menu and the settings will be displayed
+in the "Games" category in the settings tab.
### Menu images
-Games can provide custom main menu images. They are put inside a `menu` directory inside the game directory.
+Games can provide custom main menu images. They are put inside a `menu` directory
+inside the game directory.
-The images are named `$identifier.png`, where `$identifier` is one of `overlay,background,footer,header`.
-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.
+The images are named `$identifier.png`, where `$identifier` is
+one of `overlay,background,footer,header`.
+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.
Mod load path
@@ -153,7 +157,8 @@ to a single modname. Their meaning is that if the specified mod
is missing, that does not prevent this mod from being loaded.
### `screenshot.png`
-A screenshot shown in modmanager within mainmenu.
+A screenshot shown in the mod manager within the main menu. It should
+have an aspect ratio of 3:2 and a minimum size of 300×200 pixels.
### `description.txt`
A File containing description to be shown within mainmenu.
@@ -203,11 +208,17 @@ when registering it.
The `:` prefix can also be used for maintaining backwards compatibility.
### Aliases
-Aliases can be added by using `minetest.register_alias(name, convert_to)`.
+Aliases can be added by using `minetest.register_alias(name, convert_to)` or
+`minetest.register_alias_force(name, convert_to).
This will make Minetest to convert things called name to things called
`convert_to`.
+The only difference between `minetest.register_alias` and
+`minetest.register_alias_force` is that if an item called `name` exists,
+`minetest.register_alias` will do nothing while
+`minetest.register_alias_force` will unregister it.
+
This can be used for maintaining backwards compatibility.
This can be also used for setting quick access names for things, e.g. if
@@ -243,7 +254,8 @@ Example:
default_dirt.png^default_grass_side.png
`default_grass_side.png` is overlayed over `default_dirt.png`.
-The texture with the lower resolution will be automatically upscaled to the higher resolution texture.
+The texture with the lower resolution will be automatically upscaled to
+the higher resolution texture.
### Texture grouping
Textures can be grouped together by enclosing them in `(` and `)`.
@@ -251,7 +263,17 @@ Textures can be grouped together by enclosing them in `(` and `)`.
Example: `cobble.png^(thing1.png^thing2.png)`
A texture for `thing1.png^thing2.png` is created and the resulting
-texture is overlaid over `cobble.png`.
+texture is overlaid on top of `cobble.png`.
+
+### Escaping
+Modifiers that accept texture names (e.g. `[combine`) accept escaping to allow
+passing complex texture names as arguments. Escaping is done with backslash and
+is required for `^` and `:`.
+
+Example: `cobble.png^[lowpart:50:color.png\^[mask\:trans.png`
+
+The lower 50 percent of `color.png^[mask:trans.png` are overlaid
+on top of `cobble.png`.
### Advanced texture modifiers
@@ -286,6 +308,25 @@ Example:
default_sandstone.png^[resize:16x16
+#### `[opacity:<r>`
+ Makes the base image transparent according to the given ratio.
+ r must be between 0 and 255.
+ 0 means totally transparent.
+ 255 means totally opaque.
+
+Example:
+
+ default_sandstone.png^[opacity:127
+
+#### `[invert:<mode>`
+Inverts the given channels of the base image.
+Mode may contain the characters "r", "g", "b", "a".
+Only the channels that are mentioned in the mode string will be inverted.
+
+Example:
+
+ default_apple.png^[invert:rgb
+
#### `[brighten`
Brightens the texture.
@@ -329,7 +370,7 @@ Example:
default_stone.png^[transformFXR90
#### `[inventorycube{<top>{<left>{<right>`
-`^` is replaced by `&` in texture names.
+Escaping does not apply here and `^` is replaced by `&` in texture names instead.
Create an inventory cube texture using the side textures.
@@ -400,18 +441,24 @@ from the available ones of the following files:
Examples of sound parameter tables:
- -- Play location-less on all clients
+ -- Play locationless on all clients
{
gain = 1.0, -- default
}
- -- Play location-less to a player
+ -- Play locationless to one player
+ {
+ to_player = name,
+ gain = 1.0, -- default
+ }
+ -- Play locationless to one player, looped
{
to_player = name,
gain = 1.0, -- default
+ loop = true,
}
-- Play in a location
{
- pos = {x=1,y=2,z=3},
+ pos = {x = 1, y = 2, z = 3},
gain = 1.0, -- default
max_hear_distance = 32, -- default, uses an euclidean metric
}
@@ -420,15 +467,18 @@ Examples of sound parameter tables:
object = <an ObjectRef>,
gain = 1.0, -- default
max_hear_distance = 32, -- default, uses an euclidean metric
- loop = true, -- only sounds connected to objects can be looped
+ loop = true,
}
+Looped sounds must either be connected to an object or played locationless to
+one player using `to_player = name,`
+
### `SimpleSoundSpec`
* e.g. `""`
* e.g. `"default_place_node"`
* e.g. `{}`
-* e.g. `{name="default_place_node"}`
-* e.g. `{name="default_place_node", gain=1.0}`
+* e.g. `{name = "default_place_node"}`
+* e.g. `{name = "default_place_node", gain = 1.0}`
Registered definitions of stuff
-------------------------------
@@ -448,6 +498,11 @@ the global `minetest.registered_*` tables.
* `minetest.register_craftitem(name, item definition)`
* added to `minetest.registered_items[name]`
+* `minetest.unregister_item(name)`
+ * Unregisters the item name from engine, and deletes the entry with key
+ * `name` from `minetest.registered_items` and from the associated item
+ * table according to its nature: minetest.registered_nodes[] etc
+
* `minetest.register_biome(biome definition)`
* returns an integer uniquely identifying the registered biome
* added to `minetest.registered_biome` with the key of `biome.name`
@@ -468,8 +523,8 @@ the global `minetest.registered_*` tables.
* added to `minetest.registered_schematic` with the key of `schematic.name`
* if `schematic.name` is nil, the key is the returned ID
* if the schematic is loaded from a file, schematic.name is set to the filename
- * if the function is called when loading the mod, and schematic.name is a relative path,
- * then the current mod path will be prepended to the schematic filename
+ * if the function is called when loading the mod, and schematic.name is a relative
+ path, then the current mod path will be prepended to the schematic filename
* `minetest.clear_registered_biomes()`
* clears all biomes currently registered
@@ -562,6 +617,22 @@ node definition:
^ The rotation of this node is stored in param2. Plants are rotated this way.
Values range 0 - 179. The value stored in param2 is multiplied by two to
get the actual rotation of the node.
+ paramtype2 == "meshoptions"
+ ^ Only valid for "plantlike". The value of param2 becomes a bitfield which can
+ be used to change how the client draws plantlike nodes. Bits 0, 1 and 2 form
+ a mesh selector. Currently the following meshes are choosable:
+ 0 = a "x" shaped plant (ordinary plant)
+ 1 = a "+" shaped plant (just rotated 45 degrees)
+ 2 = a "*" shaped plant with 3 faces instead of 2
+ 3 = a "#" shaped plant with 4 faces instead of 2
+ 4 = a "#" shaped plant with 4 faces that lean outwards
+ 5-7 are unused and reserved for future meshes.
+ Bits 3 through 7 are optional flags that can be combined and give these
+ effects:
+ bit 3 (0x08) - Makes the plant slightly vary placement horizontally
+ bit 4 (0x10) - Makes the plant mesh 1.4x larger
+ bit 5 (0x20) - Moves each face randomly a small bit down (1/8 max)
+ bits 6-7 are reserved for future use.
collision_box = {
type = "fixed",
fixed = {
@@ -1407,6 +1478,15 @@ examples.
* `fixed_size`: `true`/`false` (optional)
* deprecated: `invsize[<W>,<H>;]`
+#### `container[<X>,<Y>]`
+* Start of a container block, moves all physical elements in the container by (X, Y)
+* Must have matching container_end
+* Containers can be nested, in which case the offsets are added
+ (child containers are relative to parent containers)
+
+#### `container_end[]`
+* End of a container, following elements are no longer relative to this container
+
#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
* Show an inventory list
@@ -1416,13 +1496,13 @@ examples.
#### `listring[<inventory location>;<list name>]`
* Allows to create a ring of inventory lists
* Shift-clicking on items in one element of the ring
-* will send them to the next inventory list inside the ring
+ will send them to the next inventory list inside the ring
* The first occurrence of an element inside the ring will
-* determine the inventory where items will be sent to
+ determine the inventory where items will be sent to
#### `listring[]`
* Shorthand for doing `listring[<inventory location>;<list name>]`
-* for the last two inventory lists added by list[...]
+ for the last two inventory lists added by list[...]
#### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
* Sets background color of slots as `ColorString`
@@ -1473,18 +1553,23 @@ examples.
#### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
* Textual password style field; will be sent to server when a button is clicked
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+ of this field.
* `x` and `y` position the field relative to the top left of the menu
* `w` and `h` are the size of the field
-* fields are a set height, but will be vertically centred on `h`
+* Fields are a set height, but will be vertically centred on `h`
* Position and size units are inventory slots
* `name` is the name of the field as returned in fields to `on_receive_fields`
* `label`, if not blank, will be text printed on the top left above the field
+* See field_close_on_enter to stop enter closing the formspec
#### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
* Textual field; will be sent to server when a button is clicked
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+ of this field.
* `x` and `y` position the field relative to the top left of the menu
* `w` and `h` are the size of the field
-* fields are a set height, but will be vertically centred on `h`
+* Fields are a set height, but will be vertically centred on `h`
* Position and size units are inventory slots
* `name` is the name of the field as returned in fields to `on_receive_fields`
* `label`, if not blank, will be text printed on the top left above the field
@@ -1492,15 +1577,24 @@ examples.
* `default` may contain variable references such as `${text}'` which
will fill the value from the metadata value `text`
* **Note**: no extra text or more than a single variable is supported ATM.
+* See field_close_on_enter to stop enter closing the formspec
#### `field[<name>;<label>;<default>]`
-* as above, but without position/size units
-* special field for creating simple forms, such as sign text input
-* must be used without a `size[]` element
-* a "Proceed" button will be added automatically
+* As above, but without position/size units
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+ of this field.
+* Special field for creating simple forms, such as sign text input
+* Must be used without a `size[]` element
+* A "Proceed" button will be added automatically
+* See field_close_on_enter to stop enter closing the formspec
+
+#### `field_close_on_enter[<name>;<close_on_enter>]`
+* <name> is the name of the field
+* if <close_on_enter> is false, pressing enter in the field will submit the form but not close it
+* defaults to true when not specified (ie: no tag for a field)
#### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
-* same as fields above, but with multi-line input
+* Same as fields above, but with multi-line input
#### `label[<X>,<Y>;<label>]`
* `x` and `y` work as per field
@@ -1561,12 +1655,12 @@ examples.
* `name` fieldname sent to server on doubleclick value is current selected element
* `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
* if you want a listelement to start with "#" write "##"
-* index to be selected within textlist
+* Index to be selected within textlist
* `true`/`false`: draw transparent background
-* see also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`)
+* See also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`)
#### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
-* show a tab**header** at specific position (ignores formsize)
+* Show a tab**header** at specific position (ignores formsize)
* `x` and `y` position the itemlist relative to the top left of the menu
* `name` fieldname data is transferred to Lua
* `caption 1`...: name shown on top of tab
@@ -1575,54 +1669,53 @@ examples.
* `draw_border` (optional): draw border
#### `box[<X>,<Y>;<W>,<H>;<color>]`
-* simple colored semitransparent box
+* Simple colored semitransparent box
* `x` and `y` position the box relative to the top left of the menu
* `w` and `h` are the size of box
* `color` is color specified as a `ColorString`
#### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
-* show a dropdown field
+* Show a dropdown field
* **Important note**: There are two different operation modes:
1. handle directly on change (only changed dropdown is submitted)
2. read the value on pressing a button (all dropdown values are available)
* `x` and `y` position of dropdown
-* width of dropdown
-* fieldname data is transferred to Lua
-* items to be shown in dropdown
-* index of currently selected dropdown item
+* Width of dropdown
+* Fieldname data is transferred to Lua
+* Items to be shown in dropdown
+* Index of currently selected dropdown item
-#### `checkbox[<X>,<Y>;<name>;<label>;<selected>;<tooltip>]`
-* show a checkbox
+#### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
+* Show a checkbox
* `x` and `y`: position of checkbox
* `name` fieldname data is transferred to Lua
* `label` to be shown left of checkbox
* `selected` (optional): `true`/`false`
-* `tooltip` (optional)
#### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
-* show a scrollbar
-* there are two ways to use it:
+* Show a scrollbar
+* There are two ways to use it:
1. handle the changed event (only changed scrollbar is available)
2. read the value on pressing a button (all scrollbars are available)
* `x` and `y`: position of trackbar
* `w` and `h`: width and height
* `orientation`: `vertical`/`horizontal`
-* fieldname data is transferred to Lua
-* value this trackbar is set to (`0`-`1000`)
-* see also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`)
+* Fieldname data is transferred to Lua
+* Value this trackbar is set to (`0`-`1000`)
+* See also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`)
#### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
-* show scrollable table using options defined by the previous `tableoptions[]`
-* displays cells as defined by the previous `tablecolumns[]`
+* Show scrollable table using options defined by the previous `tableoptions[]`
+* Displays cells as defined by the previous `tablecolumns[]`
* `x` and `y`: position the itemlist relative to the top left of the menu
* `w` and `h` are the size of the itemlist
* `name`: fieldname sent to server on row select or doubleclick
* `cell 1`...`cell n`: cell contents given in row-major order
* `selected idx`: index of row to be selected within table (first row = `1`)
-* see also `minetest.explode_table_event` (main menu: `engine.explode_table_event`)
+* See also `minetest.explode_table_event` (main menu: `engine.explode_table_event`)
#### `tableoptions[<opt 1>;<opt 2>;...]`
-* sets options for `table[]`
+* Sets options for `table[]`
* `color=#RRGGBB`
* default text color (`ColorString`), defaults to `#FFFFFF`
* `background=#RRGGBB`
@@ -1638,14 +1731,14 @@ examples.
* only useful when there is a column of type "tree"
#### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
-* sets columns for `table[]`
-* types: `text`, `image`, `color`, `indent`, `tree`
+* Sets columns for `table[]`
+* Types: `text`, `image`, `color`, `indent`, `tree`
* `text`: show cell contents as text
* `image`: cell contents are an image index, use column options to define images
* `color`: cell contents are a ColorString and define color of following cell
* `indent`: cell contents are a number and define indentation of following cell
* `tree`: same as indent, but user can open and close subtrees (treeview-like)
-* column options:
+* Column options:
* `align=<value>`
* for `text` and `image`: content alignment within cells.
Available values: `left` (default), `center`, `right`, `inline`
@@ -1675,6 +1768,13 @@ Inventory locations
* `"nodemeta:<X>,<Y>,<Z>"`: Any node metadata
* `"detached:<name>"`: A detached inventory
+Player Inventory lists
+----------------------
+* `main`: list containing the default inventory
+* `craft`: list containing the craft input
+* `craftpreview`: list containing the craft output
+* `hand`: list containing an override for the empty hand
+
`ColorString`
-------------
`#RGB` defines a color in hexadecimal format.
@@ -1701,6 +1801,24 @@ numerical form, the raw integer value of an ARGB8 quad:
or string form, a ColorString (defined above):
`colorspec = "green"`
+Escape sequences
+----------------
+Most text can contain escape sequences, that can for example color the text.
+There are a few exceptions: tab headers, dropdowns and vertical labels can't.
+The following functions provide escape sequences:
+* `core.get_color_escape_sequence(color)`:
+ * `color` is a ColorString
+ * The escape sequence sets the text color to `color`
+* `core.colorize(color, message)`:
+ * Equivalent to:
+ `core.get_color_escape_sequence(color) ..
+ message ..
+ core.get_color_escape_sequence("#ffffff")`
+* `color.get_background_escape_sequence(color)`
+ * `color` is a ColorString
+ * The escape sequence sets the background of the whole text element to
+ `color`. Only defined for item descriptions and tooltips.
+
Spatial Vectors
---------------
* `vector.new(a[, b, c])`: returns a vector:
@@ -1710,7 +1828,8 @@ Spatial Vectors
* `vector.distance(p1, p2)`: returns a number
* `vector.length(v)`: returns a number
* `vector.normalize(v)`: returns a vector
-* `vector.round(v)`: returns a vector, each dimension rounded to floor
+* `vector.floor(v)`: returns a vector, each dimension rounded down
+* `vector.round(v)`: returns a vector, each dimension rounded to nearest int
* `vector.apply(v, func)`: returns a vector
* `vector.equals(v1, v2)`: returns a boolean
@@ -1805,6 +1924,17 @@ Helper functions
* nil: return all entries,
* true: return only subdirectory names, or
* false: return only file names.
+* `minetest.get_version()`: returns a table containing components of the
+ engine version. Components:
+ * `project`: Name of the project, eg, "Minetest"
+ * `string`: Simple version, eg, "1.2.3-dev"
+ * `hash`: Full git version (only set if available), eg, "1.2.3-dev-01234567-dirty"
+ Use this for informational purposes only. The information in the returned
+ table does not represent the capabilities of the engine, nor is it
+ reliable or verifyable. Compatible forks will have a different name and
+ version entirely. To check for the presence of engine features, test
+ whether the functions exported by the wanted features exist. For example:
+ `if core.nodeupdate then ... end`.
### Logging
* `minetest.debug(...)`
@@ -1822,16 +1952,27 @@ Call these functions only at load time!
* `minetest.register_node(name, node definition)`
* `minetest.register_tool(name, item definition)`
* `minetest.register_craftitem(name, item definition)`
+* `minetest.unregister_item(name)`
* `minetest.register_alias(name, convert_to)`
+* `minetest.register_alias_force(name, convert_to)`
* `minetest.register_craft(recipe)`
+ * Check recipe table syntax for different types below.
+* `minetest.clear_craft(recipe)`
+ * Will erase existing craft based either on output item or on input recipe.
+ * Specify either output or input only. If you specify both, input will be ignored. For input use the same recipe table
+ syntax as for `minetest.register_craft(recipe)`. For output specify only the item, without a quantity.
+ * If no erase candidate could be found, Lua exception will be thrown.
+ * Warning! The type field ("shaped","cooking" or any other) will be ignored if the recipe
+ contains output. Erasing is then done independently from the crafting method.
* `minetest.register_ore(ore definition)`
+* `minetest.register_biome(biome definition)`
* `minetest.register_decoration(decoration definition)`
* `minetest.override_item(name, redefinition)`
* Overrides fields of an item registered with register_node/tool/craftitem.
* Note: Item must already be defined, (opt)depend on the mod defining it.
* Example: `minetest.override_item("default:mese", {light_source=LIGHT_MAX})`
-
* `minetest.clear_registered_ores()`
+* `minetest.clear_registered_biomes()`
* `minetest.clear_registered_decorations()`
### Global callback registration functions
@@ -1889,8 +2030,9 @@ Call these functions only at load time!
* If it returns a string, the player is disconnected with that string as reason
* `minetest.register_on_joinplayer(func(ObjectRef))`
* Called when a player joins the game
-* `minetest.register_on_leaveplayer(func(ObjectRef))`
+* `minetest.register_on_leaveplayer(func(ObjectRef, timed_out))`
* Called when a player leaves the game
+ * `timed_out`: True for timeout, false for other reasons.
* `minetest.register_on_cheat(func(ObjectRef, cheat))`
* Called when a player cheats
* `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of:
@@ -1930,7 +2072,8 @@ Call these functions only at load time!
* `minetest.register_chatcommand(cmd, chatcommand definition)`
* `minetest.register_privilege(name, definition)`
* `definition`: `"description text"`
- * `definition`: `{ description = "description text", give_to_singleplayer = boolean, -- default: true }`
+ * `definition`: `{ description = "description text", give_to_singleplayer = boolean}`
+ the default of `give_to_singleplayer` is true
* To allow players with basic_privs to grant, see basic_privs minetest.conf setting.
* `minetest.register_authentication_handler(handler)`
* See `minetest.builtin_auth_handler` in `builtin.lua` for reference
@@ -1951,12 +2094,21 @@ Call these functions only at load time!
* `minetest.notify_authentication_modified(name)`
* Should be called by the authentication handler if privileges changes.
* To report everybody, set `name=nil`.
+* `minetest.check_password_entry(name, entry, password)`
+ * Returns true if the "db entry" for a player with name matches given
+ * password, false otherwise.
+ * The "db entry" is the usually player-individual value that is derived
+ * from the player's chosen password and stored on the server in order to allow
+ * authentication whenever the player desires to log in.
+ * Only use this function for making it possible to log in via the password from
+ * via protocols like IRC, other uses for inside the game are frowned upon.
* `minetest.get_password_hash(name, raw_password)`
* Convert a name-password pair to a password hash that Minetest can use.
* The returned value alone is not a good basis for password checks based
* on comparing the password hash in the database with the password hash
* from the function, with an externally provided password, as the hash
* in the db might use the new SRP verifier format.
+ * For this purpose, use minetest.check_password_entry instead.
* `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
* `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
* Convert between two privilege representations
@@ -1982,7 +2134,7 @@ and `minetest.auth_reload` call the authetification handler.
* `minetest.set_node(pos, node)`
* `minetest.add_node(pos, node): alias set_node(pos, node)`
* Set node at position (`node = {name="foo", param1=0, param2=0}`)
-* `minetest.swap_node(pos, node`
+* `minetest.swap_node(pos, node)`
* Set node at position, but don't remove metadata
* `minetest.remove_node(pos)`
* Equivalent to `set_node(pos, "air")`
@@ -2055,7 +2207,9 @@ and `minetest.auth_reload` call the authetification handler.
given biome_name string.
* `minetest.get_mapgen_params()` Returns mapgen parameters, a table containing
`mgname`, `seed`, `chunksize`, `water_level`, and `flags`.
+ * Deprecated: use minetest.get_mapgen_setting(name) instead
* `minetest.set_mapgen_params(MapgenParams)`
+ * Deprecated: use minetest.set_mapgen_setting(name, value, override) instead
* Set map generation parameters
* Function cannot be called after the registration period; only initialization
and `on_mapgen_init`
@@ -2065,6 +2219,24 @@ and `minetest.auth_reload` call the authetification handler.
* `flags` contains a comma-delimited string of flags to set,
or if the prefix `"no"` is attached, clears instead.
* `flags` is in the same format and has the same options as `mg_flags` in `minetest.conf`
+* `minetest.get_mapgen_setting(name)`
+ * Gets the *active* mapgen setting (or nil if none exists) in string format with the following
+ order of precedence:
+ 1) Settings loaded from map_meta.txt or overrides set during mod execution
+ 2) Settings set by mods without a metafile override
+ 3) Settings explicitly set in the user config file, minetest.conf
+ 4) Settings set as the user config default
+* `minetest.get_mapgen_setting_noiseparams(name)`
+ * Same as above, but returns the value as a NoiseParams table if the setting `name` exists
+ and is a valid NoiseParams
+* `minetest.set_mapgen_setting(name, value, [override_meta])`
+ * Sets a mapgen param to `value`, and will take effect if the corresponding mapgen setting
+ is not already present in map_meta.txt.
+ * `override_meta` is an optional boolean (default: `false`). If this is set to true,
+ the setting will become the active setting regardless of the map metafile contents.
+ * Note: to set the seed, use "seed", not "fixed_map_seed"
+* `minetest.set_mapgen_setting_noiseparams(name, value, [override_meta])`
+ * Same as above, except value is a NoiseParams table.
* `minetest.set_noiseparams(name, noiseparams, set_default)`
* Sets the noiseparams setting of `name` to the noiseparams table specified in `noiseparams`.
* `set_default` is an optional boolean (default: `true`) that specifies whether the setting
@@ -2130,6 +2302,15 @@ and `minetest.auth_reload` call the authetification handler.
* increase level of leveled node by level, default `level` equals `1`
* if `totallevel > maxlevel`, returns rest (`total-max`)
* can be negative for decreasing
+* `core.check_single_for_falling(pos)`
+ * causes an unsupported `group:falling_node` node to fall and causes an
+ unattached `group:attached_node` node to fall.
+ * does not spread these updates to neighbours.
+* `core.check_for_falling(pos)`
+ * causes an unsupported `group:falling_node` node to fall and causes an
+ unattached `group:attached_node` node to fall.
+ * spread these updates to neighbours and can cause a cascade
+ of nodes to fall.
### Inventory
`minetest.get_inventory(location)`: returns an `InvRef`
@@ -2138,8 +2319,11 @@ and `minetest.auth_reload` call the authetification handler.
* `{type="player", name="celeron55"}`
* `{type="node", pos={x=, y=, z=}}`
* `{type="detached", name="creative"}`
-* `minetest.create_detached_inventory(name, callbacks)`: returns an `InvRef`
+* `minetest.create_detached_inventory(name, callbacks, [player_name])`: returns an `InvRef`
* callbacks: See "Detached inventory callbacks"
+ * player_name: Make detached inventory available to one player exclusively,
+ by default they will be sent to every player (even if not used).
+ Note that this parameter is mostly just a workaround and will be removed in future releases.
* Creates a detached inventory. If it already exists, it is cleared.
* `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`:
returns left over ItemStack
@@ -2151,6 +2335,13 @@ and `minetest.auth_reload` call the authetification handler.
* `formname`: name passed to `on_player_receive_fields` callbacks.
It should follow the `"modname:<whatever>"` naming convention
* `formspec`: formspec to display
+* `minetest.close_formspec(playername, formname)`
+ * `playername`: name of player to close formspec
+ * `formname`: has to exactly match the one given in show_formspec, or the formspec will
+ not close.
+ * calling show_formspec(playername, formname, "") is equal to this expression
+ * to close a formspec regardless of the formname, call
+ minetest.close_formspec(playername, ""). USE THIS ONLY WHEN ABSOLUTELY NECESSARY!
* `minetest.formspec_escape(string)`: returns a string
* escapes the characters "[", "]", "\", "," and ";", which can not be used in formspecs
* `minetest.explode_table_event(string)`: returns a table
@@ -2287,6 +2478,7 @@ These functions return the leftover itemstack.
* `minetest.request_shutdown([message],[reconnect])`: request for server shutdown. Will display `message` to clients,
and `reconnect` == true displays a reconnect button.
* `minetest.get_server_status()`: returns server status string
+* `minetest.get_server_uptime()`: returns the server uptime in seconds
### Bans
* `minetest.get_ban_list()`: returns the ban list (same as `minetest.get_ban_description("")`)
@@ -2378,12 +2570,16 @@ These functions return the leftover itemstack.
* callback: `function(HTTPRequestResult res)`
* Use this HTTP function if you are unsure, the others are for advanced use.
* `HTTPApiTable.fetch_async(HTTPRequest req)`: returns handle
- * Performs given request asynchronously and returns handle for `minetest.http_fetch_async_get`
+ * Performs given request asynchronously and returns handle for `HTTPApiTable.fetch_async_get`
* `HTTPApiTable.fetch_async_get(handle)`: returns HTTPRequestResult
* Return response data for given asynchronous HTTP request
### Misc.
* `minetest.get_connected_players()`: returns list of `ObjectRefs`
+* `minetest.hud_replace_builtin(name, hud_definition)`
+ * Replaces definition of a builtin hud element
+ * `name`: `"breath"` or `"health"`
+ * `hud_definition`: definition to replace builtin definition
* `minetest.hash_node_position({x=,y=,z=})`: returns an 48-bit integer
* Gives a unique hash number for a node position (16+16+16=48bit)
* `minetest.get_position_from_hash(hash)`: returns a position
@@ -2438,6 +2634,10 @@ These functions return the leftover itemstack.
* See documentation on `minetest.compress()` for supported compression methods.
* currently supported.
* `...` indicates method-specific arguments. Currently, no methods use this.
+* `minetest.encode_base64(string)`: returns string encoded in base64
+ * Encodes a string in base64.
+* `minetest.decode_base64(string)`: returns string
+ * Decodes a string encoded in base64.
* `minetest.is_protected(pos, name)`: returns boolean
* Returns true, if player `name` shouldn't be abled to dig at `pos` or do other
actions, defineable by mods, due to some mod-defined ownership-like concept.
@@ -2478,13 +2678,17 @@ These functions return the leftover itemstack.
the creative mode setting, and checks for "sneak" to set the `invert_wall`
parameter.
-* `minetest.forceload_block(pos)`
+* `minetest.forceload_block(pos[, transient])`
* forceloads the position `pos`.
* returns `true` if area could be forceloaded
- * Please note that forceloaded areas are saved when the server restarts.
+ * If `transient` is `false` or absent, the forceload will be persistent
+ (saved between server runs). If `true`, the forceload will be transient
+ (not saved between server runs).
-* `minetest.forceload_free_block(pos)`
+* `minetest.forceload_free_block(pos[, transient])`
* stops forceloading the position `pos`
+ * If `transient` is `false` or absent, frees a persistent forceload.
+ If `true`, frees a transient forceload.
* `minetest.request_insecure_environment()`: returns an environment containing
insecure functions if the calling mod has been listed as trusted in the
@@ -2542,6 +2746,7 @@ Can be gotten via `minetest.get_meta(pos)`.
* `get_inventory()`: returns `InvRef`
* `to_table()`: returns `nil` or `{fields = {...}, inventory = {list1 = {}, ...}}`
* `from_table(nil or {})`
+ * to clear metadata, use from_table(nil)
* See "Node Metadata"
### `NodeTimerRef`
@@ -2638,12 +2843,23 @@ This is basically a reference to a C++ `ServerActiveObject`
##### Player-only (no-op for other objects)
* `get_player_name()`: returns `""` if is not a player
-* `get_player_velocity()`: returns `nil` if is not a player otherwise a table {x, y, z} representing the player's instantaneous velocity in nodes/s
+* `get_player_velocity()`: returns `nil` if is not a player, otherwise a
+ table {x, y, z} representing the player's instantaneous velocity in nodes/s
* `get_look_dir()`: get camera direction as a unit vector
-* `get_look_pitch()`: pitch in radians
-* `get_look_yaw()`: yaw in radians (wraps around pretty randomly as of now)
-* `set_look_pitch(radians)`: sets look pitch
-* `set_look_yaw(radians)`: sets look yaw
+* `get_look_vertical()`: pitch in radians
+ * Angle ranges between -pi/2 and pi/2, which are straight up and down respectively.
+* `get_look_horizontal()`: yaw in radians
+ * Angle is counter-clockwise from the +z direction.
+* `set_look_vertical(radians)`: sets look pitch
+ * radians - Angle from looking forward, where positive is downwards.
+* `set_look_horizontal(radians)`: sets look yaw
+ * radians - Angle from the +z direction, where positive is counter-clockwise.
+* `get_look_pitch()`: pitch in radians - Deprecated as broken. Use get_look_vertical.
+ * Angle ranges between -pi/2 and pi/2, which are straight down and up respectively.
+* `get_look_yaw()`: yaw in radians - Deprecated as broken. Use get_look_horizontal.
+ * Angle is counter-clockwise from the +x direction.
+* `set_look_pitch(radians)`: sets look pitch - Deprecated. Use set_look_vertical.
+* `set_look_yaw(radians)`: sets look yaw - Deprecated. Use set_look_horizontal.
* `get_breath()`: returns players breath
* `set_breath(value)`: sets players breath
* values:
@@ -2689,10 +2905,6 @@ This is basically a reference to a C++ `ServerActiveObject`
* `hud_set_hotbar_selected_image(texturename)`
* sets image for selected item of hotbar
* `hud_get_hotbar_selected_image`: returns texturename
-* `hud_replace_builtin(name, hud_definition)`
- * replace definition of a builtin hud element
- * `name`: `"breath"` or `"health"`
- * `hud_definition`: definition to replace builtin definition
* `set_sky(bgcolor, type, {texture names})`
* `bgcolor`: ColorSpec, defaults to white
* Available types:
@@ -2752,25 +2964,41 @@ An `InvRef` is a reference to an inventory.
A fast access data structure to store areas, and find areas near a given position or area.
Every area has a `data` string attribute to store additional information.
You can create an empty `AreaStore` by calling `AreaStore()`, or `AreaStore(type_name)`.
-If you chose the parameter-less constructor, a fast implementation will be automatically chosen for you.
+If you chose the parameter-less constructor, a fast implementation will be automatically
+chosen for you.
#### Methods
-* `get_area(id, include_borders, include_data)`: returns the area with the id `id`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
-* `get_areas_for_pos(pos, include_borders, include_data)`: returns all areas that contain the position `pos`. (optional) Boolean values `include_borders` and `include_data` control what's copied.
-* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`: returns all areas that contain all nodes inside the area specified by `edge1` and `edge2` (inclusive). If `accept_overlap` is true, also areas are returned that have nodes in common with the specified area. (optional) Boolean values `include_borders` and `include_data` control what's copied.
-* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store. Returns the new area's ID, or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area. `data` is a string stored with the area. If passed, `id` will be used as the internal area ID, it must be a unique number between 0 and 2^32-2. If you use the `id` parameter you must always use it, or insertions are likely to fail due to conflicts.
-* `reserve(count)`: reserves resources for at most `count` many contained areas. Only needed for efficiency, and only some implementations profit.
+* `get_area(id, include_borders, include_data)`: returns the area with the id `id`.
+ (optional) Boolean values `include_borders` and `include_data` control what's copied.
+ Returns nil if specified area id does not exist.
+* `get_areas_for_pos(pos, include_borders, include_data)`: returns all areas that contain
+ the position `pos`. (optional) Boolean values `include_borders` and `include_data` control
+ what's copied.
+* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`:
+ returns all areas that contain all nodes inside the area specified by `edge1` and `edge2` (inclusive).
+ If `accept_overlap` is true, also areas are returned that have nodes in common with the specified area.
+ (optional) Boolean values `include_borders` and `include_data` control what's copied.
+* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store. Returns the new area's ID,
+ or nil if the insertion failed. The (inclusive) positions `edge1` and `edge2` describe the area.
+ `data` is a string stored with the area. If passed, `id` will be used as the internal area ID,
+ it must be a unique number between 0 and 2^32-2. If you use the `id` parameter you must always use it,
+ or insertions are likely to fail due to conflicts.
+* `reserve(count)`: reserves resources for at most `count` many contained areas.
+ Only needed for efficiency, and only some implementations profit.
* `remove_area(id)`: removes the area with the given id from the store, returns success.
-* `set_cache_params(params)`: sets params for the included prefiltering cache. Calling invalidates the cache, so that its elements have to be newly generated.
+* `set_cache_params(params)`: sets params for the included prefiltering cache.
+ Calling invalidates the cache, so that its elements have to be newly generated.
* `params`:
{
enabled = boolean, -- whether to enable, default true
- block_radius = number, -- the radius (in nodes) of the areas the cache generates prefiltered lists for, minimum 16, default 64
+ block_radius = number, -- the radius (in nodes) of the areas the cache generates
+ prefiltered lists for, minimum 16, default 64
limit = number, -- the cache's size, minimum 20, default 1000
}
* `to_string()`: Experimental. Returns area store serialized as a (binary) string.
* `to_file(filename)`: Experimental. Like `to_string()`, but writes the data to a file.
-* `from_string(str)`: Experimental. Deserializes string and loads it into the AreaStore. Returns success and, optionally, an error message.
+* `from_string(str)`: Experimental. Deserializes string and loads it into the AreaStore.
+ Returns success and, optionally, an error message.
* `from_file(filename)`: Experimental. Like `from_string()`, but reads the data from a file.
### `ItemStack`
@@ -2782,13 +3010,11 @@ an itemstring, a table or `nil`.
#### Methods
* `is_empty()`: Returns `true` if stack is empty.
* `get_name()`: Returns item name (e.g. `"default:stone"`).
-* `set_name(item_name)`: Returns boolean success.
- Clears item on failure.
+* `set_name(item_name)`: Returns boolean whether item was cleared
* `get_count()`: Returns number of items on the stack.
-* `set_count(count)`
+* `set_count(count)`: Returns boolean whether item was cleared
* `get_wear()`: Returns tool wear (`0`-`65535`), `0` for non-tools.
-* `set_wear(wear)`: Returns boolean success.
- Clears item on failure.
+* `set_wear(wear)`: Returns boolean whether item was cleared
* `get_metadata()`: Returns metadata (a string attached to an item stack).
* `set_metadata(metadata)`: Returns true.
* `clear()`: removes all items from the stack, making it empty.
@@ -2834,7 +3060,9 @@ It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`.
* `next()`: return next integer random number [`-2147483648`...`2147483647`]
* `next(min, max)`: return next integer random number [`min`...`max`]
* `rand_normal_dist(min, max, num_trials=6)`: return normally distributed random number [`min`...`max`]
- * This is only a rough approximation of a normal distribution with mean=(max-min)/2 and variance=1
+ * This is only a rough approximation of a normal distribution with:
+ * mean = (max - min) / 2, and
+ * variance = (((max - min + 1) ^ 2) - 1) / (12 * num_trials)
* Increasing num_trials improves accuracy of the approximation
### `SecureRandom`
@@ -3077,7 +3305,9 @@ will place the schematic inside of the VoxelManip.
* `set_light_data(light_data)`: Sets the `param1` (light) contents of each node
in the `VoxelManip`
* expects lighting data in the same format that `get_light_data()` returns
-* `get_param2_data()`: Gets the raw `param2` data read into the `VoxelManip` object
+* `get_param2_data([buffer])`: Gets the raw `param2` data read into the `VoxelManip` object
+ * Returns an array (indices 1 to volume) of integers ranging from `0` to `255`
+ * If the param `buffer` is present, this table will be used to store the result instead
* `set_param2_data(param2_data)`: Sets the `param2` contents of each node in the `VoxelManip`
* `calc_lighting([p1, p2], [propagate_shadow])`: Calculate lighting within the `VoxelManip`
* To be used only by a `VoxelManip` object from `minetest.get_mapgen_object`
@@ -3183,13 +3413,15 @@ Registered entities
* It has the member `.object`, which is an `ObjectRef` pointing to the object
* The original prototype stuff is visible directly via a metatable
* Callbacks:
- * `on_activate(self, staticdata)`
+ * `on_activate(self, staticdata, dtime_s)`
* Called when the object is instantiated.
+ * `dtime_s` is the time passed since the object was unloaded, which can
+ be used for updating the entity state.
* `on_step(self, dtime)`
* Called on every server tick, after movement and collision processing.
`dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
`in minetest.conf`.
- * `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir`
+ * `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir)`
* Called when somebody punches the object.
* Note that you probably want to handle most punches using the
automatic armor group system.
@@ -3317,19 +3549,23 @@ Definition tables
on_activate = function(self, staticdata, dtime_s),
on_step = function(self, dtime),
- on_punch = function(self, hitter),
+ on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir),
on_rightclick = function(self, clicker),
get_staticdata = function(self),
-- ^ Called sometimes; the string returned is passed to on_activate when
-- the entity is re-activated from static state
- -- Also you can define arbitrary member variables here
- myvariable = whatever,
+ -- Also you can define arbitrary member variables here (see item definition for
+ -- more info)
+ _custom_field = whatever,
}
### ABM (ActiveBlockModifier) definition (`register_abm`)
{
+ label = "Lava cooling",
+ -- ^ Descriptive label for profiling purposes (optional).
+ -- Definitions with identical labels will be listed as one.
-- In the following two fields, also group:groupname will work.
nodenames = {"default:lava_source"},
neighbors = {"default:water_source", "default:water_flowing"}, -- Any of these --[[
@@ -3346,6 +3582,9 @@ Definition tables
### LBM (LoadingBlockModifier) definition (`register_lbm`)
{
+ label = "Upgrade legacy doors",
+ -- ^ Descriptive label for profiling purposes (optional).
+ -- Definitions with identical labels will be listed as one.
name = "modname:replace_legacy_door",
nodenames = {"default:lava_source"},
-- ^ List of node names to trigger the LBM on.
@@ -3362,27 +3601,26 @@ Definition tables
{
description = "Steel Axe",
- groups = {}, -- key=name, value=rating; rating=1..3.
+ groups = {}, -- key = name, value = rating; rating = 1..3.
if rating not applicable, use 1.
- e.g. {wool=1, fluffy=3}
- {soil=2, outerspace=1, crumbly=1}
- {bendy=2, snappy=1},
- {hard=1, metal=1, spikes=1}
+ e.g. {wool = 1, fluffy = 3}
+ {soil = 2, outerspace = 1, crumbly = 1}
+ {bendy = 2, snappy = 1},
+ {hard = 1, metal = 1, spikes = 1}
inventory_image = "default_tool_steelaxe.png",
wield_image = "",
- wield_scale = {x=1,y=1,z=1},
+ wield_scale = {x = 1, y = 1, z = 1},
stack_max = 99,
range = 4.0,
liquids_pointable = false,
tool_capabilities = {
full_punch_interval = 1.0,
- max_drop_level=0,
- groupcaps={
+ max_drop_level = 0,
+ groupcaps = {
-- For example:
- snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
- choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
+ choppy = {times = {[1] = 2.50, [2] = 1.40, [3] = 1.00}, uses = 20, maxlevel = 2},
},
- damage_groups = {groupname=damage},
+ damage_groups = {groupname = damage},
},
node_placement_prediction = nil,
--[[
@@ -3394,21 +3632,25 @@ Definition tables
actual result to client in a short moment.
]]
sound = {
+ breaks = "default_tool_break", -- tools only
place = --[[<SimpleSoundSpec>]],
},
on_place = func(itemstack, placer, pointed_thing),
--[[
^ Shall place item and return the leftover itemstack
+ ^ The placer may be any ObjectRef or nil.
^ default: minetest.item_place ]]
on_secondary_use = func(itemstack, user, pointed_thing),
--[[
^ Same as on_place but called when pointing at nothing.
+ ^ The user may be any ObjectRef or nil.
^ pointed_thing : always { type = "nothing" }
]]
on_drop = func(itemstack, dropper, pos),
--[[
^ Shall drop item and return the leftover itemstack
+ ^ The dropper may be any ObjectRef or nil.
^ default: minetest.item_drop ]]
on_use = func(itemstack, user, pointed_thing),
--[[
@@ -3417,6 +3659,7 @@ Definition tables
inventory, 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.
^ The default functions handle regular use cases.
]]
after_use = func(itemstack, user, node, digparams),
@@ -3429,6 +3672,13 @@ Definition tables
itemstack:add_wear(digparams.wear)
return itemstack
end
+ ^ The user may be any ObjectRef or nil.
+ ]]
+ _custom_field = whatever,
+ --[[
+ ^ Add your own custom fields. By convention, all custom field names
+ should start with `_` to avoid naming collisions with future engine
+ usage.
]]
}
@@ -3472,6 +3722,7 @@ Definition tables
^ paramtype = "light" allows light to propagate from or through the node with light value
^ falling by 1 per node. This line is essential for a light source node to spread its light. ]]
paramtype2 = "none", -- See "Nodes"
+ place_param2 = nil, -- Force value for param2 when player places node
is_ground_content = true, -- If false, the cave generator will not carve through this
sunlight_propagates = false, -- If true, sunlight will go infinitely through this
walkable = true, -- If true, objects collide with node
@@ -3484,13 +3735,17 @@ Definition tables
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_renewable = true, -- Can new liquid source be created by placing two or more sources nearby?
+ liquid_renewable = true, --[[
+ ^ If true, a new liquid source can be created by placing two or more sources nearby ]]
leveled = 0, --[[
^ Block contains level in param2. Value is default level, used for snow.
^ Don't forget to use "leveled" type nodebox. ]]
liquid_range = 8, -- number of flowing nodes around source (max. 8)
drowning = 0, -- Player will take this amount of damage if no bubbles are left
- light_source = 0, -- Amount of light emitted by node
+ light_source = 0, --[[
+ ^ Amount of light emitted by node.
+ ^ To set the maximum (currently 14), use the value 'minetest.LIGHT_MAX'.
+ ^ A value outside the range 0 to minetest.LIGHT_MAX causes undefined behavior.]]
damage_per_second = 0, -- If player is inside node, this damage is caused
node_box = {type="regular"}, -- See "Node boxes"
connects_to = nodenames, --[[
@@ -3517,8 +3772,8 @@ Definition tables
max_items = 1, -- Maximum number of items to drop.
items = { -- Choose max_items randomly from this list.
{
- items = {"foo:bar", "baz:frob"}, -- Choose one item randomly from this list.
- rarity = 1, -- Probability of getting is 1 / rarity.
+ items = {"foo:bar", "baz:frob"}, -- Items to drop.
+ rarity = 1, -- Probability of dropping is 1 / rarity.
},
},
},
@@ -3690,6 +3945,9 @@ Definition tables
### Biome definition (`register_biome`)
+**Note**
+The Biome API is still in an experimental phase and subject to change.
+
{
name = "tundra",
node_dust = "default:snow",
@@ -3709,6 +3967,9 @@ Definition tables
-- ^ Node that replaces all seawater nodes not in the defined surface layer.
node_river_water = "default:ice",
-- ^ Node that replaces river water in mapgens that use default:river_water.
+ node_riverbed = "default:gravel",
+ depth_riverbed = 2,
+ -- ^ Node placed under river water and thickness of this layer.
y_min = 1,
y_max = 31000,
-- ^ Lower and upper limits for biome.
@@ -3738,7 +3999,7 @@ Definition tables
{
deco_type = "simple", -- See "Decoration types"
place_on = "default:dirt_with_grass",
- -- ^ Node that decoration can be placed on
+ -- ^ Node (or list of nodes) that the decoration can be placed on
sidelen = 8,
-- ^ Size of divisions made in the chunk being generated.
-- ^ If the chunk size is not evenly divisible by sidelen, sidelen is made equal to the chunk size.
@@ -3757,6 +4018,13 @@ Definition tables
-- ^ Minimum and maximum `y` positions these decorations can be generated at.
-- ^ This parameter refers to the `y` position of the decoration base, so
-- the actual maximum height would be `height_max + size.Y`.
+ spawn_by = "default:water",
+ -- ^ Node (or list of nodes) that the decoration only spawns next to.
+ -- ^ Checks two horizontal planes of neighbouring nodes (including diagonal neighbours),
+ -- ^ one plane at Y = surface and one plane at Y = surface = + 1.
+ num_spawn_by = 1,
+ -- ^ Number of spawn_by nodes that must be surrounding the decoration position to occur.
+ -- ^ If absent or -1, decorations occur next to any nodes.
flags = "liquid_surface, force_placement",
-- ^ Flags for all decoration types.
-- ^ "liquid_surface": Instead of placement on the highest solid surface
@@ -3772,15 +4040,10 @@ Definition tables
-- ^ Number of nodes high the decoration is made.
-- ^ If height_max is not 0, this is the lower bound of the randomly selected height.
height_max = 0,
- -- ^ Number of nodes the decoration can be at maximum.
+ -- ^ Number of nodes the decoration can be at maximum.
-- ^ If absent, the parameter 'height' is used as a constant.
- spawn_by = "default:water",
- -- ^ Node that the decoration only spawns next to.
- -- ^ The neighbours checked are the 8 nodes horizontally surrounding the lowest node of the
- -- ^ decoration, and the 8 nodes horizontally surrounding the ground node below the decoration.
- num_spawn_by = 1,
- -- ^ Number of spawn_by nodes that must be surrounding the decoration position to occur.
- -- ^ If absent or -1, decorations occur next to any nodes.
+ param2 = 0,
+ -- ^ Param2 value of placed decoration node.
----- Schematic-type parameters
schematic = "foobar.mts",
@@ -3881,6 +4144,9 @@ Definition tables
size = 1,
collisiondetection = false,
-- ^ collisiondetection: if true collides with physical objects
+ collision_removal = false,
+ -- ^ collision_removal: if true then particle is removed when it collides,
+ -- ^ requires collisiondetection = true to have any effect
vertical = false,
-- ^ vertical: if true faces player using y axis only
texture = "image.png",
@@ -3910,6 +4176,12 @@ Definition tables
-- ^ minsize/maxsize, minexptime/maxexptime (expirationtime)
collisiondetection = false,
-- ^ collisiondetection: if true uses collision detection
+ collision_removal = false,
+ -- ^ collision_removal: if true then particle is removed when it collides,
+ -- ^ requires collisiondetection = true to have any effect
+ attached = ObjectRef,
+ -- ^ attached: if defined, particle positions, velocities and accelerations
+ -- ^ are relative to this object's position and yaw.
vertical = false,
-- ^ vertical: if true faces player using y axis only
texture = "image.png",
@@ -3918,7 +4190,7 @@ Definition tables
-- ^ Playername is optional, if specified spawns particle only on the player's client
}
-### `HTTPRequest` definition (`http_fetch`, `http_fetch_async`)
+### `HTTPRequest` definition (`HTTPApiTable.fetch_async`, `HTTPApiTable.fetch_async`)
{
url = "http://example.org",
@@ -3938,7 +4210,7 @@ Definition tables
-- ^ Optional, if true performs a multipart HTTP request. Default is false.
}
-### `HTTPRequestResult` definition (`http_fetch` callback, `http_fetch_async_get`)
+### `HTTPRequestResult` definition (`HTTPApiTable.fetch` callback, `HTTPApiTable.fetch_async_get`)
{
completed = true,
diff --git a/doc/menu_lua_api.txt b/doc/menu_lua_api.txt
index ac8713a32..423b8bb9c 100644
--- a/doc/menu_lua_api.txt
+++ b/doc/menu_lua_api.txt
@@ -1,4 +1,4 @@
-Minetest Lua Mainmenu API Reference 0.4.14
+Minetest Lua Mainmenu API Reference 0.4.15
========================================
Introduction
@@ -210,6 +210,10 @@ string:trim()
^ eg. string.trim("\n \t\tfoo bar\t ") == "foo bar"
core.is_yes(arg) (possible in async calls)
^ returns whether arg can be interpreted as yes
+minetest.encode_base64(string) (possible in async calls)
+^ Encodes a string in base64.
+minetest.decode_base64(string) (possible in async calls)
+^ Decodes a string encoded in base64.
Version compat:
core.get_min_supp_proto()
diff --git a/doc/old/ancient_main_comment.txt b/doc/old/ancient_main_comment.txt
deleted file mode 100644
index d7b0e307f..000000000
--- a/doc/old/ancient_main_comment.txt
+++ /dev/null
@@ -1,345 +0,0 @@
-------------------------------------------------------------------
-The ancient comment from the beginning of main.cpp is stored here.
-------------------------------------------------------------------
-
-/*
-=============================== NOTES ==============================
-NOTE: Things starting with TODO are sometimes only suggestions.
-
-NOTE: iostream.imbue(std::locale("C")) is very slow
-NOTE: Global locale is now set at initialization
-
-NOTE: If VBO (EHM_STATIC) is used, remember to explicitly free the
- hardware buffer (it is not freed automatically)
-
-NOTE: A random to-do list saved here as documentation:
-A list of "active blocks" in which stuff happens. (+=done)
- + Add a never-resetted game timer to the server
- + Add a timestamp value to blocks
- + The simple rule: All blocks near some player are "active"
- - Do stuff in real time in active blocks
- + Handle objects
- - Grow grass, delete leaves without a tree
- - Spawn some mobs based on some rules
- - Transform cobble to mossy cobble near water
- - Run a custom script
- - ...And all kinds of other dynamic stuff
- + Keep track of when a block becomes active and becomes inactive
- + When a block goes inactive:
- + Store objects statically to block
- + Store timer value as the timestamp
- + When a block goes active:
- + Create active objects out of static objects
- - Simulate the results of what would have happened if it would have
- been active for all the time
- - Grow a lot of grass and so on
- + Initially it is fine to send information about every active object
- to every player. Eventually it should be modified to only send info
- about the nearest ones.
- + This was left to be done by the old system and it sends only the
- nearest ones.
-
-NOTE: Seeds in 1260:6c77e7dbfd29:
-5721858502589302589:
- Spawns you on a small sand island with a surface dungeon
-2983455799928051958:
- Enormous jungle + a surface dungeon at ~(250,0,0)
-
-Old, wild and random suggestions that probably won't be done:
--------------------------------------------------------------
-
-SUGG: If player is on ground, mainly fetch ground-level blocks
-
-SUGG: Expose Connection's seqnums and ACKs to server and client.
- - This enables saving many packets and making a faster connection
- - This also enables server to check if client has received the
- most recent block sent, for example.
-SUGG: Add a sane bandwidth throttling system to Connection
-
-SUGG: More fine-grained control of client's dumping of blocks from
- memory
- - ...What does this mean in the first place?
-
-SUGG: A map editing mode (similar to dedicated server mode)
-
-SUGG: Transfer more blocks in a single packet
-SUGG: A blockdata combiner class, to which blocks are added and at
- destruction it sends all the stuff in as few packets as possible.
-SUGG: Make a PACKET_COMBINED which contains many subpackets. Utilize
- it by sending more stuff in a single packet.
- - Add a packet queue to RemoteClient, from which packets will be
- combined with object data packets
- - This is not exactly trivial: the object data packets are
- sometimes very big by themselves
- - This might not give much network performance gain though.
-
-SUGG: Precalculate lighting translation table at runtime (at startup)
- - This is not doable because it is currently hand-made and not
- based on some mathematical function.
- - Note: This has been changing lately
-
-SUGG: A version number to blocks, which increments when the block is
- modified (node add/remove, water update, lighting update)
- - This can then be used to make sure the most recent version of
- a block has been sent to client, for example
-
-SUGG: Make the amount of blocks sending to client and the total
- amount of blocks dynamically limited. Transferring blocks is the
- main network eater of this system, so it is the one that has
- to be throttled so that RTTs stay low.
-
-SUGG: Meshes of blocks could be split into 6 meshes facing into
- different directions and then only those drawn that need to be
-
-SUGG: Background music based on cellular automata?
- http://www.earslap.com/projectslab/otomata
-
-SUGG: Simple light color information to air
-
-SUGG: Server-side objects could be moved based on nodes to enable very
- lightweight operation and simple AI
- - Not practical; client would still need to show smooth movement.
-
-SUGG: Make a system for pregenerating quick information for mapblocks, so
- that the client can show them as cubes before they are actually sent
- or even generated.
-
-SUGG: Erosion simulation at map generation time
- - This might be plausible if larger areas of map were pregenerated
- without lighting (which is slow)
- - Simulate water flows, which would carve out dirt fast and
- then turn stone into gravel and sand and relocate it.
- - How about relocating minerals, too? Coal and gold in
- downstream sand and gravel would be kind of cool
- - This would need a better way of handling minerals, mainly
- to have mineral content as a separate field. the first
- parameter field is free for this.
- - Simulate rock falling from cliffs when water has removed
- enough solid rock from the bottom
-
-SUGG: For non-mapgen FarMesh: Add a per-sector database to store surface
- stuff as simple flags/values
- - Light?
- - A building?
- And at some point make the server send this data to the client too,
- instead of referring to the noise functions
- - Ground height
- - Surface ground type
- - Trees?
-
-Gaming ideas:
--------------
-
-- Aim for something like controlling a single dwarf in Dwarf Fortress
-- The player could go faster by a crafting a boat, or riding an animal
-- Random NPC traders. what else?
-
-Game content:
--------------
-
-- When furnace is destroyed, move items to player's inventory
-- Add lots of stuff
-- Glass blocks
-- Growing grass, decaying leaves
- - This can be done in the active blocks I guess.
- - Lots of stuff can be done in the active blocks.
- - Uh, is there an active block list somewhere? I think not. Add it.
-- Breaking weak structures
- - This can probably be accomplished in the same way as grass
-- Player health points
- - When player dies, throw items on map (needs better item-on-map
- implementation)
-- Cobble to get mossy if near water
-- More slots in furnace source list, so that multiple ingredients
- are possible.
-- Keys to chests?
-
-- The Treasure Guard; a big monster with a hammer
- - The hammer does great damage, shakes the ground and removes a block
- - You can drop on top of it, and have some time to attack there
- before he shakes you off
-
-- Maybe the difficulty could come from monsters getting tougher in
- far-away places, and the player starting to need something from
- there when time goes by.
- - The player would have some of that stuff at the beginning, and
- would need new supplies of it when it runs out
-
-- A bomb
-- A spread-items-on-map routine for the bomb, and for dying players
-
-- Fighting:
- - Proper sword swing simulation
- - Player should get damage from colliding to a wall at high speed
-
-Documentation:
---------------
-
-Build system / running:
------------------------
-
-Networking and serialization:
------------------------------
-
-SUGG: Fix address to be ipv6 compatible
-
-User Interface:
----------------
-
-Graphics:
----------
-
-SUGG: Combine MapBlock's face caches to so big pieces that VBO
- can be used
- - That is >500 vertices
- - This is not easy; all the MapBlocks close to the player would
- still need to be drawn separately and combining the blocks
- would have to happen in a background thread
-
-SUGG: Make fetching sector's blocks more efficient when rendering
- sectors that have very large amounts of blocks (on client)
- - Is this necessary at all?
-
-SUGG: Draw cubes in inventory directly with 3D drawing commands, so that
- animating them is easier.
-
-SUGG: Option for enabling proper alpha channel for textures
-
-TODO: Flowing water animation
-
-TODO: A setting for enabling bilinear filtering for textures
-
-TODO: Better control of draw_control.wanted_max_blocks
-
-TODO: Further investigate the use of GPU lighting in addition to the
- current one
-
-TODO: Artificial (night) light could be more yellow colored than sunlight.
- - This is technically doable.
- - Also the actual colors of the textures could be made less colorful
- in the dark but it's a bit more difficult.
-
-SUGG: Somehow make the night less colorful
-
-TODO: Occlusion culling
- - At the same time, move some of the renderMap() block choosing code
- to the same place as where the new culling happens.
- - Shoot some rays per frame and when ready, make a new list of
- blocks for usage of renderMap and give it a new pointer to it.
-
-Configuration:
---------------
-
-Client:
--------
-
-TODO: Untie client network operations from framerate
- - Needs some input queues or something
- - This won't give much performance boost because calculating block
- meshes takes so long
-
-SUGG: Make morning and evening transition more smooth and maybe shorter
-
-TODO: Don't update all meshes always on single node changes, but
- check which ones should be updated
- - implement Map::updateNodeMeshes() and the usage of it
- - It will give almost always a 4x boost in mesh update performance.
-
-- A weapon engine
-
-- Tool/weapon visualization
-
-FIXME: When disconnected to the menu, memory is not freed properly
-
-TODO: Investigate how much the mesh generator thread gets used when
- transferring map data
-
-Server:
--------
-
-SUGG: Make an option to the server to disable building and digging near
- the starting position
-
-FIXME: Server sometimes goes into some infinite PeerNotFoundException loop
-
-* Fix the problem with the server constantly saving one or a few
- blocks? List the first saved block, maybe it explains.
- - It is probably caused by oscillating water
- - TODO: Investigate if this still happens (this is a very old one)
-* Make a small history check to transformLiquids to detect and log
- continuous oscillations, in such detail that they can be fixed.
-
-FIXME: The new optimized map sending doesn't sometimes send enough blocks
- from big caves and such
-FIXME: Block send distance configuration does not take effect for some reason
-
-Environment:
-------------
-
-TODO: Add proper hooks to when adding and removing active blocks
-
-TODO: Finish the ActiveBlockModifier stuff and use it for something
-
-Objects:
---------
-
-TODO: Get rid of MapBlockObjects and use only ActiveObjects
- - Skipping the MapBlockObject data is nasty - there is no "total
- length" stored; have to make a SkipMBOs function which contains
- enough of the current code to skip them properly.
-
-SUGG: MovingObject::move and Player::move are basically the same.
- combine them.
- - NOTE: This is a bit tricky because player has the sneaking ability
- - NOTE: Player::move is more up-to-date.
- - NOTE: There is a simple move implementation now in collision.{h,cpp}
- - NOTE: MovingObject will be deleted (MapBlockObject)
-
-TODO: Add a long step function to objects that is called with the time
- difference when block activates
-
-Map:
-----
-
-TODO: Flowing water to actually contain flow direction information
- - There is a space for this - it just has to be implemented.
-
-TODO: Consider smoothening cave floors after generating them
-
-TODO: Fix make_tree, make_* to use seed-position-consistent pseudorandom
- - delta also
-
-Misc. stuff:
-------------
-TODO: Make sure server handles removing grass when a block is placed (etc)
- - The client should not do it by itself
- - NOTE: I think nobody does it currently...
-TODO: Block cube placement around player's head
-TODO: Protocol version field
-TODO: Think about using same bits for material for fences and doors, for
- example
-
-SUGG: Restart irrlicht completely when coming back to main menu from game.
- - This gets rid of everything that is stored in irrlicht's caches.
- - This might be needed for texture pack selection in menu
-
-TODO: Merge bahamada's audio stuff (clean patch available)
-
-Making it more portable:
-------------------------
-
-Stuff to do before release:
----------------------------
-
-Fixes to the current release:
------------------------------
-
-Stuff to do after release:
----------------------------
-
-Doing currently:
-----------------
-
-======================================================================
-
-*/
diff --git a/doc/old/changelog.txt b/doc/old/changelog.txt
deleted file mode 100644
index 1750d71d1..000000000
--- a/doc/old/changelog.txt
+++ /dev/null
@@ -1,147 +0,0 @@
-Minetest changelog
-----------------------
-This should contain all the major changes.
-For minor stuff, refer to the commit log of the repository.
-
-0.3.1: (released on 2011-11-09)
-- Fix frustum culling (previous versions have rendered too much stuff that is not actually visible (about 180 degrees, while should have been more like 100.))
-- Add occlusion culling (improves performance a lot)
-- Add “3d clouds†on/off checkbox in main menu
-- Add “opaque water†on/off checkbox
-- Fix some random minor stuff
-- Turn mipmapping off (This makes far-away textures a bit noisier but better looking)
-- Add Command-line signal handler for Windows (contributed by SpeedProg)
-- Fix network layer segmentation fault introduced in 0.3.dev-20111021
-- Fix water-glass and water-lava and lava-glass surfaces
-
-0.3.0: (released on 2011-11-01)
-- Some small fixes
-0.3.dev-20111021:
-- Modify dungeon masters to only try to shoot players
-- Fix object duplication bug at block load/unload bug
-- Improve network layer
-0.3.dev-20111016:
-- Locked chest (contributed)
-- Server user limit setting (max_users)
-- Wielded tool is shown in HUD (contributed)
-- View bobbing (contributed)
-- Saplings that drop from leaf blocks and when placed on ground will grow to trees (contributed)
-- Optimized map saving (does not re-save everything all the time)
-- New mob system and new mob: dungeon master
-- Death/respawn screen
-
-0.2.20110922_3:
-- Fix the build for MSVC2010; also released for windows using MSVC2010.
-
-0.2.20110922_1:
-- Make client report a newer version number to the server than 2011-07-31 does and make server disallow old clients
-
-0.2.20110922:
-- Map is saved in an SQLite database file (by Queatz)
-- Ladders (MarkTraceur)
-- Lava
-- Apple trees (sfan5)
-- Slightly better looking inventory with transparency
-- /me chat command (Oblomov)
-- Using chosen map seed possible through fixed_map_seed configuration option (kahrl)
-- Fix the long-existed PeerNotFound loop bug
-- Some translations and localization-related fixes
-- Lots of small fixes
-
-2011-07-31_3:
-- Fixes a bug that made the server to deny non-empty passwords from players connecting the first time
-
-2011-07-31_2:
-- Fixes a bug that caused the server to always read an empty password from the client when a client connected.
-
-2011-07-31:
-- A number of small fixes, build system stuff and such (refer to version control log)
-- Map generator no longer crashes at generation limit
-- Fixed mapgen producing lots of cut-down trees
-- Some minor tweaks in map generator (some contributed)
-- Volumetric clouds (contributed)
-- Icon added (graphic contributed)
-- Key configuration menu (contributed)
-- Decorative blocks and items: bookshelf, sandstone, cactus, clay, brick, papyrus, rail, paper, book (contributed)
-- Jungles!
-- Hotbar is a bit smaller
-- Health is now enabled by default; You can now eat cooked rats to heal yourself.
-- Finally added sword textures, altough sword is still of no use
-- Creative mode now preserves normal mode inventory
-
-2011-07-04:
-- Many small fixes
-- Code reorganizing to aid further development
-- Renewed map generator
-
-2011-06-02:
-- Password crash on windows fixed
-- Optimized server CPU usage a lot
-- Furnaces now work also while players are not near to them
-
-2011-05-29:
-- Optimized smooth lighting
-- A number of small fixes
-- Added clouds and simple skyboxes
-- The glass block added
-- Added key configuration to config file
-- Player privileges on server
-- Slightly updated map format
-- Player passwords
-- All textures first searched from texture_path
-- Map directory ("map") has been renamed to "world" (just rename it to load an old world)
-- Mouse inversion (invert_mouse)
-- Grass doesn't grow immediately anymore
-- Fence added
-
-2011-04-24:
-- Smooth lighting with simple ambient occlusion
-- Updated main menu
-
-2011-04-23_0_test:
-- Small bug fixes
-- Item drop multiplication fixed
-- HP added
-- Added A simple monster which spawns to dark places at map generation time
-- Some code refactoring and cleaning (possibly new bugs)
-
-2011-04-11:
-- Fixed crafting a bit
-
-2011-04-10_0:
-- Asynchronous map generation
-- New object system
-
-2011-04-06:
-- Mesh update of node addition/removal is now done asynchronously on client, removing frametime spike
-- Node addition/removal is sent directly only to clients that are closer than 100 nodes to the modification. For the others, the modified blocks are set unsent. (and are re-sent when applicable)
-
-2011-04-05:
-- Made furnace usable
-- Added cobblestone
-- Added wood, stone and steel tools: pickaxes, shovels and axes
-- Incremented to version 0.0.2
-
-2011-04-04:
-- Cleaned client to be completely synchronous, except for the mesh calculation, which is now done with queues in a separate thread.
-- Added node metadata support
-- Added chests
-
-2011-02-17:
-- Added better handling of textures. Now many file extensions are searched. Also too large textures are not put on the texture atlas, and the construction of the texture atlas is stopped when it is full.
-
-2011-02-16:
-- Better handling of Ctrl-C on POSIX systems
-
-2011-02-15:
-- Fixed a problem of not saving and loading the "lighting expired" value of MapBlocks properly. This caused high server CPU usage.
-- Ctrl-C handling on POSIX systems
-- Added simple command support to server
-- Added settings enable_texture_atlas and texture_path
-
-2011-02-14:
-- Created changelog.txt
-- Added sneaking/crouching
-- Modified the looks of the hotbar and cleaned code
-- Added code to allow generating 3D cube images for inventory
-
diff --git a/doc/texture_overrides.txt b/doc/texture_overrides.txt
deleted file mode 100644
index 1a4e11a3c..000000000
--- a/doc/texture_overrides.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-Texture Overrides
-=================
-
-You can override the textures of a node from a texture pack using
-texture overrides. To do this, create a file in a texture pack
-called override.txt
-
-Basic Format
-------------
-
-Each line in an override.txt file is a rule. It consists of
-
- nodename face-selector texture
-
-For example,
-
- default:dirt_with_grass sides default_stone.png
-
-You can use ^ operators as usual:
-
- default:dirt_with_grass sides default_stone.png^[brighten
-
-Face Selectors
---------------
-
-| face-selector | behavior |
-|---------------|---------------------------------------------------|
-| left | x- |
-| right | x+ |
-| front | z- |
-| back | z+ |
-| top | y+ |
-| bottom | y- |
-| sides | x-, x+, z-, z+ |
-| all | All faces. You can also use '*' instead of 'all'. |
diff --git a/doc/texture_packs.txt b/doc/texture_packs.txt
new file mode 100644
index 000000000..5c535a9f1
--- /dev/null
+++ b/doc/texture_packs.txt
@@ -0,0 +1,158 @@
+Minetest Texture Pack Reference
+===============================
+
+Texture packs allow you to replace textures provided by a mod with your own
+textures.
+
+Texture pack directory structure
+--------------------------------
+
+ textures
+ |-- Texture Pack
+ | |-- screenshot.png
+ | |-- description.txt
+ | |-- override.txt
+ | |-- your_texture_1.png
+ | |-- your_texture_2.png
+ `-- Another Texture Pack
+
+### Texture Pack
+This is a directory containing the entire contents of a single texture pack.
+It can be chosen more or less freely and will also become the name of the
+texture pack. The name must not be “baseâ€.
+
+### `description.txt`
+A file containing a short description of the texture pack to be shown in the
+texture packs tab.
+
+### `screenshot.png`
+A preview image showing an in-game screenshot of this texture pack; it will be
+shown in the texture packs tab. It should have an aspect ratio of 3:2 and a
+minimum size of 300×200 pixels.
+
+### `your_texture_1.png`, `your_texture_2.png`, etc.
+Any other PNG files will be interpreted as textures. They must have the same
+names as the textures they are supposed to override. For example, to override
+the apple texture of Minetest Game, add a PNG file named `default_apple.png`.
+
+The custom textures do not necceessarily require the same size as their
+originals, but this might be required for a few particular textures. When
+unsure, just test your texture pack in-game.
+
+Texture modifiers
+-----------------
+
+See lua_api.txt for texture modifiers
+
+Special textures
+----------------
+
+These texture names are hardcoded into the engine but can also be overwritten
+by texture packs. All existing fallback textures can be found in the directory
+`textures/base/pack`.
+
+### Gameplay textures
+
+* `bubble.png`: the bubble texture when the player is drowning
+
+* `crack_anylength.png`: node overlay texture when digging
+
+* `crosshair.png`
+ * the crosshair texture in the center of the screen. The settings
+ `crosshair_color` and `crosshair_alpha` are used to create a cross
+ when no texture was found
+
+* `halo.png`: used for the node highlighting mesh
+
+* `heart.png`: used to display the health points of the player
+
+* `minimap_mask_round.png`: round minimap mask, white gets replaced by the map
+* `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
+* `object_marker_red.png`: texture for players on the minimap
+* `player_marker.png`: texture for the own player on the square minimap
+
+* `player.png`: front texture of the 2D upright sprite player
+* `player_back.png`: back texture of the 2D upright sprite player
+
+* `moon.png`: texture of the moon. Default texture is generated by Minetest
+* `moon_tonemap.png`: tonemap to be used when `moon.png` was found
+* `sun.png`: texture of the sun. Default texture is generated by Minetest
+* `sun_tonemap.png`: tonemap to be used when `sun.png` was found
+* `sunrisebg.png`: shown sky texture when the sun rises
+
+* `smoke_puff.png`: texture used when an object died by punching
+
+* `unknown_item.png`: shown texture when an item definition was not found
+* `unknown_node.png`: shown texture when a node definition was not found
+* `unknown_object.png`: shown texture when an entity definition was not found
+
+* `wieldhand.png`: texture of the wieldhand
+
+### Mainmenu textures
+
+* `menu_bg.png`: used as mainmenu background when the clouds are disabled
+* `menu_header.png`: header texture when no texture pack is selected
+
+* `no_screenshot.png`
+ * texture when no screenshot was found for a texture pack or mod
+
+* `server_flags_creative.png`: icon for creative servers
+* `server_flags_damage.png`: icon for enabled damage on servers
+* `server_flags_favorite.png`: icon for your favorite servers
+* `server_flags_pvp.png`: icon for enabled PvP on servers
+
+### Android textures
+
+* `down_arrow.png`
+* `left_arrow.png`
+* `right_arrow.png`
+* `up_arrow.png`
+
+* `drop_btn.png`
+* `fast_btn.png`
+* `fly_btn.png`
+* `jump_btn.png`
+* `noclip_btn.png`
+
+* `camera_btn.png`
+* `chat_btn.png`
+* `inventory_btn.png`
+* `rangeview_btn.png`
+
+* `debug_btn.png`
+* `gear_icon.png`
+* `rare_controls.png`
+
+Texture Overrides
+-----------------
+
+You can override the textures of a node from a texture pack using
+texture overrides. To do this, create a file in a texture pack
+called override.txt
+
+Each line in an override.txt file is a rule. It consists of
+
+ nodename face-selector texture
+
+For example,
+
+ default:dirt_with_grass sides default_stone.png
+
+You can use ^ operators as usual:
+
+ default:dirt_with_grass sides default_stone.png^[brighten
+
+Here are face selectors you can choose from:
+
+| face-selector | behavior |
+|---------------|---------------------------------------------------|
+| left | x- |
+| right | x+ |
+| front | z- |
+| back | z+ |
+| top | y+ |
+| bottom | y- |
+| sides | x-, x+, z-, z+ |
+| all | All faces. You can also use '*' instead of 'all'. |
diff --git a/minetest.conf.example b/minetest.conf.example
index 5090a620b..867d98584 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -38,7 +38,7 @@
# type: bool
# noclip = false
-# Smooths camera when moving and looking around.
+# Smooths camera when looking around. Also called look or mouse smoothing.
# Useful for recording videos.
# type: bool
# cinematic = false
@@ -83,6 +83,20 @@
# type: bool
# continuous_forward = false
+# Enable Joysticks
+# type: bool
+# enable_joysticks = false
+
+# The time in seconds it takes between repeated events
+# when holding down a joystick button combination.
+# type: float
+# repeat_joystick_button_time = 0.17
+
+# The sensitivity of the joystick axes for moving the
+# ingame view frustum around.
+# type: float
+# joystick_frustum_sensitivity = 170
+
# Key for moving the player forward.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key
@@ -159,10 +173,15 @@
# type: key
# keymap_noclip = KEY_KEY_H
+# Key for toggling autorun.
+# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
+# type: key
+# keymap_autorun =
+
# Key for toggling cinematic mode.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key
-# keymap_cinematic = KEY_F8
+# keymap_cinematic =
# Key for toggling display of minimap.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
@@ -194,7 +213,7 @@
# type: key
# keymap_toggle_force_fog_off = KEY_F3
-# Key for toggling the camrea update. Only used for development
+# Key for toggling the camera update. Only used for development
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key
# keymap_toggle_update_camera =
@@ -247,7 +266,7 @@
# Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.
# Disabling this option will protect your password better.
# type: bool
-# send_pre_v25_init = true
+# send_pre_v25_init = false
# Save the map received by the client on disk.
# type: bool
@@ -355,7 +374,7 @@
#### Shaders
-# Shaders allow advanced visul effects and may increase performance on some video cards.
+# Shaders allow advanced visual effects and may increase performance on some video cards.
# Thy only work with the OpenGL video backend.
# type: bool
# enable_shaders = true
@@ -454,8 +473,7 @@
# pause_fps_max = 20
# View distance in nodes.
-# Min = 20
-# type: int
+# type: int min: 20 max: 4000
# viewing_range = 100
# Width component of the initial window size.
@@ -482,6 +500,11 @@
# type: int min: 30 max: 160
# fov = 72
+# Field of view while zooming in degrees.
+# This requires the "zoom" privilege on the server.
+# type: int min: 15 max: 160
+# zoom_fov = 15
+
# Adjust the gamma encoding for the light tables. Lower numbers are brighter.
# This setting is for the client only and is ignored by the server.
# type: float min: 1 max: 3
@@ -591,6 +614,10 @@
# type: bool
# inventory_items_animations = false
+# Fraction of the visible distance at which fog starts to be rendered
+# type: float min: 0 max: 0.99
+# fog_start = 0.4
+
### Menus
# Use a cloud animation for the main menu background.
@@ -614,7 +641,7 @@
# When gui_scaling_filter_txr2img is true, copy those images
# from hardware to software for scaling. When false, fall back
# to the old scaling method, for video drivers that don't
-# propery support downloading textures back from hardware.
+# properly support downloading textures back from hardware.
# type: bool
# gui_scaling_filter_txr2img = true
@@ -631,7 +658,7 @@
# font_path = fonts/liberationsans.ttf
# type: int
-# font_size = 15
+# font_size = 16
# Font shadow offset, if 0 then shadow will not be drawn.
# type: int
@@ -639,7 +666,7 @@
# Font shadow alpha (opaqueness, between 0 and 255).
# type: int min: 0 max: 255
-# font_shadow_alpha = 128
+# font_shadow_alpha = 127
# type: path
# mono_font_path = fonts/liberationmono.ttf
@@ -732,6 +759,12 @@
# type: string
# serverlist_url = servers.minetest.net
+# Disable escape sequences, e.g. chat coloring.
+# Use this if you want to run a server with pre-0.4.14 clients and you want to disable
+# the escape sequences generated by mods.
+# type: bool
+# disable_escape_sequences = false
+
## Network
# Network port to listen (UDP).
@@ -764,11 +797,11 @@
### Advanced
-# How many blocks are flying in the wire simultaneously per client.
+# Maximum number of blocks that are simultaneously sent per client.
# type: int
# max_simultaneous_block_sends_per_client = 10
-# How many blocks are flying in the wire simultaneously for the whole server.
+# Maximum number of blocks that are simultaneously sent in total.
# type: int
# max_simultaneous_block_sends_server_total = 40
@@ -953,18 +986,6 @@
# type: enum values: legacy, log, error
# deprecated_lua_api_handling = legacy
-# Useful for mod developers.
-# type: bool
-# mod_profiling = false
-
-# Detailed mod profile data. Useful for mod developers.
-# type: bool
-# detailed_profiling = false
-
-# Profiler data print interval. 0 = disable. Useful for developers.
-# type: int
-# profiler_print_interval = 0
-
# Number of extra blocks that can be loaded by /clearobjects at once.
# This is a trade-off between sqlite transaction overhead and
# memory consumption (4096=100MB, as a rule of thumb).
@@ -978,7 +999,7 @@
# Maximum number of statically stored objects in a block.
# type: int
-# max_objects_per_block = 49
+# max_objects_per_block = 64
# See http://www.sqlite.org/pragma.html#pragma_synchronous
# type: enum values: 0, 1, 2
@@ -1019,12 +1040,20 @@
# type: float
# liquid_update = 1.0
+# At this distance the server will aggressively optimize which blocks are sent to clients.
+# Small values potentially improve performance a lot, at the expense of visible rendering glitches.
+# (some blocks will not be rendered under water and in caves, as well as sometimes on land)
+# Setting this to a value greater than max_block_send_distance disables this optimization.
+# Stated in mapblocks (16 nodes)
+# type: int min: 2
+# block_send_optimize_distance = 4
+
## Mapgen
# Name of map generator to be used when creating a new world.
# Creating a world in the main menu will override this.
# type: enum values: v5, v6, v7, flat, valleys, fractal, singlenode
-# mg_name = v6
+# mg_name = v7
# Water surface level of the world.
# type: int
@@ -1046,8 +1075,6 @@
# 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.
-# The default flags set in the engine are: caves, light, decorations
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
# type: flags possible values: caves, dungeons, light, decorations, nocaves, nodungeons, nolight, nodecorations
@@ -1083,6 +1110,25 @@
# type: int
# num_emerge_threads = 1
+#### Noise parameters and formats
+
+# Noise parameters can be specified as a set of positional values, for example:
+# Offset, scale, (spread factors), seed offset, number of octaves, persistence, lacunarity
+# mgv6_np_terrain_base = -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0
+# Or the group format can be used instead, for example:
+# mgv6_np_terrain_base = {
+# offset = -4,
+# scale = 20,
+# spread = (250, 250, 250),
+# seed = 82341,
+# octaves = 5,
+# persistence = 0.6,
+# lacunarity = 2.0,
+# flags = "defaults"
+# }
+# Only the group format supports noise flags which are needed for eased noise.
+# Mgv5 uses eased noise for np_ground so this is shown in group format below.
+
# Noise parameters for biome API temperature, humidity and biome blend.
# type: noise_params
# mg_biome_np_heat = 50, 50, (750, 750, 750), 5349, 3, 0.5, 2.0
@@ -1117,12 +1163,24 @@
# type: noise_params
# mgv5_np_cave2 = 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0
+# Noise parameters in group format, unsupported by advanced settings
+# menu but settable in minetest.conf.
+# See documentation of noise parameter formats above.
+# mgv5_np_ground = {
+# offset = 0,
+# scale = 40,
+# spread = (80, 80, 80),
+# seed = 983240,
+# octaves = 4,
+# persistence = 0.55,
+# lacunarity = 2.0,
+# flags = "eased"
+# }
+
#### Mapgen v6
# Map generation attributes specific to Mapgen v6.
# When snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.
-# The default flags set in the engine are: biomeblend, mudflow
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
# type: flags possible values: jungles, biomeblend, mudflow, snowbiomes, flat, trees, nojungles, nobiomeblend, nomudflow, nosnowbiomes, noflat, notrees
@@ -1172,17 +1230,33 @@
#### Mapgen v7
# Map generation attributes specific to Mapgen v7.
-# The 'ridges' flag controls the rivers.
-# The default flags set in the engine are: mountains, ridges
-# The flags string modifies the engine defaults.
+# The 'ridges' flag enables the rivers.
+# Floatlands are currently experimental and subject to change.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
-# type: flags possible values: mountains, ridges, nomountains, noridges
+# type: flags possible values: mountains, ridges, floatlands, nomountains, noridges, nofloatlands
# mgv7_spflags = mountains,ridges
# Controls width of tunnels, a smaller value creates wider tunnels.
# type: float
-# mgv7_cave_width = 0.3
+# mgv7_cave_width = 0.09
+
+# Controls the density of floatland mountain terrain.
+# Is an offset added to the 'np_mountain' noise value.
+# type: float
+# mgv7_float_mount_density = 0.6
+
+# Typical maximum height, above and below midpoint, of floatland mountain terrain.
+# type: float
+# mgv7_float_mount_height = 128.0
+
+# Y-level of floatland midpoint and lake surface.
+# type: int
+# mgv7_floatland_level = 1280
+
+# Y-level to which floatland shadows extend.
+# type: int
+# mgv7_shadow_limit = 1024
# type: noise_params
# mgv7_np_terrain_base = 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0
@@ -1206,23 +1280,27 @@
# mgv7_np_ridge_uwater = 0, 1, (1000, 1000, 1000), 85039, 5, 0.6, 2.0
# type: noise_params
+# mgv7_np_floatland_base = -0.6, 1.5, (600, 600, 600), 114, 5, 0.6, 2.0
+
+# type: noise_params
+# mgv7_np_float_base_height = 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0
+
+# type: noise_params
# mgv7_np_mountain = -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0
# type: noise_params
# mgv7_np_ridge = 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
# type: noise_params
-# mgv7_np_cave1 = 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
+# mgv7_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
# type: noise_params
-# mgv7_np_cave2 = 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+# mgv7_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
#### Mapgen flat
# Map generation attributes specific to Mapgen flat.
# Occasional lakes and hills can be added to the flat world.
-# The default flags set in the engine are: none
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
# type: flags possible values: lakes, hills, , nolakes, nohills
@@ -1238,7 +1316,7 @@
# Controls width of tunnels, a smaller value creates wider tunnels.
# type: float
-# mgflat_cave_width = 0.3
+# mgflat_cave_width = 0.09
# Terrain noise threshold for lakes.
# Controls proportion of world area covered by lakes.
@@ -1270,16 +1348,16 @@
# mgflat_np_filler_depth = 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
# type: noise_params
-# mgflat_np_cave1 = 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
+# mgflat_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
# type: noise_params
-# mgflat_np_cave2 = 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+# mgflat_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
#### Mapgen fractal
# Controls width of tunnels, a smaller value creates wider tunnels.
# type: float
-# mgfractal_cave_width = 0.3
+# mgfractal_cave_width = 0.09
# Choice of 18 fractals from 9 formulas.
# 1 = 4D "Roundy" mandelbrot set.
@@ -1354,10 +1432,10 @@
# mgfractal_np_filler_depth = 0, 1.2, (150, 150, 150), 261, 3, 0.7, 2.0
# type: noise_params
-# mgfractal_np_cave1 = 0, 12, (128, 128, 128), 52534, 4, 0.5, 2.0
+# mgfractal_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
# type: noise_params
-# mgfractal_np_cave2 = 0, 12, (128, 128, 128), 10325, 4, 0.5, 2.0
+# mgfractal_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
#### Mapgen Valleys
@@ -1367,8 +1445,6 @@
# 'altitude_chill' makes higher elevations colder, which may cause biome issues.
# 'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,
# it may interfere with delicately adjusted biomes.
-# The default flags set in the engine are: altitude_chill, humid_rivers
-# The flags string modifies the engine defaults.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
# type: flags possible values: altitude_chill, noaltitude_chill, humid_rivers, nohumid_rivers
@@ -1406,17 +1482,17 @@
# Controls width of tunnels, a smaller value creates wider tunnels.
# type: float
-# mgvalleys_cave_width = 0.3
+# mgvalleys_cave_width = 0.09
##### Noises
# Caves and tunnels form at the intersection of the two noises
# type: noise_params
-# mgvalleys_np_cave1 = 0, 12, (100, 100, 100), 52534, 4, 0.5, 2.0
+# mgvalleys_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
# Caves and tunnels form at the intersection of the two noises
# type: noise_params
-# mgvalleys_np_cave2 = 0, 12, (100, 100, 100), 10325, 4, 0.5, 2.0
+# mgvalleys_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
# The depth of dirt or other filler
# type: noise_params
@@ -1461,11 +1537,68 @@
# type: string
# secure.trusted_mods =
-# Comma-seperated list of mods that are allowed to access HTTP APIs, which
+# Comma-separated list of mods that are allowed to access HTTP APIs, which
# allow them to upload and download data to/from the internet.
# type: string
# secure.http_mods =
+## Advanced
+
+### Profiling
+
+# Load the game profiler to collect game profiling data.
+# Provides a /profiler command to access the compiled profile.
+# Useful for mod developers and server operators.
+# type: bool
+# profiler.load = false
+
+# The default format in which profiles are being saved,
+# when calling `/profiler save [format]` without format.
+# type: enum values: txt, csv, lua, json, json_pretty
+# profiler.default_report_format = txt
+
+# The file path relative to your worldpath in which profiles will be saved to.
+#
+# type: string
+# profiler.report_path = ""
+
+#### Instrumentation
+
+# Instrument the methods of entities on registration.
+# type: bool
+# instrument.entity = true
+
+# Instrument the action function of Active Block Modifiers on registration.
+# type: bool
+# instrument.abm = true
+
+# Instrument the action function of Loading Block Modifiers on registration.
+# type: bool
+# instrument.lbm = true
+
+# Instrument chatcommands on registration.
+# type: bool
+# instrument.chatcommand = true
+
+# Instrument global callback functions on registration.
+# (anything you pass to a minetest.register_*() function)
+# type: bool
+# instrument.global_callback = true
+
+##### Advanced
+
+# Instrument builtin.
+# This is usually only needed by core/builtin contributors
+# type: bool
+# instrument.builtin = false
+
+# Have the profiler instrument itself:
+# * Instrument an empty function.
+# This estimates the overhead, that instrumentation is adding (+1 function call).
+# * Instrument the sampler being used to update the statistics.
+# type: bool
+# instrument.profiler = false
+
#
# Client and Server
#
@@ -1478,7 +1611,7 @@
# Set the language. Leave empty to use the system language.
# A restart is required after changing this.
-# type: enum values: , be, cs, da, de, eo, es, et, fr, hu, id, it, ja, jbo, ko, ky, lt, nb, nl, pl, pt, pt_BR, ro, ru, tr, uk, zh_CN, zh_TW
+# type: enum values: , be, ca, cs, da, de, en, eo, es, et, fr, he, hu, id, it, ja, jbo, ko, ky, lt, nb, nl, pl, pt, pt_BR, ro, ru, sr_Cyrl, tr, uk, zh_CN, zh_TW
# language =
# Level of logging to be written to debug.txt:
@@ -1538,3 +1671,7 @@
# type: string
# modstore_details_url = https://forum.minetest.net/mmdb/mod/*/
+# Print the engine's profiling data in regular intervals (in seconds). 0 = disable. Useful for developers.
+# type: int
+# profiler_print_interval = 0
+
diff --git a/misc/minetest-xorg-icon-128.png b/misc/minetest-xorg-icon-128.png
new file mode 100644
index 000000000..0241a911c
--- /dev/null
+++ b/misc/minetest-xorg-icon-128.png
Binary files differ
diff --git a/misc/minetest.appdata.xml b/misc/minetest.appdata.xml
index 19d042805..65acf96ec 100644
--- a/misc/minetest.appdata.xml
+++ b/misc/minetest.appdata.xml
@@ -32,6 +32,15 @@
<screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/3.jpg</screenshot>
<screenshot width="1920" height="1080">http://www.minetest.net/media/gallery/5.jpg</screenshot>
</screenshots>
+ <keywords>
+ <keyword>sandbox</keyword>
+ <keyword>world</keyword>
+ <keyword>mining</keyword>
+ <keyword>multiplayer</keyword>
+ </keywords>
<url type="homepage">http://minetest.net</url>
+ <url type="bugtracker">http://www.minetest.net/development/#reporting-issues</url>
+ <url type="translate">http://dev.minetest.net/Translation</url>
+ <url type="donation">http://www.minetest.net/development/#donate</url>
<updatecontact>sfan5@live.de</updatecontact>
</application>
diff --git a/misc/minetest.desktop b/misc/minetest.desktop
index 1d2430a2c..ca493c44e 100644
--- a/misc/minetest.desktop
+++ b/misc/minetest.desktop
@@ -12,6 +12,6 @@ Exec=minetest
Icon=minetest
Terminal=false
Type=Application
-Categories=Game;
+Categories=Game;Simulation;
StartupNotify=false
Keywords=sandbox;world;mining;crafting;blocks;nodes;multiplayer;roleplaying;
diff --git a/misc/minetest.exe.manifest b/misc/minetest.exe.manifest
new file mode 100644
index 000000000..3c32b0f8b
--- /dev/null
+++ b/misc/minetest.exe.manifest
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+ <application xmlns="urn:schemas-microsoft-com:asm.v3">
+ <windowsSettings>
+ <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
+ </windowsSettings>
+ </application>
+</assembly>
diff --git a/po/be/minetest.po b/po/be/minetest.po
index c8a707a8f..25d8bf0af 100644
--- a/po/be/minetest.po
+++ b/po/be/minetest.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: 2013-11-23 17:37+0100\n"
"Last-Translator: Selat <LongExampleTestName@gmail.com>\n"
"Language-Team: Belarusian\n"
@@ -583,6 +583,10 @@ msgid "Particles"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr ""
@@ -931,6 +935,10 @@ msgstr ""
msgid "Use"
msgstr ""
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr ""
@@ -1247,10 +1255,6 @@ msgstr ""
msgid "X Button 2"
msgstr ""
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1317,6 +1321,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1391,6 +1399,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr ""
@@ -1423,6 +1435,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr ""
@@ -1463,6 +1479,10 @@ msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1535,14 +1555,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1689,6 +1709,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1705,6 +1729,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1735,22 +1763,26 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1778,6 +1810,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr ""
@@ -1860,6 +1896,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1920,11 +1964,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2058,12 +2112,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2094,6 +2150,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2122,15 +2187,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2224,6 +2280,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2258,6 +2348,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2417,6 +2515,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2452,7 +2557,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2603,6 +2708,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2635,8 +2755,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2646,8 +2764,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2658,8 +2774,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2669,8 +2783,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3029,6 +3141,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3070,17 +3190,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3092,10 +3216,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr ""
@@ -3136,10 +3256,6 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3344,11 +3460,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3356,7 +3478,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3391,6 +3513,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr ""
@@ -3548,7 +3674,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3585,7 +3711,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3664,10 +3790,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3683,6 +3821,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3698,6 +3842,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3800,10 +3950,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -3929,7 +4075,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
diff --git a/po/ca/minetest.po b/po/ca/minetest.po
index c81cfa76e..eaf350f89 100644
--- a/po/ca/minetest.po
+++ b/po/ca/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-20 13:21+0000\n"
-"Last-Translator: Joan Ciprià Moreno Teodoro <joancipria@gmail.com>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-26 09:14+0000\n"
+"Last-Translator: tonibm19 <bennasar99@gmail.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/minetest/"
"minetest/ca/>\n"
"Language: ca\n"
@@ -17,11 +17,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr "S'ha produït un error en un script Lua, com per exemple un mod :"
+msgstr "S'ha produït un error en un script Lua, com per exemple un mod."
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -412,9 +412,8 @@ msgid "Uninstall selected modpack"
msgstr "Desinstal·lar el paquet de mods seleccionat"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "Adreça / Port:"
+msgstr "Adreça / Port"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -434,16 +433,15 @@ msgstr "Dany activat"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Del. Favorite"
-msgstr ""
+msgstr "Esborra preferit"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Favorite"
-msgstr ""
+msgstr "Preferit"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Nom / Contrasenya:"
+msgstr "Nom / Contrasenya"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -520,9 +518,8 @@ msgid "8x"
msgstr "8x"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Advanced Settings"
-msgstr "Configuració"
+msgstr "Configuració avançada"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
@@ -537,7 +534,6 @@ msgid "Bilinear Filter"
msgstr "Filtre Bilineal"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
msgstr "Mapat de relleu"
@@ -546,9 +542,8 @@ msgid "Change keys"
msgstr "Configurar controls"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Connected Glass"
-msgstr "Connectar"
+msgstr "Vidres connectats"
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
@@ -589,7 +584,7 @@ msgstr "Ningun"
#: builtin/mainmenu/tab_settings.lua
msgid "Normal Mapping"
-msgstr ""
+msgstr "Mapping normal."
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -604,9 +599,13 @@ msgid "Parallax Occlusion"
msgstr "Oclusió de paral·laxi"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "Activar tot"
+msgstr "Partícules"
+
+#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Reiniciar el mon individual"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -984,6 +983,10 @@ msgstr "Activar noclip"
msgid "Use"
msgstr "Utilitzar"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "Premsa una tecla"
@@ -1305,11 +1308,6 @@ msgstr "X Botó 1"
msgid "X Button 2"
msgstr "X Botó 2"
-#: src/keycode.cpp
-#, fuzzy
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
@@ -1399,6 +1397,11 @@ msgid "Active Block Modifier interval"
msgstr "Rang del bloc actiu"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Rang del bloc actiu"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr "Rang del bloc actiu"
@@ -1430,6 +1433,9 @@ msgid ""
"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
"This setting is for the client only and is ignored by the server."
msgstr ""
+"Ajusta la codificació gamma per les taules de llum. Els nombrés nés petits "
+"n'augmentaràn la brillantor.\n"
+"Aquesta configuració només afecta al client, el servidor l'ignora."
#: src/settings_translation_file.cpp
msgid "Advanced"
@@ -1482,6 +1488,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "Automàticament informar a la llista del servidor."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Tecla de retrocés"
@@ -1515,6 +1525,10 @@ msgid "Build inside player"
msgstr "Construir dins el jugador"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Mapat de relleu"
@@ -1540,7 +1554,7 @@ msgstr "Soroll de cova #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Amplada de les coves"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1555,6 +1569,10 @@ msgid "Chat toggle key"
msgstr "Tecla alternativa per al xat"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comands de xat"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1646,6 +1664,15 @@ msgstr "Boira de color"
#: src/settings_translation_file.cpp
msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Llista de mods separada per comes que tenen permís per accedir a les APIs "
+"HTTP,\n"
+"les quals els permeten pujar/descarregar informació de/cap a internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
@@ -1655,15 +1682,6 @@ msgstr ""
"request_insecure_environment ())."
#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Llista de mods separada per comes que tenen permís per accedir a les APIs "
-"HTTP,\n"
-"les quals els permeten pujar/descarregar informació de/cap a internet."
-
-#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Tecla comandament"
@@ -1733,6 +1751,7 @@ msgstr "Controla la pendent i alçada dels turons."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
msgstr ""
+"Controla l'amplada dels túnels, un valor més petit crea túnels més amples."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1819,6 +1838,10 @@ msgid "Default privileges"
msgstr "Privilegis per defecte"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1837,6 +1860,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Retràs per enviar blocs després de col•locarlos"
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1846,11 +1873,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Profunditat davall la qual trobaràs grans coves."
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Profunditat davall la qual podràs trobar coves gegants."
#: src/settings_translation_file.cpp
msgid "Descending speed"
@@ -1867,22 +1894,26 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1910,9 +1941,12 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
-msgstr "Activar MP"
+msgstr "Activar VBO"
#: src/settings_translation_file.cpp
msgid "Enable mod security"
@@ -1993,6 +2027,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2055,11 +2097,23 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Camp de visió mentre s'usa el zoom (en graus)\n"
+"Això requereix el privilegi \"zoom\" en el servidor."
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2193,12 +2247,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2213,9 +2269,8 @@ msgid "Gravity"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "Mods HTTP"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -2230,6 +2285,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2258,15 +2322,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2360,6 +2415,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2394,6 +2483,16 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Interval de repetició del click dret"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilitat del ratolí"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2431,14 +2530,14 @@ msgid "Jumping speed"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for decreasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Tecla per obrir el inventari.\n"
-"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Tecla per disminuir el rang de visió.\n"
+"Mira\n"
+"http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
@@ -2449,14 +2548,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for increasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Tecla per obrir el inventari.\n"
-"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Tecla per incrementar el rang de visió.\n"
+"Mira\n"
+"http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
@@ -2578,6 +2677,17 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tecla per botar.\n"
+"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2613,11 +2723,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla per moure el jugador cap a l'esquerra.\n"
+"Veure http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2765,6 +2879,22 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Rang del bloc actiu"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2797,8 +2927,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2808,8 +2936,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2820,8 +2946,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2831,8 +2955,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2880,14 +3002,12 @@ msgid "Mapgen flags"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat"
-msgstr "Generador de mapes"
+msgstr "Generador de mapes plans"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Generador de mapes"
+msgstr "Amplada de les coves del generador de mapes plans"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
@@ -3195,6 +3315,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3236,17 +3364,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3258,10 +3390,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr ""
@@ -3302,10 +3430,6 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3510,11 +3634,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3522,7 +3652,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3557,6 +3687,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Seleccioneu la ruta"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Tecla dreta"
@@ -3714,7 +3849,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3751,10 +3886,10 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
-"Suavitza la càmera quan estiga movent-se i mirant al seu voltant.\n"
+"Suavitzat de càmara durant el seu moviment.\n"
"Útil per a la gravació de vídeos."
#: src/settings_translation_file.cpp
@@ -3833,10 +3968,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3852,6 +3999,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3866,6 +4019,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"El temps en segons que es pren entre la repetició de clicks drets quan "
+"s'està mantenint el botó dret del ratolí."
+
+#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
@@ -3971,10 +4133,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4049,9 +4207,8 @@ msgid "Walking speed"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Water Features"
-msgstr "Textures de objectes ..."
+msgstr "Característiques de l'aigua"
#: src/settings_translation_file.cpp
msgid "Water level"
@@ -4101,7 +4258,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4180,6 +4337,8 @@ msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
+"Directori del món (totes les seves dades es guarden aquí).\n"
+"No necessari si s'inicia des de el menú principal."
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
@@ -4201,14 +4360,14 @@ msgstr ""
msgid "cURL timeout"
msgstr ""
-#~ msgid "No!!!"
-#~ msgstr "No!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generar Mapes Normals"
+#~ msgid "No of course not!"
+#~ msgstr "No, per descomptat que no!"
#~ msgid "Public Serverlist"
#~ msgstr "Llista de servidors públics"
-#~ msgid "No of course not!"
-#~ msgstr "No, per descomptat que no!"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generar Mapes Normals"
+
+#~ msgid "No!!!"
+#~ msgstr "No!!!"
diff --git a/po/cs/minetest.po b/po/cs/minetest.po
index a3d57a4d3..c7d1720f0 100644
--- a/po/cs/minetest.po
+++ b/po/cs/minetest.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-04 04:45+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-25 11:59+0000\n"
"Last-Translator: Jakub Vaněk <vanek.jakub4@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/minetest/minetest/"
"cs/>\n"
@@ -17,7 +17,7 @@ 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 2.5-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -214,7 +214,7 @@ msgstr "(Nebyl zadán popis nastavení)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr ""
+msgstr "< Zpět do Nastavení"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
@@ -406,9 +406,8 @@ msgid "Uninstall selected modpack"
msgstr "Odinstalovat oznaÄený balíÄek"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "Adresa / Port :"
+msgstr "Adresa / Port"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -432,14 +431,12 @@ msgid "Del. Favorite"
msgstr "Oblíbené:"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Favorite"
-msgstr "Oblíbené:"
+msgstr "Oblíbené"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Jméno / Heslo :"
+msgstr "Jméno / Heslo"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -485,7 +482,7 @@ msgstr "Veřejný"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Select World:"
-msgstr "Vyber svět:"
+msgstr "Vyberte svět:"
#: builtin/mainmenu/tab_server.lua
msgid "Server"
@@ -501,20 +498,19 @@ msgstr "Spustit hru"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
-msgstr ""
+msgstr "2x"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "3D Clouds"
msgstr "3D mraky"
#: builtin/mainmenu/tab_settings.lua
msgid "4x"
-msgstr ""
+msgstr "4x"
#: builtin/mainmenu/tab_settings.lua
msgid "8x"
-msgstr ""
+msgstr "8x"
#: builtin/mainmenu/tab_settings.lua
msgid "Advanced Settings"
@@ -522,14 +518,13 @@ msgstr "PokroÄilá nastavení"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr ""
+msgstr "Antialiasing:"
#: builtin/mainmenu/tab_settings.lua
msgid "Are you sure to reset your singleplayer world?"
msgstr "Jste si jisti, že chcete resetovat místní svět?"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bilinear Filter"
msgstr "Bilineární filtrování"
@@ -565,7 +560,7 @@ msgstr "Ne"
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr "Žádné filtr"
+msgstr "Žádné filtrování"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
@@ -573,12 +568,11 @@ msgstr "Žádné Mipmapy"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr "Zvýraznění bloků"
+msgstr "Osvícení bloku"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
-msgstr "Zvýraznění bloků"
+msgstr "Obrys bloku"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
@@ -599,12 +593,15 @@ msgstr "Neprůhledná voda"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Parallax Occlusion"
-msgstr "Parallax Occlusion"
+msgstr "Paralaxní okluze"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "Povolit Äástice"
+msgstr "Částice"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reset místního světa"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -619,7 +616,6 @@ msgid "Simple Leaves"
msgstr "Jednoduché listí"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Smooth Lighting"
msgstr "Plynulé osvětlení"
@@ -640,22 +636,18 @@ msgid "Touchthreshold (px)"
msgstr "Dosah dotyku (px)"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Trilinear Filter"
msgstr "Trilineární filtrování"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Leaves"
msgstr "Vlnění listů"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Plants"
msgstr "Vlnění rostlin"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Water"
msgstr "Vlnění vody"
@@ -988,6 +980,10 @@ msgstr "Duch"
msgid "Use"
msgstr "Použít"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Přiblížení"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "stiskni klávesu"
@@ -1304,10 +1300,6 @@ msgstr "X TlaÄítko 1"
msgid "X Button 2"
msgstr "X TlaÄítko 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Přiblížení"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1386,6 +1378,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1443,7 +1439,7 @@ msgstr "Anizotropní filtrování"
#: src/settings_translation_file.cpp
msgid "Announce server"
-msgstr ""
+msgstr "Zveřejnit server"
#: src/settings_translation_file.cpp
msgid ""
@@ -1451,6 +1447,9 @@ msgid ""
"If you want to announce your ipv6 address, use serverlist_url = v6.servers."
"minetest.net."
msgstr ""
+"Zveřejnit do tohoto seznamu serverů.\n"
+"Jestliže chcete zveřejnit vaši ipv6 adresu, použijte serverlist_url = v6."
+"servers.minetest.net."
#: src/settings_translation_file.cpp
msgid "Approximate (X,Y,Z) scale of fractal in nodes."
@@ -1465,6 +1464,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "Automaticky hlásit seznamu serverů."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Vzad"
@@ -1477,9 +1480,8 @@ msgid "Basic"
msgstr "Základní"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic Privileges"
-msgstr "Výchozí práva"
+msgstr "Základní práva"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
@@ -1498,16 +1500,20 @@ msgid "Build inside player"
msgstr "StavÄ›ní uvnitÅ™ hráÄe"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bump mapování"
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
-msgstr ""
+msgstr "Plynulost pohybu kamery"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Plynulost pohybu kamery ve filmovém režimu"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
@@ -1522,9 +1528,8 @@ msgid "Cave noise #2"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cave width"
-msgstr "Šířka obrazovky"
+msgstr "Šířka jeskyně"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1539,6 +1544,10 @@ msgid "Chat toggle key"
msgstr "Klávesa zobrazení chatu"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Příkazy"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1611,19 +1620,20 @@ msgstr "Barevná mlha"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
-"Seznam důvÄ›ryhodných modů oddÄ›lených Äárkami, které mohou používat "
-"potenciálnÄ› nebezpeÄné\n"
-"funkce ve chvílích, kdy je zapnuto zabezpeÄení modů (pomocí "
-"request_insecure_environment())."
+"Seznam modů, oddÄ›lených Äárkami, které mohou pÅ™istupovat k HTTP API,\n"
+"které jim dovoluje nahrávat a stahovat data na/z internetu."
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
+"Seznam důvÄ›ryhodných modů, oddÄ›lených Äárkami, které mohou používat\n"
+"nebezpeÄné funkce i když je zapnuto zabezpeÄení modů (pomocí "
+"request_insecure_environment())."
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -1655,11 +1665,11 @@ msgstr "Klávesa konzole"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
-msgstr ""
+msgstr "Neustálý pohyb vpřed"
#: src/settings_translation_file.cpp
msgid "Continuous forward movement (only used for testing)."
-msgstr ""
+msgstr "Neustálý pohyb vpřed (jen pro testování)."
#: src/settings_translation_file.cpp
msgid "Controls"
@@ -1691,7 +1701,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Ovládá šířku tunelů, menší hodnota vytváří širší tunely."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1711,23 +1721,23 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
-msgstr ""
+msgstr "Průhlednost zaměřovaÄe"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Průhlednost zaměřovaÄe (mezi 0 a 255)."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
-msgstr ""
+msgstr "Barva zaměřovaÄe"
#: src/settings_translation_file.cpp
msgid "Crosshair color (R,G,B)."
-msgstr ""
+msgstr "Barva zaměřovaÄe (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Crouch speed"
-msgstr ""
+msgstr "Rychlost při plížení"
#: src/settings_translation_file.cpp
msgid "DPI"
@@ -1774,6 +1784,10 @@ msgid "Default privileges"
msgstr "Výchozí práva"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1790,6 +1804,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr "Definuje maximální posun hráÄe v blocích (0 = bez limitu)."
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "Prodleva před zobrazením bublinové nápovědy, uvádějte v milisekundách."
@@ -1799,11 +1817,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Hloubka pod kterou najdete velké jeskyně."
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Hloubka pod kterou najdete obrovské jeskyně."
#: src/settings_translation_file.cpp
msgid "Descending speed"
@@ -1822,14 +1840,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Detailní profilovací data modů. UžiteÄné pro vývojáře modů."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Detailní profilování modů"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1841,6 +1851,18 @@ msgid "Disable anticheat"
msgstr "Zakázat anticheat"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Zakázat prázdná hesla"
@@ -1865,6 +1887,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "Povolit VBO"
@@ -1954,6 +1980,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2016,11 +2050,23 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Zorné pole při postupném přibližování.\n"
+"Vyžaduje na serveru přidělené právo \"zoom\"."
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2091,7 +2137,7 @@ msgstr "Velikost písma"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
-msgstr ""
+msgstr "Formát snímků obrazovky."
#: src/settings_translation_file.cpp
msgid "Forward key"
@@ -2147,19 +2193,21 @@ msgstr "Gamma"
#: src/settings_translation_file.cpp
msgid "General"
-msgstr ""
+msgstr "Hlavní"
#: src/settings_translation_file.cpp
msgid "Generate normalmaps"
msgstr "Generovat normálové mapy"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2190,6 +2238,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2207,7 +2264,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr ""
+msgstr "Jak hluboké dělat řeky"
#: src/settings_translation_file.cpp
msgid ""
@@ -2218,22 +2275,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
msgid "How wide to make rivers"
-msgstr ""
+msgstr "Jak široké dělat řeky"
#: src/settings_translation_file.cpp
msgid "IPv6"
@@ -2301,7 +2349,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Jestliže je toto nastaveno, hráÄi se budou oživovat na uvedeném místÄ›."
#: src/settings_translation_file.cpp
msgid "Ignore world errors"
@@ -2320,6 +2368,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2337,7 +2419,7 @@ msgstr "Klávesa inventáře"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
-msgstr ""
+msgstr "Invertovat myš"
#: src/settings_translation_file.cpp
msgid "Invert vertical mouse movement."
@@ -2354,6 +2436,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2388,7 +2478,7 @@ msgstr "Skok"
#: src/settings_translation_file.cpp
msgid "Jumping speed"
-msgstr ""
+msgstr "Rychlost skákání"
#: src/settings_translation_file.cpp
msgid ""
@@ -2513,6 +2603,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2548,7 +2645,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2597,7 +2694,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Klávesa Použít pro šplhání/slézání"
#: src/settings_translation_file.cpp
msgid "Language"
@@ -2605,15 +2702,15 @@ msgstr "Jazyk"
#: src/settings_translation_file.cpp
msgid "Large cave depth"
-msgstr ""
+msgstr "Hloubka velké jeskyně"
#: src/settings_translation_file.cpp
msgid "Lava Features"
-msgstr ""
+msgstr "Vlastnosti lávy"
#: src/settings_translation_file.cpp
msgid "Leaves style"
-msgstr ""
+msgstr "Styl listí"
#: src/settings_translation_file.cpp
msgid ""
@@ -2699,6 +2796,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2731,8 +2843,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2742,8 +2852,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2754,8 +2862,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2765,8 +2871,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2778,7 +2882,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Map save interval"
-msgstr ""
+msgstr "Interval ukládání mapy"
#: src/settings_translation_file.cpp
msgid "Mapblock limit"
@@ -3082,7 +3186,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Massive cave depth"
-msgstr ""
+msgstr "Hloubka obrovské jeskyně"
#: src/settings_translation_file.cpp
msgid "Massive cave noise"
@@ -3114,7 +3218,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum FPS"
-msgstr ""
+msgstr "Maximální FPS"
#: src/settings_translation_file.cpp
msgid "Maximum FPS when game is paused."
@@ -3129,6 +3233,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3170,17 +3282,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3192,10 +3308,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Nabídky"
@@ -3205,7 +3317,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Message of the day"
-msgstr ""
+msgstr "Zpráva dne"
#: src/settings_translation_file.cpp
msgid "Message of the day displayed to players connecting."
@@ -3217,7 +3329,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Minimap"
-msgstr ""
+msgstr "Minimapa"
#: src/settings_translation_file.cpp
msgid "Minimap key"
@@ -3229,17 +3341,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Minimum texture size for filters"
-msgstr ""
+msgstr "Minimální velikost textury k filtrování"
#: src/settings_translation_file.cpp
msgid "Mipmapping"
msgstr "Mip-mapování"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3253,15 +3361,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Monospace font path"
-msgstr ""
+msgstr "Cesta k neproporcionálnímu písmu"
#: src/settings_translation_file.cpp
msgid "Monospace font size"
-msgstr ""
+msgstr "Velikost neproporcionálního písma"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Citlivost myši"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity multiplier."
@@ -3299,7 +3407,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Network"
-msgstr ""
+msgstr "Síť"
#: src/settings_translation_file.cpp
msgid ""
@@ -3445,11 +3553,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3457,7 +3571,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3492,24 +3606,29 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Cesta k písmu"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Klávesa doprava"
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
-msgstr ""
+msgstr "Interval opakování pravého kliknutí"
#: src/settings_translation_file.cpp
msgid "River Depth"
-msgstr ""
+msgstr "Hloubka řeky"
#: src/settings_translation_file.cpp
msgid "River Noise"
-msgstr ""
+msgstr "HluÄnost Å™eky"
#: src/settings_translation_file.cpp
msgid "River Size"
-msgstr ""
+msgstr "Velikost řeky"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
@@ -3557,14 +3676,12 @@ msgid "Screenshot folder"
msgstr "Složka se snímky obrazovky"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Složka se snímky obrazovky"
+msgstr "Formát snímků obrazovky"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Snímek obrazovky"
+msgstr "Kvalita snímků obrazovky"
#: src/settings_translation_file.cpp
msgid ""
@@ -3572,6 +3689,9 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"Kvalita snímků obrazovky. Použito jen na formát JPEG.\n"
+"1 znamená nejhorší kvalita; 100 znamená nejlepší kvalita.\n"
+"Použijte 0 pro výchozí kvalitu."
#: src/settings_translation_file.cpp
msgid "Security"
@@ -3587,11 +3707,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Selection box color"
-msgstr ""
+msgstr "Barva obrysu bloku"
#: src/settings_translation_file.cpp
msgid "Selection box width"
-msgstr ""
+msgstr "Šířka obrysu bloku"
#: src/settings_translation_file.cpp
msgid "Server / Singleplayer"
@@ -3651,7 +3771,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3670,7 +3790,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Shutdown message"
-msgstr ""
+msgstr "Zpráva o vypnutí"
#: src/settings_translation_file.cpp
msgid ""
@@ -3688,7 +3808,7 @@ msgstr "Plynulé osvětlení"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3718,7 +3838,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Static spawnpoint"
-msgstr ""
+msgstr "Stálé místo oživení"
#: src/settings_translation_file.cpp
msgid "Strength of generated normalmaps."
@@ -3734,7 +3854,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "Podpora starších serverů"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
@@ -3767,10 +3887,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3786,6 +3918,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3801,6 +3939,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3825,7 +3969,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Time speed"
-msgstr ""
+msgstr "Rychlost Äasu"
#: src/settings_translation_file.cpp
msgid "Timeout for client to remove unused map data from memory."
@@ -3845,7 +3989,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Tooltip delay"
-msgstr ""
+msgstr "Zpoždění nápovědy"
#: src/settings_translation_file.cpp
msgid "Trilinear filtering"
@@ -3860,7 +4004,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Trusted mods"
-msgstr ""
+msgstr "Důvěryhodné mody"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
@@ -3903,10 +4047,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "UžiteÄné pro vývojáře modů."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr "Vertikální synchronizace"
@@ -3986,7 +4126,7 @@ msgstr "Vlastnosti vody"
#: src/settings_translation_file.cpp
msgid "Water level"
-msgstr ""
+msgstr "Hladina vody"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
@@ -4032,7 +4172,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4132,114 +4272,120 @@ msgstr "cURL limit paralelních stahování"
msgid "cURL timeout"
msgstr "cURL timeout"
-#~ msgid "Preload inventory textures"
-#~ msgstr "PÅ™ednaÄíst inventářové textury"
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Detailní profilovací data modů. UžiteÄné pro vývojáře modů."
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Reset místního světa"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Detailní profilování modů"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Měřítko aplikované na prvky menu: "
+#~ msgid "Useful for mod developers."
+#~ msgstr "UžiteÄné pro vývojáře modů."
-#~ msgid "Touch free target"
-#~ msgstr "Středový kurzor"
+#~ msgid "No of course not!"
+#~ msgstr "Jistě že ne!"
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#~ msgid "Public Serverlist"
+#~ msgstr "Seznam veřejných serverů"
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generovat normálové mapy"
-#~ msgid "Downloading"
-#~ msgstr "Stahuji"
+#~ msgid "No!!!"
+#~ msgstr "Ne!!!"
-#~ msgid "Game Name"
-#~ msgstr "Název hry"
+#~ msgid "\""
+#~ msgstr "\""
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Nepovedlo se zkopírovat mod \"$1\" do hry \"$2\""
+#~ msgid "If disabled "
+#~ msgstr "Je-li zakázáno "
-#~ msgid "GAMES"
-#~ msgstr "HRY"
+#~ msgid "If enabled, "
+#~ msgstr "Je-li povoleno, "
-#~ msgid "Mods:"
-#~ msgstr "Mody:"
+#~ msgid "Rendering:"
+#~ msgstr "Renderování:"
-#~ msgid "new game"
-#~ msgstr "nová hra"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Aby se zmÄ›na ovladaÄe projevila, restartujte Minetest"
-#~ msgid "EDIT GAME"
-#~ msgstr "UPRAVIT HRU"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Levý klik: Přesunout všechny předměty, Pravý klik: Přesunout jeden předmět"
-#~ msgid "Remove selected mod"
-#~ msgstr "Odstranit vybraný mod"
+#~ msgid "Local install"
+#~ msgstr "Místní instalace"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Přidat mod"
+#~ msgid "Add mod:"
+#~ msgstr "Přidat mod:"
-#~ msgid "CLIENT"
-#~ msgstr "KLIENT"
+#~ msgid "MODS"
+#~ msgstr "MODY"
-#~ msgid "START SERVER"
-#~ msgstr "MÃSTNÃ SERVER"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "BALÃÄŒKY TEXTUR"
-#~ msgid "Name"
-#~ msgstr "Jméno"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "HRA JEDNOHO HRÃÄŒE"
-#~ msgid "Password"
-#~ msgstr "Heslo"
+#~ msgid "Finite Liquid"
+#~ msgstr "KoneÄná voda"
+
+#~ msgid "Preload item visuals"
+#~ msgstr "PÅ™ednaÄíst textury pÅ™edmÄ›tů"
#~ msgid "SETTINGS"
#~ msgstr "NASTAVENÃ"
-#~ msgid "Preload item visuals"
-#~ msgstr "PÅ™ednaÄíst textury pÅ™edmÄ›tů"
+#~ msgid "Password"
+#~ msgstr "Heslo"
-#~ msgid "Finite Liquid"
-#~ msgstr "KoneÄná voda"
+#~ msgid "Name"
+#~ msgstr "Jméno"
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "HRA JEDNOHO HRÃÄŒE"
+#~ msgid "START SERVER"
+#~ msgstr "MÃSTNÃ SERVER"
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "BALÃÄŒKY TEXTUR"
+#~ msgid "CLIENT"
+#~ msgstr "KLIENT"
-#~ msgid "MODS"
-#~ msgstr "MODY"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Přidat mod"
-#~ msgid "Add mod:"
-#~ msgstr "Přidat mod:"
+#~ msgid "Remove selected mod"
+#~ msgstr "Odstranit vybraný mod"
-#~ msgid "Local install"
-#~ msgstr "Místní instalace"
+#~ msgid "EDIT GAME"
+#~ msgstr "UPRAVIT HRU"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Levý klik: Přesunout všechny předměty, Pravý klik: Přesunout jeden předmět"
+#~ msgid "new game"
+#~ msgstr "nová hra"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Aby se zmÄ›na ovladaÄe projevila, restartujte Minetest"
+#~ msgid "Mods:"
+#~ msgstr "Mody:"
-#~ msgid "Rendering:"
-#~ msgstr "Renderování:"
+#~ msgid "GAMES"
+#~ msgstr "HRY"
-#~ msgid "If enabled, "
-#~ msgstr "Je-li povoleno, "
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Nepovedlo se zkopírovat mod \"$1\" do hry \"$2\""
-#~ msgid "If disabled "
-#~ msgstr "Je-li zakázáno "
+#~ msgid "Game Name"
+#~ msgstr "Název hry"
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "Downloading"
+#~ msgstr "Stahuji"
-#~ msgid "No!!!"
-#~ msgstr "Ne!!!"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generovat normálové mapy"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
-#~ msgid "Public Serverlist"
-#~ msgstr "Seznam veřejných serverů"
+#~ msgid "Touch free target"
+#~ msgstr "Středový kurzor"
-#~ msgid "No of course not!"
-#~ msgstr "Jistě že ne!"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Měřítko aplikované na prvky menu: "
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "PÅ™ednaÄíst inventářové textury"
diff --git a/po/da/minetest.po b/po/da/minetest.po
index 6337ba14e..b1aa649ba 100644
--- a/po/da/minetest.po
+++ b/po/da/minetest.po
@@ -1,23 +1,23 @@
-# German translations for minetest-c55 package.
-# Copyright (C) 2011 celeron
-# This file is distributed under the same license as the minetest-c55 package.
-# Frederik Helth <Guides@live.dk>, 2011.
-#
+# German translations for minetest-c55 package.
+# Copyright (C) 2011 celeron
+# This file is distributed under the same license as the minetest-c55 package.
+# Frederik Helth <Guides@live.dk>, 2011.
+#
msgid ""
msgstr ""
"Project-Id-Version: 0.0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-06 13:58+0000\n"
-"Last-Translator: Thomas Wagner Nielsen <thomas@viawords.com>\n"
-"Language-Team: Danish "
-"<https://hosted.weblate.org/projects/minetest/minetest/da/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-24 16:48+0100\n"
+"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
+"Language-Team: Danish <https://hosted.weblate.org/projects/minetest/minetest/"
+"da/>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -132,7 +132,7 @@ msgstr "aktiveret"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr "En verden med navnet \"$1\" eksisterer allerede"
+msgstr "En verden med navnet »$1« findes allerede"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
@@ -140,7 +140,7 @@ msgstr "Skab"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Hent et subgame, så som minetest_game fra minetest.net"
+msgstr "Hent et underspil, såsom minetest_game fra minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
@@ -155,7 +155,6 @@ msgid "Mapgen"
msgstr "Mapgen"
#: builtin/mainmenu/dlg_create_world.lua
-#, fuzzy
msgid "No worldname given or no game selected"
msgstr "Intet navn på verden angivet eller intet spil valgt"
@@ -178,7 +177,7 @@ msgstr "Du har ikke installeret nogle subgames."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr "Er du sikker på du vil slette \"$1\"?"
+msgstr "Er du sikker på, at du vil slette »$1«?"
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
@@ -215,12 +214,10 @@ msgid "(No description of setting given)"
msgstr "(Der er ikke nogen beskrivelse af denne indstilling)"
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid "< Back to Settings page"
msgstr "< Tilbage til siden Indstillinger"
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid "Browse"
msgstr "Gennemse"
@@ -259,7 +256,7 @@ msgstr "Mods"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
-msgstr ""
+msgstr "Valgfrit kan »lacunarity'en« tilføjes med et foranstillet komma."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a comma seperated list of flags."
@@ -436,14 +433,12 @@ msgid "Del. Favorite"
msgstr "Vis favoritter"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Favorite"
-msgstr "Vis favoritter"
+msgstr "Favorit"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Navn/kodeord:"
+msgstr "Navn/adgangskode"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -451,7 +446,7 @@ msgstr "Spiller mod spiller aktiveret"
#: builtin/mainmenu/tab_server.lua
msgid "Bind Address"
-msgstr ""
+msgstr "Bind adresse"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Configure"
@@ -476,9 +471,8 @@ msgid "New"
msgstr "Ny"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
-#, fuzzy
msgid "No world created or selected!"
-msgstr "Ingen verden skabt eller valgt!"
+msgstr "Ingen verden oprettet eller valgt!"
#: builtin/mainmenu/tab_server.lua
#, fuzzy
@@ -506,7 +500,6 @@ msgid "Start Game"
msgstr "Start spil / Forbind"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "2x"
msgstr "2x"
@@ -515,12 +508,10 @@ msgid "3D Clouds"
msgstr "3D-skyer"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "4x"
msgstr "4x"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "8x"
msgstr "8x"
@@ -530,7 +521,7 @@ msgstr "Avancerede indstillinger"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr ""
+msgstr "Udjævning:"
#: builtin/mainmenu/tab_settings.lua
msgid "Are you sure to reset your singleplayer world?"
@@ -554,18 +545,17 @@ msgid "Connected Glass"
msgstr "Forbundet glas"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Fancy Leaves"
-msgstr "Opakt (uigennemsigtigt) vand"
+msgstr "Smukke blade"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Mipmap"
-msgstr "Mip-mapping"
+msgstr "Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
-msgstr ""
+msgstr "Mipmap + Aniso-filter"
#: builtin/mainmenu/tab_settings.lua
msgid "No"
@@ -576,47 +566,44 @@ msgid "No Filter"
msgstr "Intet filter"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "No Mipmap"
-msgstr "Mip-mapping"
+msgstr "Ingen Mipmap"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Highlighting"
-msgstr "Glat belysning"
+msgstr "Knudepunktsfremhævelse"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
-msgstr "Glat belysning"
+msgstr "Knudepunktsomrids"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
msgstr "Ingen"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "Mip-mapping"
+msgstr "Normal oversættelse"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Opaque Leaves"
-msgstr "Opakt (uigennemsigtigt) vand"
+msgstr "Uuigennemsigtige blade"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Opaque Water"
-msgstr "Opakt (uigennemsigtigt) vand"
+msgstr "Uigennemsigtigt vand"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Parallax Occlusion"
-msgstr ""
+msgstr "Parallax-okklusion"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "Aktivér partikler"
+msgstr "Partikler"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Nulstil spillerverden"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -624,7 +611,7 @@ msgstr "Indstillinger"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Shaders"
-msgstr "Shadere"
+msgstr "Dybdeskabere"
#: builtin/mainmenu/tab_settings.lua
msgid "Simple Leaves"
@@ -636,39 +623,35 @@ msgstr "Glat belysning"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
-msgstr ""
+msgstr "Teksturering:"
#: builtin/mainmenu/tab_settings.lua
msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "For at aktivere dybdeskabere skal OpenGL-driveren bruges."
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
msgid "Tone Mapping"
-msgstr "Mip-mapping"
+msgstr "Toneoversættelse"
#: builtin/mainmenu/tab_settings.lua
msgid "Touchthreshold (px)"
-msgstr ""
+msgstr "Føletærskel (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
msgstr "Tri-lineær filtréring"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Leaves"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende blade"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Plants"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende planter"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Water"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende vand"
#: builtin/mainmenu/tab_settings.lua
msgid "Yes"
@@ -700,11 +683,11 @@ msgstr "Der er ikke nogen information tilgængelig"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Select texture pack:"
-msgstr ""
+msgstr "Vælg teksturpakke:"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Texturepacks"
-msgstr ""
+msgstr "Teksturpakker"
#: src/client.cpp
msgid "Connection timed out."
@@ -724,11 +707,11 @@ msgstr "Initialiserer noder..."
#: src/client.cpp
msgid "Loading textures..."
-msgstr ""
+msgstr "Indlæser teksturer..."
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "Genbygger dybdeskabere ..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -756,13 +739,12 @@ msgid "Player name too long."
msgstr "Spillerens navn er for langt."
#: src/client/clientlauncher.cpp
-#, fuzzy
msgid "Provided world path doesn't exist: "
-msgstr "Den angivne sti til verdenen findes ikke: "
+msgstr "Angivne sti til verdenen findes ikke: "
#: src/fontengine.cpp
msgid "needs_fallback_font"
-msgstr ""
+msgstr "kræver_reserve_skrifttype"
#: src/game.cpp
msgid ""
@@ -789,17 +771,14 @@ msgid "Continue"
msgstr "Fortsæt"
#: src/game.cpp
-#, fuzzy
msgid "Creating client..."
-msgstr "Opretter klient..."
+msgstr "Opretter klient ..."
#: src/game.cpp
-#, fuzzy
msgid "Creating server..."
-msgstr "Opretter server..."
+msgstr "Opretter server ..."
#: src/game.cpp
-#, fuzzy
msgid ""
"Default Controls:\n"
"- WASD: move\n"
@@ -813,7 +792,7 @@ msgid ""
"- Mouse wheel: select item\n"
"- T: chat\n"
msgstr ""
-"Standard-styring:\n"
+"Standardstyring:\n"
"- WASD: Bevæge sig rundt\n"
"- Mellemrumstast: Hoppe/klatre\n"
"- Skift: Snige/gå nedad\n"
@@ -823,10 +802,9 @@ msgstr ""
"- Mus venstre: Grave/slå\n"
"- Mus højre: Placere/bruge\n"
"- Musehjul: Vælge genstand\n"
-"- T: Chat\n"
+"- T: Snakke (chat)\n"
#: src/game.cpp
-#, fuzzy
msgid ""
"Default Controls:\n"
"No menu visible:\n"
@@ -841,7 +819,7 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
-"Standard-styring:\n"
+"Standardstyring:\n"
"Ingen menu synlig:\n"
"- Enkelt tryk: Aktivér knap\n"
"- Dobbelt tryk: Placér/brug\n"
@@ -864,10 +842,9 @@ msgstr "Afslut til operativsystemet"
#: src/game.cpp
msgid "Item definitions..."
-msgstr ""
+msgstr "Elementdefinitioner ..."
#: src/game.cpp
-#, fuzzy
msgid "KiB/s"
msgstr "KiB/s"
@@ -876,18 +853,16 @@ msgid "Media..."
msgstr "Medier..."
#: src/game.cpp
-#, fuzzy
msgid "MiB/s"
msgstr "MiB/s"
#: src/game.cpp
-#, fuzzy
msgid "Node definitions..."
-msgstr "Blokdefinitioner..."
+msgstr "Knudepunktsdefinitioner ..."
#: src/game.cpp
msgid "Resolving address..."
-msgstr ""
+msgstr "Slår adresse op ..."
#: src/game.cpp
msgid "Respawn"
@@ -911,7 +886,7 @@ msgstr "ok"
#: src/guiFormSpecMenu.cpp
msgid "Enter "
-msgstr ""
+msgstr " "
#: src/guiFormSpecMenu.cpp
msgid "Proceed"
@@ -990,9 +965,8 @@ msgid "Sneak"
msgstr "Snige"
#: src/guiKeyChangeMenu.cpp
-#, fuzzy
msgid "Toggle Cinematic"
-msgstr "Omstil hurtig"
+msgstr "Aktiver filmisk"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle fast"
@@ -1010,6 +984,10 @@ msgstr "Omstil fylde"
msgid "Use"
msgstr "Brug"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "Tryk på en tast"
@@ -1035,18 +1013,16 @@ msgid "Passwords do not match!"
msgstr "Kodeordene er ikke ens!"
#: src/guiVolumeChange.cpp
-#, fuzzy
msgid "Exit"
msgstr "Afslut"
#: src/guiVolumeChange.cpp
-#, fuzzy
msgid "Sound Volume: "
msgstr "Lydstyrke: "
#: src/keycode.cpp
msgid "Apps"
-msgstr "Apps"
+msgstr "Prg."
#: src/keycode.cpp
msgid "Attn"
@@ -1057,7 +1033,6 @@ msgid "Back"
msgstr "Tilbage"
#: src/keycode.cpp
-#, fuzzy
msgid "Capital"
msgstr "Store bogstaver"
@@ -1306,9 +1281,8 @@ msgid "Sleep"
msgstr "Sov"
#: src/keycode.cpp
-#, fuzzy
msgid "Snapshot"
-msgstr "Tilstandsbillede"
+msgstr "Øjebliksbillede"
#: src/keycode.cpp
msgid "Space"
@@ -1330,10 +1304,6 @@ msgstr "X knap 1"
msgid "X Button 2"
msgstr "X knap 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1342,20 +1312,24 @@ msgid ""
"sets.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"(X,Y,Z)-forskydning for fraktal fra verdencentrum i enheder af »skala«.\n"
+"Brugt til at flytte en egnet udlægning af lavt land tæt på (0, 0).\n"
+"Standarden er egnet til mandelbrot-sæt, skal redigeres for julia-sæt.\n"
+"Interval cirka -2 til 2. Gang med »skala« i knudepunkter."
#: src/settings_translation_file.cpp
msgid ""
"0 = parallax occlusion with slope information (faster).\n"
"1 = relief mapping (slower, more accurate)."
msgstr ""
+"0 = parallax-okklusion med kurveinformation (hurtigere).\n"
+"1 = relief-oversættelse (langsommere, mere præcis)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "3D clouds"
-msgstr "3D skyer"
+msgstr "3D-skyer"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "3D mode"
msgstr "3D-tilstand"
@@ -1370,47 +1344,59 @@ msgid ""
"- sidebyside: split screen side by side.\n"
"- pageflip: quadbuffer based 3d."
msgstr ""
+"Understøttelse af 3D.\n"
+"Understøttet på nuværende tidspunkt:\n"
+"- none: ingen 3d-udgang.\n"
+"- anaglyph: cyan/magenta farve 3d.\n"
+"- interlaced: ulige/lige linjebaseret polarisering for "
+"skærmunderstøttelsen\n"
+"- topbottom: opdel skærm top/bund.\n"
+"- sidebyside: opdel skærm side om side.\n"
+"- pageflip: quadbuffer baseret 3d."
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
+"En valgt kortfødning for et nyt kort, efterlad tom for vilkårlig.\n"
+"Vil blive overskrevet når en ny verden oprettes i hovedmenuen."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "A message to be displayed to all clients when the server crashes."
msgstr "Besked, som skal vises til alle klienter, når serveren går ned."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "A message to be displayed to all clients when the server shuts down."
msgstr "Besked, som skal vises til alle klienter, når serveren lukker ned."
#: src/settings_translation_file.cpp
msgid "Absolute limit of emerge queues"
-msgstr ""
+msgstr "Absolut begrænsning af fremkomstkøer"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Acceleration in air"
msgstr "Acceleration i luft"
#: src/settings_translation_file.cpp
msgid "Active Block Management interval"
-msgstr ""
+msgstr "Aktiv blokhåndteringsinterval"
#: src/settings_translation_file.cpp
msgid "Active Block Modifier interval"
-msgstr ""
+msgstr "Aktivt blokændringsinterval"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Aktive blokændringer"
#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr ""
+msgstr "Aktiv blokinterval"
#: src/settings_translation_file.cpp
msgid "Active object send range"
-msgstr ""
+msgstr "Aktivt objektafsendelsesinterval"
#: src/settings_translation_file.cpp
msgid ""
@@ -1418,14 +1404,16 @@ msgid ""
"Leave this blank to start a local server.\n"
"Note that the address field in the main menu overrides this setting."
msgstr ""
+"Adressen, der skal forbindes til.\n"
+"Lad dette være tomt for at starte en lokal server.\n"
+"Bemærk, at adressefeltet i hovedmenuen tilsidesætter denne indstilling."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
-"Justér DPI-konfigurationen til din skærm (ikke-X11 / kun Andorid) f.eks. til "
+"Justér DPI-konfigurationen til din skærm (ikke-X11 / kun Android) f.eks. til "
"4k-skærme."
#: src/settings_translation_file.cpp
@@ -1433,6 +1421,8 @@ msgid ""
"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
"This setting is for the client only and is ignored by the server."
msgstr ""
+"Juster gammakodningen for lystabellerne. Et mindre tal betyder lysere.\n"
+"Denne indstilling gælder kun for klienten og ignoreres af serveren."
#: src/settings_translation_file.cpp
msgid "Advanced"
@@ -1440,30 +1430,27 @@ msgstr "Avanceret"
#: src/settings_translation_file.cpp
msgid "Altitude Chill"
-msgstr ""
+msgstr "Højdekulde"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Always fly and fast"
msgstr "Flyv altid og hurtigt"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
-msgstr ""
+msgstr "Ambient okklusiongamma"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Amplifies the valleys"
msgstr "Forstærker dalene"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Anisotropic filtering"
-msgstr "Anisotropisk filtréring"
+msgstr "Anisotropisk filtrering"
#: src/settings_translation_file.cpp
msgid "Announce server"
-msgstr ""
+msgstr "Meddelelsesserver"
#: src/settings_translation_file.cpp
msgid ""
@@ -1471,55 +1458,61 @@ msgid ""
"If you want to announce your ipv6 address, use serverlist_url = v6.servers."
"minetest.net."
msgstr ""
+"Meddel på denne serverliste\n"
+"Hvis du ønsker at annoncere din ipv6-adresse, så brug serverlist_url = v6."
+"servers.minetest.net."
#: src/settings_translation_file.cpp
msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr ""
+msgstr "Omtrentlig (X, Y, Z) fraktalskala i knudepunkter."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Ask to reconnect after crash"
-msgstr "Spørg om at forbinde igen, efter den er gået ned."
+msgstr "Spørg om at forbinde igen efter nedbrud"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Automaticaly report to the serverlist."
-msgstr "Rapportér automatisk til serverlisten."
+msgstr "Rapporter automatisk til serverlisten."
+
+#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Tast til automatisk løb"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Backward key"
-msgstr "Baglæns"
+msgstr "Tilbage-tast"
#: src/settings_translation_file.cpp
msgid "Base terrain height"
-msgstr ""
+msgstr "Baseterrænhøjde"
#: src/settings_translation_file.cpp
msgid "Basic"
-msgstr ""
+msgstr "Grundlæggende"
#: src/settings_translation_file.cpp
msgid "Basic Privileges"
-msgstr ""
+msgstr "Grundlæggende privilegier"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bilinear filtering"
-msgstr "Bi-lineær filtréring"
+msgstr "Bilineær filtrering"
#: src/settings_translation_file.cpp
msgid "Bind address"
-msgstr ""
+msgstr "Bind adresse"
#: src/settings_translation_file.cpp
msgid "Bits per pixel (aka color depth) in fullscreen mode."
-msgstr ""
+msgstr "Bit per billedpunkt (a.k.a. farvedybde) i fuldskærmtilstand."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Build inside player"
-msgstr "Flerspiller"
+msgstr "Byg intern spiller"
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Indbygget"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -1528,41 +1521,43 @@ msgstr "Mip-mapping"
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
-msgstr ""
+msgstr "Kameraudjævning"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Kameraudjævning i biograftilstand"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
-msgstr ""
+msgstr "Tast til ændring af kameraopdatering"
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
-msgstr ""
+msgstr "Hulestøj #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
-msgstr ""
+msgstr "Hulestøj #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Grottebredde"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr ""
+msgstr "Huler og tunneler dannes ved skæringspunktet for de to støjkilder"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat key"
-msgstr "Skift bindinger"
+msgstr "Snakketast"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat toggle key"
-msgstr "Skift bindinger"
+msgstr "Tast for snak (chat)"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Snakkekommandoer"
#: src/settings_translation_file.cpp
msgid ""
@@ -1586,40 +1581,57 @@ msgid ""
"17 = 4D \"Mandelbulb\" mandelbrot set.\n"
"18 = 4D \"Mandelbulb\" julia set."
msgstr ""
+"Valg af 18 fraktaler fra 9 formler.\n"
+"1 = 4D »Roundy« mandelbrot-sæt.\n"
+"2 = 4D »Roundy« julia-sæt.\n"
+"3 = 4D »Squarry« mandelbrot-sæt.\n"
+"4 = 4D »Squarry\" julia-sæt.\n"
+"5 = 4D »Mandy Cousin« mandelbrot-sæt.\n"
+"6 = 4D »Mandy Cousin« julia-sæt.\n"
+"7 = 4D »Variation« mandelbrot-sæt.\n"
+"8 = 4D »Variation« julia-sæt.\n"
+"9 = 3D »Mandelbrot/Mandelbar« mandelbrot-sæt.\n"
+"10 = 3D »Mandelbrot/Mandelbar« julia-sæt.\n"
+"11 = 3D »Christmas Tree« mandelbrot-sæt.\n"
+"12 = 3D »Christmas Tree« julia-sæt.\n"
+"13 = 3D »Mandelbulb« mandelbrot-sæt.\n"
+"14 = 3D »Mandelbulb« julia-sæt.\n"
+"15 = 3D »Cosine Mandelbulb« mandelbrot-sæt.\n"
+"16 = 3D »Cosine Mandelbulb« julia-sæt.\n"
+"17 = 4D »Mandelbulb« mandelbrot-sæt.\n"
+"18 = 4D »Mandelbulb« julia-sæt."
#: src/settings_translation_file.cpp
msgid "Chunk size"
-msgstr ""
+msgstr "Klumpstørrelse"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cinematic mode"
-msgstr "Kreativ tilstand"
+msgstr "Filmisk tilstand"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cinematic mode key"
-msgstr "Kreativ tilstand"
+msgstr "Tast for filmisk tilstand"
#: src/settings_translation_file.cpp
msgid "Clean transparent textures"
-msgstr ""
+msgstr "Rene gennemsigtige teksturer"
#: src/settings_translation_file.cpp
msgid "Client and Server"
-msgstr ""
+msgstr "Klient og server"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
-msgstr ""
+msgstr "Klatringshastighed"
#: src/settings_translation_file.cpp
msgid "Cloud height"
-msgstr ""
+msgstr "Skyhøjde"
#: src/settings_translation_file.cpp
msgid "Cloud radius"
-msgstr ""
+msgstr "Skyradius"
#: src/settings_translation_file.cpp
msgid "Clouds"
@@ -1627,74 +1639,74 @@ msgstr "Skyer"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
-msgstr ""
+msgstr "Skyer er en klientsideeffekt."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Clouds in menu"
-msgstr "Hovedmenu"
+msgstr "Skyer i menu"
#: src/settings_translation_file.cpp
msgid "Colored fog"
-msgstr ""
+msgstr "Farvet tåge"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
+"Kommaadskilt liste af mod'er som har tilladelse til at tilgå HTTP API'er, "
+"som\n"
+"tillader dem at hente og overføre data fra internettet."
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
+"Kommaadskil liste over troværdige mod'er som har tilladelse til at tilgå "
+"usikre\n"
+"funktioner selv når mod-sikkerhed er aktiveret (via "
+"request_insecure_environment())."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Command key"
-msgstr "Kommando"
+msgstr "Kommandotast"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Connect glass"
-msgstr "Forbind"
+msgstr "Forbind glas"
#: src/settings_translation_file.cpp
msgid "Connect to external media server"
-msgstr ""
+msgstr "Opret forbindelse til ekstern medieserver"
#: src/settings_translation_file.cpp
msgid "Connects glass if supported by node."
-msgstr ""
+msgstr "Forbinder glass hvis understøttet af knudepunkt."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console alpha"
-msgstr "Konsol"
+msgstr "Konsolalfa"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console color"
-msgstr "Konsol"
+msgstr "Konsolfarve"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console key"
-msgstr "Konsol"
+msgstr "Konsoltast"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
-msgstr ""
+msgstr "Kontinuerlig fremad"
#: src/settings_translation_file.cpp
msgid "Continuous forward movement (only used for testing)."
-msgstr ""
+msgstr "Kontinuerlig bevægelse fremad (bruges kun til test)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Controls"
-msgstr "Control"
+msgstr "Styring"
#: src/settings_translation_file.cpp
msgid ""
@@ -1702,158 +1714,170 @@ msgid ""
"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
"unchanged."
msgstr ""
+"Styrer længden af dag-/natcyklussen.\n"
+"Eksempler: 72 = 20 min, 360 = 4 min, 1 = 24 timer, 0 = dag/nat/hvad som "
+"helst forbliver uændret."
#: src/settings_translation_file.cpp
msgid ""
"Controls size of deserts and beaches in Mapgen v6.\n"
"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
msgstr ""
+"Kontroller størrelse for ørkener og strande i Mapgen v6.\n"
+"Når snebiomer er aktiveret ignoreres »mgv6_freq_desert«."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
-msgstr ""
+msgstr "Kontrollerer hældning/dybe for sødybder."
#: src/settings_translation_file.cpp
msgid "Controls steepness/height of hills."
-msgstr ""
+msgstr "Styrer stejlheden/højden af bakkerne."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Styrer bredden af tunneller. En lavere værdi giver bredere tunneller."
#: src/settings_translation_file.cpp
msgid "Crash message"
-msgstr ""
+msgstr "Nedbrudsbesked"
#: src/settings_translation_file.cpp
msgid ""
"Creates unpredictable lava features in caves.\n"
"These can make mining difficult. Zero disables them. (0-10)"
-msgstr ""
+msgstr " "
#: src/settings_translation_file.cpp
msgid ""
"Creates unpredictable water features in caves.\n"
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
+"Opretter uforudsigelige vandfunktioner i huler.\n"
+"Disse kan gøre vanskeliggøre minedrift. Nul deaktiverer dem (0-10)"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
-msgstr ""
+msgstr "Crosshair alpha"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Crosshair alpha (uigennemsigtighed, mellem 0 og 255)."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
-msgstr ""
+msgstr "Crosshair-farve"
#: src/settings_translation_file.cpp
msgid "Crosshair color (R,G,B)."
-msgstr ""
+msgstr "Crosshair-farve (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Crouch speed"
-msgstr ""
+msgstr "Krybehastighed"
#: src/settings_translation_file.cpp
msgid "DPI"
-msgstr ""
+msgstr "DPI"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Damage"
-msgstr "Aktivér skade"
+msgstr "Skade"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
-msgstr ""
+msgstr "Tast til aktivering af fejlsøgningsinfo"
#: src/settings_translation_file.cpp
msgid "Debug log level"
-msgstr ""
+msgstr "Logniveau for fejlsøgning"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
-msgstr ""
+msgstr "Dedikeret server-trin"
#: src/settings_translation_file.cpp
msgid "Default acceleration"
-msgstr ""
+msgstr "Standardacceleration"
#: src/settings_translation_file.cpp
msgid "Default game"
-msgstr ""
+msgstr "Standard spil"
#: 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 ""
+msgstr "Standard spil, når du skaber en ny verden."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Default password"
-msgstr "Nyt kodeord"
+msgstr "Standardadgangskode"
#: src/settings_translation_file.cpp
msgid "Default privileges"
-msgstr ""
+msgstr "Standardprivilegier"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Standardformat for rapport"
#: src/settings_translation_file.cpp
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."
#: src/settings_translation_file.cpp
msgid ""
"Defines sampling step of texture.\n"
"A higher value results in smoother normal maps."
msgstr ""
+"Definerer sampling-trin for tekstur.\n"
+"En højere værdi resulterer i en mere rullende normale kort."
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
+"Definerer den maksimale spillerflytningsafstand i blokke (0 = ubegrænset)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Forsinkelse i afsendelse af blokke efter bygning"
#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
-msgstr ""
+msgstr "Forsinkelse ved visning af værktøjsfif, angivet i millisekunder."
#: src/settings_translation_file.cpp
msgid "Deprecated Lua API handling"
-msgstr ""
+msgstr "Forældet Lua API-håndtering"
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Dybde hvorunder du kan finde store huler."
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Dybde hvorunder du finder kæmpestore huler."
#: src/settings_translation_file.cpp
msgid "Descending speed"
-msgstr ""
+msgstr "Faldende hastighed"
#: src/settings_translation_file.cpp
msgid ""
"Description of server, to be displayed when players join and in the "
"serverlist."
msgstr ""
+"Beskrivelse af server, som vises når spillere tilslutter sig og i "
+"serverlisten."
#: src/settings_translation_file.cpp
msgid "Desynchronize block animation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
+msgstr "Afsynkroniser blokanimation"
#: src/settings_translation_file.cpp
msgid ""
@@ -1861,64 +1885,82 @@ msgid ""
"The 3 numbers in brackets control the scale of the\n"
"terrain, the 3 numbers should be identical."
msgstr ""
+"Bestemmer terrænform.\n"
+"De tre tal i parenteser kontrollerer skalaen for\n"
+"terrænet, de tre tal skal være identiske."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Disable anticheat"
-msgstr "Aktivér partikler"
+msgstr "Deaktiver antisnyd"
#: src/settings_translation_file.cpp
-msgid "Disallow empty passwords"
+msgid "Disable escape sequences"
+msgstr "Deaktiver undvigesekvenser"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
+"Deaktiver undvigesekvenser, f.eks. snak-farvelægning.\n"
+"Brug denne hvis du ønsker at afvikle en server med pre-0.4.14-klienter og du "
+"ønsker\n"
+"at deaktivere undvigesekvenserne oprettet af mod'er."
+
+#: src/settings_translation_file.cpp
+msgid "Disallow empty passwords"
+msgstr "Tillad ikke tomme adgangskoder"
#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Domænenavn for server, til visning i serverlisten."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Double tap jump for fly"
-msgstr ""
-"Tryk på \"hop\" hurtigt to gange for at skifte frem og tilbage mellem flyve-"
-"tilstand"
+msgstr "Tryk to gange på »hop« for at flyve"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Double-tapping the jump key toggles fly mode."
msgstr ""
-"Tryk på \"hop\" hurtigt to gange for at skifte frem og tilbage mellem flyve-"
-"tilstand"
+"Tryk på »hop« to gange for at skifte frem og tilbage fra flyvetilstand."
#: src/settings_translation_file.cpp
msgid "Drop item key"
-msgstr ""
+msgstr "Drop element-tast"
#: src/settings_translation_file.cpp
msgid "Dump the mapgen debug infos."
-msgstr ""
+msgstr "Dump mapgen-fejlsøgningsinfo."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Aktivér joysticks"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enable VBO"
-msgstr "Aktivér MP"
+msgstr "Aktiver VBO"
#: src/settings_translation_file.cpp
msgid "Enable mod security"
-msgstr ""
+msgstr "Aktiver mod-sikkerhed"
#: src/settings_translation_file.cpp
msgid "Enable players getting damage and dying."
-msgstr ""
+msgstr "Aktiver at spillere kan skades og dø."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
-msgstr ""
+msgstr "Aktiver vilkårlig brugerinddata (kun til test)."
#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
msgstr ""
+"Aktiver blød lyssætning med simpel ambient okklusion.\n"
+"Deaktiver for hastighed eller for anderledes udseender."
#: src/settings_translation_file.cpp
msgid ""
@@ -1928,6 +1970,10 @@ msgid ""
"to new servers, but they may not support all new features that you are "
"expecting."
msgstr ""
+"Aktiver for at nægte gamle klienter i at forbinde.\n"
+"Ældre klienter er kompatible på den måde, at de ikke vil stoppe ved "
+"tilkobling\n"
+"til nye servere, men de understøtter ikke alle nye funktioner."
#: src/settings_translation_file.cpp
msgid ""
@@ -1936,6 +1982,10 @@ msgid ""
"textures)\n"
"when connecting to the server."
msgstr ""
+"Aktiver brug af ekstern medieserver (hvis tilbudt af server).\n"
+"Eksterne servere tilbyder en signifikant hurtigere måde at hente medier (f."
+"eks. teksturer\n"
+"ved forbindelse til serveren."
#: src/settings_translation_file.cpp
msgid ""
@@ -1943,10 +1993,14 @@ msgid ""
"to IPv6 clients, depending on system configuration.\n"
"Ignored if bind_address is set."
msgstr ""
+"Aktivere/deaktivere afvikling af en IPv6-server. En IPv6-server kan være "
+"begrænset\n"
+"til IPv6-klienter, afhængig af systemkonfiguration.\n"
+"Ignoreret hvis bind_address er angivet."
#: src/settings_translation_file.cpp
msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Aktiverer animation af lagerelementer."
#: src/settings_translation_file.cpp
msgid ""
@@ -1955,110 +2009,142 @@ msgid ""
"or need to be auto-generated.\n"
"Requires shaders to be enabled."
msgstr ""
+"Aktiverer bumpmapping for teksturer. Normalmaps skal være angivet af "
+"teksturpakken\n"
+"eller skal være automatisk oprettet.\n"
+"Kræver at dybdeskabere er aktiveret."
#: src/settings_translation_file.cpp
msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Aktiverer mellemlagring af facedir-roterede mesher."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enables filmic tone mapping"
-msgstr "Aktivér skade"
+msgstr "Aktiverer filmisk toneoversættelse"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enables minimap."
-msgstr "Aktivér skade"
+msgstr "Aktiverer minikort."
#: src/settings_translation_file.cpp
msgid ""
"Enables on the fly normalmap generation (Emboss effect).\n"
"Requires bumpmapping to be enabled."
msgstr ""
+"Aktiverer løbende normalmap-oprettelse (Emboss-effekt).\n"
+"Kræver bumpmapping for at være aktiveret."
#: src/settings_translation_file.cpp
msgid ""
"Enables parallax occlusion mapping.\n"
"Requires shaders to be enabled."
msgstr ""
+"Aktiverer parallax-okklusionoversættelse.\n"
+"Kræver at dybdeskabere er aktiveret."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Udskrivningsinterval for motorprofileringsdata"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Entitetmetoder"
#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
msgstr ""
+"Eksperimentelt tilvalg, kan medføre synlige mellemrum mellem blokke\n"
+"når angivet til et højere nummer end 0."
#: src/settings_translation_file.cpp
msgid "FPS in pause menu"
-msgstr ""
+msgstr "FPS i pausemenu"
#: src/settings_translation_file.cpp
msgid "FSAA"
-msgstr ""
+msgstr "FSAA"
#: src/settings_translation_file.cpp
msgid "Fall bobbing"
-msgstr ""
+msgstr "Faldrystelse"
#: src/settings_translation_file.cpp
msgid "Fallback font"
-msgstr ""
+msgstr "Reserveskrifttype"
#: src/settings_translation_file.cpp
msgid "Fallback font shadow"
-msgstr ""
+msgstr "Skygge for reserveskrifttypen"
#: src/settings_translation_file.cpp
msgid "Fallback font shadow alpha"
-msgstr ""
+msgstr "Skyggealfa for reserveskrifttypen"
#: src/settings_translation_file.cpp
msgid "Fallback font size"
-msgstr ""
+msgstr "Størrelse for reserveskrifttypen"
#: src/settings_translation_file.cpp
msgid "Fast key"
-msgstr ""
+msgstr "Hurtigtast"
#: src/settings_translation_file.cpp
msgid "Fast mode acceleration"
-msgstr ""
+msgstr "Hurtig tilstandsacceleration"
#: src/settings_translation_file.cpp
msgid "Fast mode speed"
-msgstr ""
+msgstr "Hurtig tilstandshastighed"
#: src/settings_translation_file.cpp
msgid "Fast movement"
-msgstr ""
+msgstr "Hurtig bevægelse"
#: src/settings_translation_file.cpp
msgid ""
"Fast movement (via use key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
+"Hurtig bevægelse (via tast).\n"
+"Dette kræver privilegiet »fast« på serveren."
#: src/settings_translation_file.cpp
msgid "Field of view"
-msgstr ""
+msgstr "Visningsområde"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Zoom for visningsområde"
#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
+msgstr "Visningsområde i grader."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
msgstr ""
+"Visningsområde under zoom i grader.\n"
+"Dette kræver privilegiet »zoom« på serveren."
#: src/settings_translation_file.cpp
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
+"Fil i client/serverlist/ som indeholder dine favoritservere vist i "
+"fanebladet for flere spillere."
#: src/settings_translation_file.cpp
msgid "Filler Depth"
-msgstr ""
+msgstr "Fyldstofdybde"
#: src/settings_translation_file.cpp
msgid "Filmic tone mapping"
-msgstr ""
+msgstr "Filmisk toneoversættelse"
#: src/settings_translation_file.cpp
msgid ""
@@ -2067,149 +2153,168 @@ msgid ""
"light edge to transparent textures. Apply this filter to clean that up\n"
"at texture load time."
msgstr ""
+"Filtrerede teksturer kan blande RGB-værdier med fuldt gennemsigtige naboer,\n"
+"som PNG-optimeringsprogrammer normalt fjerner, undertiden resulterende i "
+"en \n"
+"mørk eller lys kant for gennemsigtige teksturer. Anvend dette filter for at "
+"rydde\n"
+"op i dette på indlæsningstidspunktet for tekstur."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Filtering"
-msgstr "Anisotropisk filtréring"
+msgstr "Filtrering"
#: src/settings_translation_file.cpp
msgid "Fixed map seed"
-msgstr ""
+msgstr "Fast kortfødning"
#: src/settings_translation_file.cpp
msgid "Fly key"
-msgstr ""
+msgstr "Flyvetast"
#: src/settings_translation_file.cpp
msgid "Flying"
-msgstr ""
+msgstr "Flyver"
#: src/settings_translation_file.cpp
msgid "Fog"
-msgstr ""
+msgstr "TÃ¥ge"
#: src/settings_translation_file.cpp
msgid "Fog toggle key"
-msgstr ""
+msgstr "Tast for tåge"
#: src/settings_translation_file.cpp
msgid "Font path"
-msgstr ""
+msgstr "Sti til font"
#: src/settings_translation_file.cpp
msgid "Font shadow"
-msgstr ""
+msgstr "Fontskygge"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha"
-msgstr ""
+msgstr "Alfa for skrifttypeskygge"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Alfa for skrifttypeskygge (uigennemsigtighed, mellem 0 og 255)."
#: src/settings_translation_file.cpp
msgid "Font shadow offset, if 0 then shadow will not be drawn."
msgstr ""
+"Forskydning for skrifttypeskygge, hvis 0 så vil skygge ikke blive tegnet."
#: src/settings_translation_file.cpp
msgid "Font size"
-msgstr ""
+msgstr "Skriftstørrelse"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
-msgstr ""
+msgstr "Format for skærmbilleder."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Forward key"
-msgstr "Fremad"
+msgstr "Fremadtast"
#: src/settings_translation_file.cpp
msgid "Freetype fonts"
-msgstr ""
+msgstr "Freetype-skrifttyper"
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
msgstr ""
+"Fra hvor langt væk blokke oprettes for klienten, angivet i kortblokke (16 "
+"knudepunkter)."
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
msgstr ""
+"Fra hvor langt væk blokke sendes til klienter, angivet i kortblokke (16 "
+"knudepunker)."
#: src/settings_translation_file.cpp
msgid ""
"From how far clients know about objects, stated in mapblocks (16 nodes)."
msgstr ""
+"Fra hvor langt væk klinter ved om objekter, angivet i kortblokke (16 "
+"knudepunkter)."
#: src/settings_translation_file.cpp
msgid "Full screen"
-msgstr ""
+msgstr "Fuld skærm"
#: src/settings_translation_file.cpp
msgid "Full screen BPP"
-msgstr ""
+msgstr "Fuldskærm BPP"
#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
-msgstr ""
+msgstr "Fuldskærmstilstand."
#: src/settings_translation_file.cpp
msgid "GUI scaling"
-msgstr ""
+msgstr "Skalering af grafisk brugerflade"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter"
-msgstr ""
+msgstr "GUI-skaleringsfilter"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter txr2img"
-msgstr ""
+msgstr "GUI-skaleringsfilter txr2img"
#: src/settings_translation_file.cpp
msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
#: src/settings_translation_file.cpp
msgid "General"
-msgstr ""
+msgstr "Generelt"
#: src/settings_translation_file.cpp
msgid "Generate normalmaps"
-msgstr ""
+msgstr "Opret normalkort"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Globale tilbagekald"
#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Globale kortoprettelsesattributter.\n"
+"I Mapgen v6 kontrollerer flaget »decorations« alle dekorationer undtagen "
+"træer\n"
+"og junglegræs, i alle andre mapgen'er kontrollerer dette flag alle "
+"dekorationer.\n"
+"Flag som ikke er angivet i flagstrengen ændres ikke fra standarden.\n"
+"Flag startende med »no« (nej) bruges til eksplicit at deaktivere dem."
#: src/settings_translation_file.cpp
msgid "Graphics"
-msgstr ""
+msgstr "Grafik"
#: src/settings_translation_file.cpp
msgid "Gravity"
-msgstr ""
+msgstr "Tyngdekraft"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "HTTP-Mod'er"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
-msgstr ""
+msgstr "Tast for HUD"
#: src/settings_translation_file.cpp
msgid ""
@@ -2218,26 +2323,45 @@ msgid ""
"- log: mimic and log backtrace of deprecated call (default for debug).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
+"Håndtering for forældede lua api-kald:\n"
+"- legacy: (prøv at) efterligne gammel opførsel (standard for udgivelse).\n"
+"- log: efterlign og log tilbagesporing for forældede kald (standard for "
+"fejlsøgning).\n"
+"- error: afbryd ved brug af forældede kald (foreslået af mod-udviklere)."
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
msgstr ""
+"FÃ¥ profilprogrammet til at instruere sig selv:\n"
+"* Instruer en tom funktion.\n"
+"Dette estimerer belastningen, som instrumenteringen tilføjer (+1 "
+"funktionkald).\n"
+"* Instruer sampleren i brug til at opdatere statistikken."
+
+#: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Højdekomponent for den oprindelige vinduestørrelse."
#: src/settings_translation_file.cpp
msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Højde hvor skyer fremkommer."
#: src/settings_translation_file.cpp
msgid "High-precision FPU"
-msgstr ""
+msgstr "Højpræcisions FPU"
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Hjemmeside for serveren, som vist i serverlisten."
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr ""
+msgstr "Dybde for floder"
#: src/settings_translation_file.cpp
msgid ""
@@ -2245,49 +2369,49 @@ msgid ""
"mapblocks (16 nodes).\n"
"In active blocks objects are loaded and ABMs run."
msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
+"Hvordan store områder af blokke påvirkes af det aktive blokindhold, angivet "
+"i mapblocks (16 knudepunkter).\n"
+"I aktive blokke bliver objekter indlæst og ABM'er afviklet."
#: src/settings_translation_file.cpp
msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
+"Hvor lang tid serveren vil vente før ubrugt kortblokke fjernes.\n"
+"Højere værdier er længere tid, men vil bruge mere RAM."
#: src/settings_translation_file.cpp
msgid "How wide to make rivers"
-msgstr ""
+msgstr "Hvor brede floder skal være"
#: src/settings_translation_file.cpp
msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 server"
-msgstr ""
+msgstr "IPv6-server"
#: src/settings_translation_file.cpp
msgid "IPv6 support."
-msgstr ""
+msgstr "Understøttelse af 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 ""
+"Hvis FPS skal være højere end dette, så begræns ved at sove\n"
+"for ikke at spilde CPU-kraft uden nogen fordel."
#: src/settings_translation_file.cpp
msgid ""
"If disabled \"use\" key is used to fly fast if both fly and fast mode are "
"enabled."
msgstr ""
+"Hvis deaktiveret bruges »brug«-tasten til at flyve hurtig hvis både flyvning "
+"og hurtig tilstand er aktiveret."
#: src/settings_translation_file.cpp
msgid ""
@@ -2295,32 +2419,43 @@ msgid ""
"nodes.\n"
"This requires the \"noclip\" privilege on the server."
msgstr ""
+"Hvis aktiveret sammen med fly-tilstand, kan spilleren flyve igennem faste "
+"knudepunkter.\n"
+"Dette kræver privilegiet »noclip« på serveren."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
"and descending."
msgstr ""
+"Hvis aktiveret bruges »brug«-tasten i stedet for »snig«-tasten til at klatre "
+"ned og aftagende."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
+"Hvis aktiveret, optages handlinger for tilbagerulning.\n"
+"Dette tilvalg læses kun når serveren starter."
#: src/settings_translation_file.cpp
msgid "If enabled, disable cheat prevention in multiplayer."
msgstr ""
+"Hvis aktiveret så deaktiver forhindring af snyd i spil med flere deltagere."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, invalid world data won't cause the server to shut down.\n"
"Only enable this if you know what you are doing."
msgstr ""
+"Hvis aktiveret, så vil ugyldige data ikke medføre at serveren lukke ned.\n"
+"Aktiver kun hvis du ved hvad du gør."
#: src/settings_translation_file.cpp
msgid "If enabled, new players cannot join with an empty password."
msgstr ""
+"Hvis aktiveret kan nye spillere ikke slutte sig til uden en tom adgangskode."
#: src/settings_translation_file.cpp
msgid ""
@@ -2328,62 +2463,116 @@ msgid ""
"you stand.\n"
"This is helpful when working with nodeboxes in small areas."
msgstr ""
+"Hvis aktiveret så kan du placere blokke ved positionen (fod + øje niveau) "
+"hvor du står.\n"
+"Dette er nyttigt under arbejde med knudepunktbokse i små områder."
#: src/settings_translation_file.cpp
msgid "If this is set, players will always (re)spawn at the given position."
msgstr ""
+"Hvis aktiveret, så vil spillere altid (gen)starte ved den angivne position."
#: src/settings_translation_file.cpp
msgid "Ignore world errors"
-msgstr ""
+msgstr "Ignorer verdensfejl"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "In-Game"
-msgstr "Spil"
+msgstr "I-spil"
#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
+"Baggrundsalfa for snakkekonsollen i spillet (uigennemsigtighed, mellem 0 og "
+"255)."
#: src/settings_translation_file.cpp
msgid "In-game chat console background color (R,G,B)."
+msgstr "Baggrundsfarve for snakkekonsollen i spillet (R,G,B)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
msgstr ""
+"Instrumenteringsindbygning.\n"
+"Er normalt kun krævet af kerne/indbygningsbidragydere"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Udstyr chatkommandoer ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Udstyr globale tilbagekaldsfunktioner ved registrering.\n"
+"(alt du sender til en minetest.register_*()-funktion)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "Udstyr handlingsfunktionen for Aktiv blokændringer ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+"Udstyr handlingsfunktionen for Indlæsning af blokændringer ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Udstyr metoderne for enheder ved registrering."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentering"
#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
+"Interval for lagring af vigtige ændringer i verden, angivet i sekunder."
#: src/settings_translation_file.cpp
msgid "Interval of sending time of day to clients."
-msgstr ""
+msgstr "Interval for afsendelse af tidspunkt på dagen til klienter."
#: src/settings_translation_file.cpp
msgid "Inventory items animations"
-msgstr ""
+msgstr "Animationer for lagerelementer"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Inventory key"
-msgstr "Beholdning"
+msgstr "Lagertast"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
-msgstr ""
+msgstr "Invertér mus"
#: src/settings_translation_file.cpp
msgid "Invert vertical mouse movement."
-msgstr ""
+msgstr "Vend lodret musebevægelse om."
#: src/settings_translation_file.cpp
msgid "Item entity TTL"
-msgstr ""
+msgstr "Elemententitet TTL"
#: src/settings_translation_file.cpp
msgid ""
"Iterations of the recursive function.\n"
"Controls the amount of fine detail."
msgstr ""
+"Gennemløb for den rekursive funktion.\n"
+"Kontrollerer mængden af små detaljer."
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Joystick-knaps gentagelsesinterval"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Joystick frustum-sensitivitet"
#: src/settings_translation_file.cpp
msgid ""
@@ -2392,6 +2581,10 @@ msgid ""
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
+"Kun Juliasæt: W-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Har ingen effekt på 3D-fraktaler.\n"
+"Interval cirka -2 til 2."
#: src/settings_translation_file.cpp
msgid ""
@@ -2399,6 +2592,9 @@ msgid ""
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
+"Kun Juliasæt: X-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Interval cirka -2 til 2."
#: src/settings_translation_file.cpp
msgid ""
@@ -2406,6 +2602,9 @@ msgid ""
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
+"Kun Juliasæt: Y-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Interval cirka -2 til 2."
#: src/settings_translation_file.cpp
msgid ""
@@ -2413,15 +2612,17 @@ msgid ""
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
+"Kun Juliasæt: Z-komponent for hyperkompleks konstant der bestemmer "
+"Juliaform.\n"
+"Interval cirka -2 til 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Jump key"
-msgstr "Hop"
+msgstr "Hop-tast"
#: src/settings_translation_file.cpp
msgid "Jumping speed"
-msgstr ""
+msgstr "Hoppehastighed"
#: src/settings_translation_file.cpp
msgid ""
@@ -2429,6 +2630,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast for mindskning af den sete afstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2436,6 +2640,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast som smider det nuværende valgte element.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2443,6 +2650,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast for øgning af den sete afstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2450,6 +2660,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast for hop.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2457,6 +2670,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at bevæge sig hurtigt i tilstanden hurtig.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2464,6 +2680,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at bevæge spilleren baglæns.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2471,6 +2690,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at bevæge spilleren fremad.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2478,6 +2700,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at bevæge spilleren mod venstre.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2485,6 +2710,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at bevæge spilleren mod højre.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2492,6 +2720,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at åbne snakkekonsollen (chat).\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2499,6 +2730,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at åbne snakkevinduet for at indtaste kommandoer.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2506,6 +2740,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at åbne snakkevinduet (chat).\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2513,6 +2750,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at åbne lageret.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2520,6 +2760,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at udskrive fejlsøgningsstakke. Brugt til udvikling.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2529,6 +2772,11 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til snigning.\n"
+"Bruges også til at klatre ned og synke ned i vand hvis aux1_descends er "
+"deaktiveret.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2536,6 +2784,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte mellem første- og tredjepersons kamera.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2543,6 +2794,19 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at lave skærmbilleder.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tast til at skifte til automatisk løb.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2550,6 +2814,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte til biograftilstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2557,6 +2824,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte til visning af minikort.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2564,6 +2834,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte til hurtig tilstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2571,6 +2844,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte til flyvning.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2578,13 +2854,19 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte til noclip-tilstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast for at skifte kameraopdateringen. Bruges kun til udvikling\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2592,6 +2874,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte til visning af fejlsøgningsinformation.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2599,6 +2884,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til skift af visningen for HUD'en.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2606,6 +2894,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte visningen af snakken (chat).\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2613,6 +2904,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte visningen af tåge.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2620,6 +2914,10 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte visningen af profileringsprogrammet. Brugt til "
+"udvikling.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2627,26 +2925,29 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tast til at skifte til ubegrænset se-afstand.\n"
+"Se http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Tast brugt til at klatre op/ned"
#: src/settings_translation_file.cpp
msgid "Language"
-msgstr ""
+msgstr "Sprog"
#: src/settings_translation_file.cpp
msgid "Large cave depth"
-msgstr ""
+msgstr "Dybde for stor hule"
#: src/settings_translation_file.cpp
msgid "Lava Features"
-msgstr ""
+msgstr "Lavafunktioner"
#: src/settings_translation_file.cpp
msgid "Leaves style"
-msgstr ""
+msgstr "Bladstil"
#: src/settings_translation_file.cpp
msgid ""
@@ -2655,25 +2956,30 @@ msgid ""
"- Simple: only outer faces, if defined special_tiles are used\n"
"- Opaque: disable transparency"
msgstr ""
+"Bladstil:\n"
+"- Fancy: alle sider synlige\n"
+"- Simple: kun ydre sider, hvis defineret special_tiles anvendes\n"
+"- Opaque: deaktiver gennemsigtighed"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Left key"
-msgstr "Venstre Menu"
+msgstr "Venstretast"
#: src/settings_translation_file.cpp
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over network."
msgstr ""
+"Længde på serveraktivering og intervallet som objekter opdateres efter over "
+"netværket."
#: src/settings_translation_file.cpp
msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Tidslængde mellem ABM-kørselscyklusser"
#: src/settings_translation_file.cpp
msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Tidslængde mellem NodeTimer-kørselscyklusser"
#: src/settings_translation_file.cpp
msgid ""
@@ -2686,14 +2992,22 @@ msgid ""
"- info\n"
"- verbose"
msgstr ""
+"Niveau for logning der skrives til debug.txt:\n"
+"- <nothing> (ingen logning)\n"
+"- none (beskeder uden niveau)\n"
+"- error\n"
+"- warning\n"
+"- action\n"
+"- info\n"
+"- verbose"
#: src/settings_translation_file.cpp
msgid "Limit of emerge queues on disk"
-msgstr ""
+msgstr "Begrænsning af fremkomsten af forespørgsler på disk"
#: src/settings_translation_file.cpp
msgid "Limit of emerge queues to generate"
-msgstr ""
+msgstr "Begrænsning af fremkomsten af køer at oprette"
#: src/settings_translation_file.cpp
msgid ""
@@ -2703,61 +3017,85 @@ msgid ""
"- Downloads performed by main menu (e.g. mod manager).\n"
"Only has an effect if compiled with cURL."
msgstr ""
+"Begrænser antallet af parallelle HTTP-forespørgsler. Påvirker:\n"
+"- Medioverførsel hvis serveren bruger indstillingen remote_media.\n"
+"- Serverlist-overførsel og serverbesked.\n"
+"- Overførsler udført af hovedmenuen (f.eks. mod-håndtering).\n"
+"Har kun en effekt hvis kompileret med cURL."
#: src/settings_translation_file.cpp
msgid "Liquid fluidity"
-msgstr ""
+msgstr "Væskes evne til at flyde"
#: src/settings_translation_file.cpp
msgid "Liquid fluidity smoothing"
-msgstr ""
+msgstr "Blødgøring af væskes evne til at flyde"
#: src/settings_translation_file.cpp
msgid "Liquid loop max"
-msgstr ""
+msgstr "Væske loop maks."
#: src/settings_translation_file.cpp
msgid "Liquid queue purge time"
-msgstr ""
+msgstr "Køfjernelsestid for væske"
#: src/settings_translation_file.cpp
msgid "Liquid sink"
-msgstr ""
+msgstr "Synkehastighed for væske"
#: src/settings_translation_file.cpp
msgid "Liquid update interval in seconds."
-msgstr ""
+msgstr "Væskeopdateringsinterval i sekunder."
#: src/settings_translation_file.cpp
msgid "Liquid update tick"
+msgstr "Væskeopdateringsudløsning"
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Indlæs spilprofileringsprogrammet"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
msgstr ""
+"Indlæs spilprofileringsprogrammet for at indsamle profileringsdata.\n"
+"Tilbyder en kommando /profiler til at tilgå den indsamlede profil.\n"
+"Nyttig for mod-udviklere og serveroperatører."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Indlæser blokændringer"
#: src/settings_translation_file.cpp
msgid "Main menu game manager"
-msgstr ""
+msgstr "Hovedmenus spilhåndtering"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Main menu mod manager"
-msgstr "Hovedmenu"
+msgstr "Hovedmenus mod-håndtering"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Main menu script"
-msgstr "Hovedmenu"
+msgstr "Hovedmenuskript"
#: src/settings_translation_file.cpp
msgid ""
"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
msgstr ""
+"Tåge- og himmelfarver afhænger af tid på dagen (solopgang/solnedgang) og den "
+"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 "Map directory"
-msgstr ""
+msgstr "Kortmappe"
#: src/settings_translation_file.cpp
msgid ""
@@ -2767,274 +3105,283 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Kortoprettelsesattributer specifik for Mapgen Valleys.\n"
+"»altitude_chill« gør højere områder koldere, hvilket kan medføre "
+"habitatproblemstillinger.\n"
+"»humid_rivers« ændrer fugtighed omkring floder og i områder hvor vand har "
+"tendens til at samle sig,\n"
+"det kan influere med ømtålelige habitatter.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
#: src/settings_translation_file.cpp
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Kortoprettelsesattributter specifikke for Mapgen flat.\n"
+"Undtagelsesvis kan søer og bakker tilføjes til den flade verden.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
#: src/settings_translation_file.cpp
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Kortoprettelsesattributter specifikke for Mapgen v6.\n"
+"NÃ¥r snehabitatter er aktiveret bliver jungler automatisk aktiveret, flaget "
+"»jungles« ignoreres.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
#: src/settings_translation_file.cpp
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Kortoprettelsesattributter specifikek til Mapgen v7.\n"
+"Flaget »ridges« kontroller floderne.\n"
+"Flag som ikke er specificeret i flag-strengen ændres ikke fra standarden.\n"
+"Flag der starter med »no« bruges til eksplicit at deaktivere dem."
#: src/settings_translation_file.cpp
msgid "Map generation limit"
-msgstr ""
+msgstr "Kortoprettelsesbegrænsning"
#: src/settings_translation_file.cpp
msgid "Map save interval"
-msgstr ""
+msgstr "Interval for kortlagring"
#: src/settings_translation_file.cpp
msgid "Mapblock limit"
-msgstr ""
+msgstr "Kortblokbegrænsning"
#: src/settings_translation_file.cpp
msgid "Mapblock unload timeout"
-msgstr ""
+msgstr "Tidsudløb for kortblokfjernelse"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Valleys"
-msgstr "Mapgen"
+msgstr "Mapgen-daler"
#: src/settings_translation_file.cpp
msgid "Mapgen biome heat noise parameters"
-msgstr ""
+msgstr "Støjparametre til biotopvarme for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen biome humidity blend noise parameters"
-msgstr ""
+msgstr "Støjparametre til biotopfugtighedsblanding for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen biome humidity noise parameters"
-msgstr ""
+msgstr "Støjparametre for biotopfugtighed for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen debug"
-msgstr ""
+msgstr "Fejlsøgning for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr ""
+msgstr "Flag for Mapgen"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat"
-msgstr "Mapgen"
+msgstr "Mapgen-flad"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Mapgen"
+msgstr "Mapgen - flad hulebredde"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
-msgstr ""
+msgstr "Støjparametre til flade cave1 for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave2 noise parameters"
-msgstr ""
+msgstr "Støjparametre til flade cave2 for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen - støjparametre for flad fyldstofdybde"
#: src/settings_translation_file.cpp
msgid "Mapgen flat flags"
-msgstr ""
+msgstr "Flade flag for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat ground level"
-msgstr ""
+msgstr "Flade grundniveauer for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill steepness"
-msgstr ""
+msgstr "Flad bakkestejlhed for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill threshold"
-msgstr ""
+msgstr "Flad bakketærskel for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat lake steepness"
-msgstr ""
+msgstr "Flad søstejlhed for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat lake threshold"
-msgstr ""
+msgstr "Flad søtærskel for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat large cave depth"
-msgstr ""
+msgstr "Flad stor hule-dybde for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat terrain noise parameters"
-msgstr ""
+msgstr "Støjparametre til flad terræn for Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal"
-msgstr ""
+msgstr "Fraktral for Mapgen"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal cave width"
-msgstr "Mapgen"
+msgstr "Mapgen - fraktal hulebredde"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen fraktal grotte1"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave2 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen fraktal grotte2"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen - støjparametre for fraktal fyldstofdybde"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal fractal"
-msgstr ""
+msgstr "Mapgen fraktal fraktal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal iterations"
-msgstr ""
+msgstr "Mapgen fraktaliterationer"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia w"
-msgstr ""
+msgstr "Mapgen fraktal Julia w"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia x"
-msgstr ""
+msgstr "Mapgen fraktal Julia x"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia y"
-msgstr ""
+msgstr "Mapgen fraktal Julia y"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia z"
-msgstr ""
+msgstr "Mapgen fraktal Julia z"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal offset"
-msgstr ""
+msgstr "Mapgen fraktal forskydning"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal scale"
-msgstr ""
+msgstr "Mapgen fraktal skalering"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal seabed noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen fraktal havbund"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal slice w"
-msgstr ""
+msgstr "Mapgen fraktal udsnit w"
#: src/settings_translation_file.cpp
msgid "Mapgen heat blend noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen varmeblanding"
#: src/settings_translation_file.cpp
msgid "Mapgen name"
-msgstr ""
+msgstr "Mapgen-navn"
#: src/settings_translation_file.cpp
msgid "Mapgen v5"
-msgstr ""
+msgstr "Mapgen v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave width"
-msgstr ""
+msgstr "Mapgen v5 grottebredde"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen v5 grotte1"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave2 noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen v5 grotte2"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 factor noise parameters"
-msgstr ""
+msgstr "Støjparametre for Mapgen v5 faktor"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen v5 - støjparametre for fyldstofdybde"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 height noise parameters"
-msgstr ""
+msgstr "Mapgen v5 – støjparametre for højde"
#: src/settings_translation_file.cpp
msgid "Mapgen v6"
-msgstr ""
+msgstr "Mapgen v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 apple trees noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for æbletræer"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach frequency"
-msgstr ""
+msgstr "Mapgen v6 – strandhyppighed"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for strand"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 biome noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for økosystem"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 cave noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for grotter"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 desert frequency"
-msgstr ""
+msgstr "Mapgen v6 – ørkenhyppighed"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 flags"
-msgstr ""
+msgstr "Mapgen v6 – flag"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 height select noise parameters"
-msgstr ""
+msgstr "Mapgen v6 – støjparametre for højdevalg"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 humidity noise parameters"
@@ -3062,7 +3409,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen v7"
-msgstr ""
+msgstr "Mapgen v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave width"
@@ -3078,15 +3425,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen v7 filler depth noise parameters"
-msgstr ""
+msgstr "Mapgen v7 - støjparametre for fyldstofdybde"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 flags"
-msgstr ""
+msgstr "Mapgen v7 – flag"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 height select noise parameters"
-msgstr ""
+msgstr "Mapgen v7 – støjparametre for højdevalg"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 mount height noise parameters"
@@ -3150,7 +3497,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum FPS"
-msgstr ""
+msgstr "Maksimal FPS"
#: src/settings_translation_file.cpp
msgid "Maximum FPS when game is paused."
@@ -3165,6 +3512,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3206,17 +3561,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3225,16 +3584,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum users"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
+msgstr "Maksimum antal brugere"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Menus"
-msgstr "Menu"
+msgstr "Menuer"
#: src/settings_translation_file.cpp
msgid "Mesh cache"
@@ -3242,11 +3596,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Message of the day"
-msgstr ""
+msgstr "Dagens besked"
#: src/settings_translation_file.cpp
msgid "Message of the day displayed to players connecting."
-msgstr ""
+msgstr "Dagens besked"
#: src/settings_translation_file.cpp
msgid "Method used to highlight selected object."
@@ -3254,11 +3608,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Minimap"
-msgstr ""
+msgstr "Minikort"
#: src/settings_translation_file.cpp
msgid "Minimap key"
-msgstr ""
+msgstr "Minikorttast"
#: src/settings_translation_file.cpp
msgid "Minimap scan height"
@@ -3271,11 +3625,7 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Mipmapping"
-msgstr "Mip-mapping"
-
-#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
+msgstr "Mipmapping"
#: src/settings_translation_file.cpp
msgid "Modstore details URL"
@@ -3337,7 +3687,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Network"
-msgstr ""
+msgstr "Netværk"
#: src/settings_translation_file.cpp
msgid ""
@@ -3371,7 +3721,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Noises"
-msgstr ""
+msgstr "Lyde"
#: src/settings_translation_file.cpp
msgid "Normalmaps sampling"
@@ -3451,7 +3801,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Physics"
-msgstr ""
+msgstr "Fysik"
#: src/settings_translation_file.cpp
msgid ""
@@ -3461,7 +3811,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Player name"
-msgstr ""
+msgstr "Spillerens navn"
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
@@ -3482,11 +3832,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3494,7 +3850,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3523,16 +3879,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Remote port"
-msgstr ""
+msgstr "Fjernport"
#: src/settings_translation_file.cpp
msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Report path"
+msgstr "Rapportsti"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
-msgstr "Højre Menu"
+msgstr "Højretast"
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
@@ -3540,15 +3899,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "River Depth"
-msgstr ""
+msgstr "Floddybde"
#: src/settings_translation_file.cpp
msgid "River Noise"
-msgstr ""
+msgstr "Flodstøj"
#: src/settings_translation_file.cpp
msgid "River Size"
-msgstr ""
+msgstr "Flodstørrelse"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
@@ -3560,7 +3919,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Round minimap"
-msgstr ""
+msgstr "Rundt minikort"
#: src/settings_translation_file.cpp
msgid "Save the map received by the client on disk."
@@ -3581,30 +3940,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Screen height"
-msgstr ""
+msgstr "Skærmhøjde"
#: src/settings_translation_file.cpp
msgid "Screen width"
-msgstr ""
+msgstr "Skærmbredde"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot"
-msgstr "Tilstandsbillede"
+msgstr "Skærmbillede"
#: src/settings_translation_file.cpp
msgid "Screenshot folder"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Tilstandsbillede"
+msgstr "Skærmbilledformat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Tilstandsbillede"
+msgstr "Skærmbilledkvalitet"
#: src/settings_translation_file.cpp
msgid ""
@@ -3615,7 +3971,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Security"
-msgstr ""
+msgstr "Sikkerhed"
#: src/settings_translation_file.cpp
msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -3634,29 +3990,28 @@ msgid "Selection box width"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Server / Singleplayer"
-msgstr "Enligspiller"
+msgstr "Server/alene"
#: src/settings_translation_file.cpp
msgid "Server URL"
-msgstr ""
+msgstr "Server-URL"
#: src/settings_translation_file.cpp
msgid "Server address"
-msgstr ""
+msgstr "Serveradresse"
#: src/settings_translation_file.cpp
msgid "Server description"
-msgstr ""
+msgstr "Serverbeskrivelse"
#: src/settings_translation_file.cpp
msgid "Server name"
-msgstr ""
+msgstr "Servernavn"
#: src/settings_translation_file.cpp
msgid "Server port"
-msgstr ""
+msgstr "Serverport"
#: src/settings_translation_file.cpp
msgid "Serverlist URL"
@@ -3677,25 +4032,34 @@ msgid ""
"Set to true enables waving leaves.\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
msgid ""
"Set to true enables waving plants.\n"
"Requires shaders to be enabled."
msgstr ""
+"Angivet til true (sand) aktiverer bølgende planter.\n"
+"Kræver at dybdeskabere er aktiveret."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving water.\n"
"Requires shaders to be enabled."
msgstr ""
+"Angivet til true (sand) aktiverer bølgende vand.\n"
+"Kræver at dybdeskabere er aktiveret."
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
+"Dybdeskabere tillader avancerede visuelle effekter og kan forøge ydelsen på "
+"nogle videokort.\n"
+"De fungerer kun med OpenGL-videomotoren."
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -3711,7 +4075,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Shutdown message"
-msgstr ""
+msgstr "Nedlukningsbesked"
#: src/settings_translation_file.cpp
msgid ""
@@ -3724,13 +4088,12 @@ msgid "Slope and fill work together to modify the heights"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Smooth lighting"
-msgstr "Glat belysning"
+msgstr "Blød belysning"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3743,13 +4106,12 @@ msgid "Smooths rotation of camera. 0 to disable."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Sneak key"
-msgstr "Snige"
+msgstr "Snigetast"
#: src/settings_translation_file.cpp
msgid "Sound"
-msgstr ""
+msgstr "Lyd"
#: src/settings_translation_file.cpp
msgid ""
@@ -3777,7 +4139,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "Understøt ældre servere"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
@@ -3785,7 +4147,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Terrain Height"
-msgstr ""
+msgstr "Terrænhøjde"
#: src/settings_translation_file.cpp
msgid ""
@@ -3810,7 +4172,19 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
+msgstr "Dybde for smuds eller andet fyldstof"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3829,6 +4203,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3844,6 +4224,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3868,7 +4254,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Time speed"
-msgstr ""
+msgstr "Tidshastighed"
#: src/settings_translation_file.cpp
msgid "Timeout for client to remove unused map data from memory."
@@ -3891,9 +4277,8 @@ msgid "Tooltip delay"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Trilinear filtering"
-msgstr "Tri-lineær filtréring"
+msgstr "Trilineær filtrering"
#: src/settings_translation_file.cpp
msgid ""
@@ -3935,9 +4320,8 @@ msgid "Use bilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Use key"
-msgstr "Tryk på en tast"
+msgstr "Brug-tast"
#: src/settings_translation_file.cpp
msgid "Use mip mapping to scale textures. May slightly increase performance."
@@ -3948,16 +4332,12 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
-msgstr ""
+msgstr "V-Sync"
#: src/settings_translation_file.cpp
msgid "VBO"
-msgstr ""
+msgstr "VBO"
#: src/settings_translation_file.cpp
msgid "Valley Depth"
@@ -4011,7 +4391,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Volume"
-msgstr ""
+msgstr "Lydstyrke"
#: src/settings_translation_file.cpp
msgid ""
@@ -4023,7 +4403,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Walking speed"
-msgstr ""
+msgstr "Ganghastighed"
#: src/settings_translation_file.cpp
msgid "Water Features"
@@ -4031,7 +4411,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Water level"
-msgstr ""
+msgstr "Vandstand"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
@@ -4042,9 +4422,8 @@ msgid "Waving Nodes"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving leaves"
-msgstr "\"Smarte\" træer"
+msgstr "Bølgende blade"
#: src/settings_translation_file.cpp
msgid "Waving plants"
@@ -4078,7 +4457,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4176,56 +4555,49 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "cURL timeout"
-msgstr ""
-
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Ned"
-
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Venstre klik: flyt alle enheder. Højre klik: flyt en enkelt enhed"
-
-#~ msgid "is required by:"
-#~ msgstr "er påkrævet af:"
-
-#~ msgid "Configuration saved. "
-#~ msgstr "Konfiguration gemt. "
-
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Advarsel: konfigurationen er ikke sammenhængende. "
+msgstr "cURL-tidsudløb"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Kan ikke skabe verden: navnet indeholder ugyldige bogstaver"
-
-#~ msgid "Show Public"
-#~ msgstr "Vis offentlig"
+#~ msgid "No of course not!"
+#~ msgstr "Nej selvfølgelig ikke!"
-#~ msgid "Show Favorites"
-#~ msgstr "Vis favoritter"
+#~ msgid "Public Serverlist"
+#~ msgstr "Offentlig serverliste"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Lad adresse-feltet være tomt for at starte en lokal server."
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Deaktivér alle"
-#~ msgid "Create world"
-#~ msgstr "Skab verden"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "aktiveret"
-#~ msgid "Address required."
-#~ msgstr "Adresse påkrævet."
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Spil"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Kan ikke slette verden: ingenting valgt"
+#, fuzzy
+#~ msgid "Password"
+#~ msgstr "Gammelt kodeord"
-#~ msgid "Files to be deleted"
-#~ msgstr "Filer som slettes"
+#~ msgid "Preload item visuals"
+#~ msgstr "For-indlæs elementernes grafik"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Kan ikke skabe verden: ingen spil fundet"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Advarsel: nogle modifikationer er endnu ikke konfigureret.\n"
+#~ "De vil blive aktiveret som standard når du gemmer konfigurationen. "
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Kan ikke konfigurere verden: ingenting valgt"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Advarsel: nogle konfigurerede modifikationer mangler.\n"
+#~ "Deres indstillinger vil blive fjernet når du gemmer konfigurationen. "
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Mislykkedes i at slette alle verdenens filer"
+#~ msgid "Delete map"
+#~ msgstr "Slet mappen"
#~ msgid ""
#~ "Default Controls:\n"
@@ -4252,44 +4624,51 @@ msgstr ""
#~ "- ESC: denne menu\n"
#~ "- T: snak\n"
-#~ msgid "Delete map"
-#~ msgstr "Slet mappen"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Mislykkedes i at slette alle verdenens filer"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Advarsel: nogle konfigurerede modifikationer mangler.\n"
-#~ "Deres indstillinger vil blive fjernet når du gemmer konfigurationen. "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Kan ikke konfigurere verden: ingenting valgt"
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Advarsel: nogle modifikationer er endnu ikke konfigureret.\n"
-#~ "De vil blive aktiveret som standard når du gemmer konfigurationen. "
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Kan ikke skabe verden: ingen spil fundet"
-#~ msgid "Preload item visuals"
-#~ msgstr "For-indlæs elementernes grafik"
+#~ msgid "Files to be deleted"
+#~ msgstr "Filer som slettes"
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Gammelt kodeord"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Kan ikke slette verden: ingenting valgt"
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Spil"
+#~ msgid "Address required."
+#~ msgstr "Adresse påkrævet."
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "aktiveret"
+#~ msgid "Create world"
+#~ msgstr "Skab verden"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Deaktivér alle"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Lad adresse-feltet være tomt for at starte en lokal server."
-#~ msgid "Public Serverlist"
-#~ msgstr "Offentlig serverliste"
+#~ msgid "Show Favorites"
+#~ msgstr "Vis favoritter"
-#~ msgid "No of course not!"
-#~ msgstr "Nej selvfølgelig ikke!"
+#~ msgid "Show Public"
+#~ msgstr "Vis offentlig"
+
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Kan ikke skabe verden: navnet indeholder ugyldige bogstaver"
+
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Advarsel: konfigurationen er ikke sammenhængende. "
+
+#~ msgid "Configuration saved. "
+#~ msgstr "Konfiguration gemt. "
+
+#~ msgid "is required by:"
+#~ msgstr "er påkrævet af:"
+
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Venstre klik: flyt alle enheder. Højre klik: flyt en enkelt enhed"
+
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Ned"
diff --git a/po/de/minetest.po b/po/de/minetest.po
index b9db120e5..a81fd0d56 100644
--- a/po/de/minetest.po
+++ b/po/de/minetest.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-06 02:25+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-14 02:46+0000\n"
"Last-Translator: Wuzzy <almikes@aol.com>\n"
"Language-Team: German "
"<https://hosted.weblate.org/projects/minetest/minetest/de/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -246,8 +246,8 @@ msgid ""
"<octaves>, <persistence>"
msgstr ""
"Format: <Offset>, <Skalierung>, (<AusbreitungX>, <AusbreitungY>, "
-"<AusbreitungZ>), <Seed>,\n"
-"<Oktaven>, <Persistenz>"
+"<AusbreitungZ>),\n"
+"<Seed>, <Oktaven>, <Persistenz>"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
@@ -260,7 +260,8 @@ msgstr "Mods"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
msgstr ""
-"Optional kann die Lacunarity, mit einem weiteren Komma abgetrennt, angehängt "
+"Optional kann die Lückenhaftigkeit, mit einem weiteren Komma abgetrennt, "
+"angehängt\n"
"werden."
#: builtin/mainmenu/dlg_settings_advanced.lua
@@ -333,7 +334,7 @@ msgstr "Schließen"
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
-msgstr "$1 wird heruntergeladen, bitte warten ..."
+msgstr "$1 wird heruntergeladen, bitte warten …"
#: builtin/mainmenu/store.lua
msgid "Install"
@@ -606,6 +607,10 @@ msgid "Particles"
msgstr "Partikel"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Einzelspielerwelt zurücksetzen"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Einstellungen"
@@ -703,15 +708,15 @@ msgstr "Initialisiere Blöcke"
#: src/client.cpp
msgid "Initializing nodes..."
-msgstr "Initialisiere Blöcke..."
+msgstr "Initialisiere Blöcke …"
#: src/client.cpp
msgid "Loading textures..."
-msgstr "Lade Texturen..."
+msgstr "Lade Texturen …"
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Shader wiederherstellen..."
+msgstr "Shader wiederherstellen …"
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -763,7 +768,7 @@ msgstr "Passwort ändern"
#: src/game.cpp
msgid "Connecting to server..."
-msgstr "Verbinde mit Server..."
+msgstr "Verbinde mit Server …"
#: src/game.cpp
msgid "Continue"
@@ -771,11 +776,11 @@ msgstr "Weiter"
#: src/game.cpp
msgid "Creating client..."
-msgstr "Client erstellen ..."
+msgstr "Client erstellen …"
#: src/game.cpp
msgid "Creating server..."
-msgstr "Erstelle Server..."
+msgstr "Erstelle Server …"
#: src/game.cpp
msgid ""
@@ -841,7 +846,7 @@ msgstr "Programm beenden"
#: src/game.cpp
msgid "Item definitions..."
-msgstr "Item-Definitionen..."
+msgstr "Item-Definitionen …"
#: src/game.cpp
msgid "KiB/s"
@@ -849,7 +854,7 @@ msgstr "KiB/s"
#: src/game.cpp
msgid "Media..."
-msgstr "Medien..."
+msgstr "Medien …"
#: src/game.cpp
msgid "MiB/s"
@@ -857,11 +862,11 @@ msgstr "MiB/s"
#: src/game.cpp
msgid "Node definitions..."
-msgstr "Blockdefinitionen..."
+msgstr "Blockdefinitionen …"
#: src/game.cpp
msgid "Resolving address..."
-msgstr "Löse Adresse auf..."
+msgstr "Löse Adresse auf …"
#: src/game.cpp
msgid "Respawn"
@@ -869,7 +874,7 @@ msgstr "Wiederbeleben"
#: src/game.cpp
msgid "Shutting down..."
-msgstr "Herunterfahren..."
+msgstr "Herunterfahren …"
#: src/game.cpp
msgid "Sound Volume"
@@ -981,6 +986,10 @@ msgstr "Geistmodus"
msgid "Use"
msgstr "Benutzen"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "Taste drücken"
@@ -1297,10 +1306,6 @@ msgstr "X-Knopf 1"
msgid "X Button 2"
msgstr "X-Knopf 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1373,7 +1378,8 @@ msgstr ""
msgid "A message to be displayed to all clients when the server shuts down."
msgstr ""
"Eine Nachricht, die an alle verbundene Clients gesendet wird, wenn der "
-"Server herunterfährt."
+"Server\n"
+"herunterfährt."
#: src/settings_translation_file.cpp
msgid "Absolute limit of emerge queues"
@@ -1392,6 +1398,10 @@ msgid "Active Block Modifier interval"
msgstr "Active-Block-Modifier-Intervall"
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Active Block Modifiers"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr "Reichweite aktiver Kartenblöcke"
@@ -1474,6 +1484,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "Automatisch bei der Serverliste melden."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Automatisch-gehen-Taste"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Rückwärtstaste"
@@ -1506,6 +1520,10 @@ msgid "Build inside player"
msgstr "Innerhalb des Spielers bauen"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Builtin"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bumpmapping"
@@ -1546,6 +1564,10 @@ msgid "Chat toggle key"
msgstr "Taste zum Umschalten des Chatprotokolls"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Chatbefehle"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1637,6 +1659,14 @@ msgstr "Gefärbter Nebel"
#: src/settings_translation_file.cpp
msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Kommagetrennte Liste von Mods, welche auf HTTP-APIs zugreifen dürfen, was\n"
+"es ihnen erlaubt, Daten aus und Daten zum Internet herunter- und hochzuladen."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
@@ -1647,14 +1677,6 @@ msgstr ""
"(mit request_insecure_environment())."
#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Kommagetrente Liste von Mods, welche auf HTTP-APIs zugreifen dürfen, was\n"
-"es ihnen erlaubt, Daten aus und Daten zum Internet herunter- und hochzuladen."
-
-#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Befehlstaste"
@@ -1812,6 +1834,10 @@ msgid "Default privileges"
msgstr "Standardprivilegien"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Standard-Berichtsformat"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1830,8 +1856,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
-"Setzt die maximale Distanz, in der die Spieler übertragen werden, in "
-"Kartenblöcken (0 = unbegrenzt)."
+"Setzt die maximale Distanz, in der die Spieler übertragen werden,\n"
+"in Kartenblöcken (0 = unbegrenzt)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Verzögerung beim Senden von Blöcken nach dem Bauen"
#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
@@ -1866,14 +1896,6 @@ msgid "Desynchronize block animation"
msgstr "Blockanimationen desynchronisieren"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Detaillierte Mod-Profildaten. Nützlich für Mod-Entwickler."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Detailliertes Mod-Profiling"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1888,6 +1910,23 @@ msgid "Disable anticheat"
msgstr "Anti-Cheat deaktivieren"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Escape-Sequenzen deaktivieren"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Escape-Sequenzen deaktivieren, z.B. Chatfarben.\n"
+"Benutzen Sie dies, falls Sie einen Server laufen lassen möchten, der Clients "
+"vor\n"
+"0.4.14 bedienen soll und Sie die von Mods generierten Escape-Sequenzen\n"
+"deaktivieren wollen."
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Leere Passwörter verbieten"
@@ -1912,6 +1951,10 @@ msgid "Dump the mapgen debug infos."
msgstr "Die Kartengenerator-Debuginformationen auf Konsole ausgeben."
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Joysticks aktivieren"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "VBO aktivieren"
@@ -2021,6 +2064,14 @@ msgstr ""
"Hierfür müssen Shader aktiviert sein."
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Engine-Profiling-Datenausgabeintervall"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Entity-Methoden"
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2082,11 +2133,23 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Field of view"
-msgstr "Gesichtsfeld"
+msgstr "Sichtfeld"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Sichtfeld für Zoom"
#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
-msgstr "Gesichtsfeld in Grad."
+msgstr "Sichtfeld in Grad."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Sichtfeld beim Zoomen, in Grad.\n"
+"Dazu wird das „zoom“-Privileg auf dem Server benötigt."
#: src/settings_translation_file.cpp
msgid ""
@@ -2199,8 +2262,8 @@ msgstr ""
msgid ""
"From how far clients know about objects, stated in mapblocks (16 nodes)."
msgstr ""
-"Maximale Entfernung, in der Clients über Objekte bescheid wissen, in\n"
-"Kartenblöcken (16 Blöcke) angegeben."
+"Maximale Entfernung, in der Clients über die Existenz von Objekte wissen,\n"
+"in Kartenblöcken (16 Blöcke) angegeben."
#: src/settings_translation_file.cpp
msgid "Full screen"
@@ -2239,23 +2302,22 @@ msgid "Generate normalmaps"
msgstr "Normalmaps generieren"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Globale Rückruffunktionen"
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
"Globale Kartengenerierungsattribute.\n"
"Im Kartengenerator v6 wird das „decorations“-Flag alle Dekorationen außer\n"
-"Bäume und Dschungelgras aktivieren, in allen anderen Kartengeneratoren\n"
-"wird dieses Flag alle Dekorationen aktivieren.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„caves, light, decorations“.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
+"Bäume und Dschungelgras beinflussen, in allen anderen Kartengeneratoren\n"
+"wird es alle Dekorationen beinflussen.\n"
"Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
"werden von der Standardeinstellung unverändert gelassen.\n"
"Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -2287,13 +2349,28 @@ msgstr ""
"Handhabung für veraltete Lua-API-Aufrufe:\n"
"- legacy: Versuchen, altes Verhalten zu imitieren (Standard für Release).\n"
"- log: Imitieren, und den Backtrace des veralteten Funktionsaufrufs "
-"protokollieren (Standard für\n"
-" Debug).\n"
+"protokollieren\n"
+" (Standard für Debug).\n"
"- error: Bei Verwendung eines veralteten Funktionsaufrufs abbrechen ("
"empfohlen für Mod-\n"
" Entwickler)."
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Den Profiler sich selbst instrumentieren lassen:\n"
+"* Instrumentiert eine leere Funktion.\n"
+"Dies schätzt den Overhead, der von der Instrumentierung hinzugefügt wird, ab "
+"(+1 Funktionsaufruf).\n"
+"* Instrumentiert die Abtastfunktion, die zur Aktualisierung der Statistiken "
+"benutzt wird."
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr "Höhenkomponente der anfänglichen Fenstergröße."
@@ -2320,24 +2397,11 @@ msgid ""
"In active blocks objects are loaded and ABMs run."
msgstr ""
"Wie groß das Gebiet ist, in dem Kartenblöcke aktiv sind.\n"
-"In aktiven Blöcken werden Objekte geladen und ABMs ausgeführt.\n"
+"In aktiven Kartenblöcken werden Objekte geladen und ABMs ausgeführt.\n"
"1 Kartenblock = 16×16×16 Blöcke."
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-"Wie viele Kartenblöcke gleichzeitig für den gesamten Server auf der Leitung "
-"unterwegs sind."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-"Wie viele Kartenblöcke gleichzeitig pro Client auf der Leitung unterwegs "
-"sind."
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2462,6 +2526,48 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Hintergrundfarbe (R,G,B) der Chat-Konsole im Spiel."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"„builtin“ instrumentieren.\n"
+"Dies wird normalerweise nur von Haupt-/builtin-Entwicklern benötigt"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Chatbefehle bei ihrer Registrierung instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Globale Rückruffunktionen bei ihrer Registrierung instrumentieren\n"
+"(alles, was man einer Funktion wie minetest.register_*() übergibt)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+"Die action-Funktion von Active-Block-Modifiers bei ihrer Registrierung "
+"instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+"Die action-Funktion von Loading-Block-Modifiers bei ihrer Registrierung "
+"instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Die Methoden von Entitys bei ihrer Registrierung instrumentieren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentierung"
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Zeitintervall des Abspeicherns wichtiger Änderungen in der Welt,\n"
@@ -2500,6 +2606,14 @@ msgstr ""
"Steuert die Skalierung mit einem sehr hohem Detailgrad."
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Joystick-Button-Wiederholungsrate"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Joystick-Pyramidenstumpf-Empfindlichkeit"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2507,8 +2621,8 @@ msgid ""
"Range roughly -2 to 2."
msgstr ""
"Nur für Juliamenge: W-Komponente der hyperkomplexen Konstanten, welche die "
-"Juliaform festlegt.\n"
-"Hat keine Wirkung auf 3D-Fraktale.\n"
+"Juliaform\n"
+"festlegt. Hat keine Wirkung auf 3D-Fraktale.\n"
"Reichweite liegt grob zwischen -2 und 2."
#: src/settings_translation_file.cpp
@@ -2725,6 +2839,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Taste zum Umschalten des automatischen Vorwärtsgehens.\n"
+"Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2775,7 +2899,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2887,8 +3011,8 @@ msgid ""
"updated over network."
msgstr ""
"Länge eines Servertakts und dem Zeitintervall, in dem Objekte über das "
-"Netzwerk üblicherweise\n"
-"aktualisiert werden."
+"Netzwerk\n"
+"üblicherweise aktualisiert werden."
#: src/settings_translation_file.cpp
msgid "Length of time between ABM execution cycles"
@@ -2944,7 +3068,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Liquid fluidity"
-msgstr "Flüssigkeitswiederstand"
+msgstr "Flüssigkeitswiderstand"
#: src/settings_translation_file.cpp
msgid "Liquid fluidity smoothing"
@@ -2971,6 +3095,24 @@ msgid "Liquid update tick"
msgstr "Flüssigkeitsaktualisierungstakt"
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Spielprofiler laden"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Den Spielprofiler laden, um Profilingdaten für das Spiel zu sammeln.\n"
+"Aktiviert den „/profiler“-Befehl, um auf das erzeugte Profil zuzugreifen.\n"
+"Nützlich für Modentwickler und Serverbetreiber."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Loading Block Modifiers"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr "Hauptmenü-Spiel-Manager"
@@ -3007,20 +3149,17 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
"Kartengenerierungsattribute speziell für den Kartengenerator „Täler“.\n"
"„altitude_chill“ macht höhere Höhen kälter, was ein paar Biomprobleme "
-"hervorrufen könnte.\n"
+"hervorrufen\n"
+"könnte.\n"
"„humid_rivers“ modifiert die Luftfeuchtigkeit um Flüssen und in Gebieten, wo "
-"sich Wasser\n"
-"ansammeln würde; es könnte fein abgestimmte Biomen beeinträchtigen.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„altitude_chill, humid_rivers“.\n"
+"sich\n"
+"Wasser ansammeln würde; es könnte fein abgestimmte Biomen beeinträchtigen.\n"
"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
"Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
"werden von der Standardeinstellung unverändert gelassen.\n"
@@ -3031,16 +3170,13 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
"Kartengenerierungsattribute speziell für den flachen Kartengenerator.\n"
-"Gelegentlich werden Seen und Hügel zur flachen Welt hinzugefügt.\n"
-"Die von der Engine standardmäßig gesetzten Flags sind: keine.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
+"Zu einer flachen Welt können gelegentliche Seen und Hügel hinzugefügt "
+"werden.\n"
"Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
"werden von der Standardeinstellung unverändert gelassen.\n"
"Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -3051,8 +3187,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3061,9 +3195,6 @@ msgstr ""
"Falls Schneebiome aktiviert, werden Dschungel aktiviert und das „jungles“-"
"Flag\n"
"wird ignoriert.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„biomeblend, mudflow“.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
"Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
"werden von der Standardeinstellung unverändert gelassen.\n"
"Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -3073,17 +3204,12 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Kartengenerierungsattribute speziell für den Kartengenerator v7.\n"
+"Kartengenerierungsattribute speziell für Kartengenerator v7.\n"
"Das „ridges“-Flag steuert die Flüsse.\n"
-"Die von der Engine standardmäßig gesetzten Flags lauten:\n"
-"„mountains, ridges“.\n"
-"Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
"Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
"werden von der Standardeinstellung unverändert gelassen.\n"
"Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
@@ -3442,6 +3568,15 @@ msgid "Maximum hotbar width"
msgstr "Max. Breite der Schnellzugriffsleiste"
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Maximale Gesamtanzahl der Blöcke, die gleichzeitig gesendet werden."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+"Maximale Anzahl der Blöcke, die gleichzeitig je Client gesendet werden."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr "Maximale Anzahl der Kartenblöcke in der Ladewarteschlange."
@@ -3499,6 +3634,10 @@ msgstr ""
"Maximale Anzahl der statisch gespeicherten Objekte in einem Kartenblock."
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Maximale Objekte pro Block"
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
@@ -3508,12 +3647,12 @@ msgstr ""
"etwas gibt, was links oder rechts von ihr angezeigt werden soll."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Max. gleichzeitig versendete Kartenblöcke pro Client"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Max. gleichzeitig versendete Blöcke pro Client"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Max. gleichzeitig versendete Kartenblöcke"
+msgid "Maximum simultaneous block sends total"
+msgstr "Max. gleichzeitig versendete Blöcke (gesamt)"
#: src/settings_translation_file.cpp
msgid "Maximum time in ms a file download (e.g. a mod download) may take."
@@ -3526,10 +3665,6 @@ msgid "Maximum users"
msgstr "Maximale Benutzerzahl"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Maximale Objekte pro Kartenblock"
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Menüs"
@@ -3573,10 +3708,6 @@ msgid "Mipmapping"
msgstr "Mip-Mapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Mod-Profiling"
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr "Modspeicher: Details-URL"
@@ -3820,21 +3951,29 @@ msgstr ""
"Shell-Kommandos, benutzen können."
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+"Gibt die Profiling-Daten der Engine in regelmäßigen Abständen aus (in "
+"Sekunden).\n"
+"„0“ deaktiviert das Profiling. Nützlich für Entwickler."
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr "Privilegien, die Spieler mit basic_privs gewähren können"
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
-"Profiler-Datenausgabeintervall. 0 = deaktivieren. Nützlich für Entwickler."
+msgid "Profiler"
+msgstr "Profiler"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
msgstr "Profiler-Umschalten-Taste"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Profiler-Ausgabeintervall"
+msgid "Profiling"
+msgstr "Profiling"
#: src/settings_translation_file.cpp
msgid ""
@@ -3842,7 +3981,7 @@ msgid ""
"Values larger than 26 will start to produce sharp cutoffs at cloud area "
"corners."
msgstr ""
-"Radius des Wolkenbereichs; In Einheiten von 64 Blöcken.\n"
+"Radius des Wolkenbereichs; In Einheiten von 64 Wolkenquadraten.\n"
"Werte größer als 26 werden scharfe Schnittkanten an den Ecken des Wolken-\n"
"bereichs erzeugen."
@@ -3871,6 +4010,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr "Ersetzt das Standardhauptmenü mit einem benutzerdefinierten Hauptmenü."
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Berichtspfad"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Rechtstaste"
@@ -4045,14 +4188,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
"Shader werden für fortgeschrittene visuelle Effekte benötigt und können die "
-"Performanz\n"
-"auf einigen Grafikkarten erhöhen.\n"
-"Funktioniert nur mit dem OpenGL-Backend."
+"Performanz auf einigen Grafikkarten erhöhen.\n"
+"Sie funktionieren nur mit dem OpenGL-Grafik-Backend."
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
@@ -4064,7 +4206,7 @@ msgstr "Debug-Info zeigen"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
-msgstr "Entitiy-Auswahlboxen zeigen"
+msgstr "Entity-Auswahlboxen zeigen"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -4088,11 +4230,12 @@ msgstr "Geglättetes Licht"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
-"Glättet Kamerabewegungen bei der Fortbewegung und\n"
-"beim Umsehen. Nützlich zum Aufnehmen von Videos."
+"Glättet Kamerabewegungen bei der Fortbewegung und beim Umsehen. Auch bekannt "
+"als „Look Smoothing“ oder „Mouse Smoothing“.\n"
+"Nützlich zum Aufnehmen von Videos."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
@@ -4182,10 +4325,26 @@ msgid "The altitude at which temperature drops by 20C"
msgstr "Die Höhe, ab der die Temperatur um 20 °C fällt"
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"Das Standardformat, in dem Profile gespeichert werden,\n"
+"wenn „/profiler save [Format]“ ohne Format aufgerufen wird."
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr "Die Tiefe von Erde oder einem anderem Füller"
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+"Der Dateipfad relativ zu Ihrem Weltpfad, in dem Profile abgespeichert "
+"werden.\n"
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr "Die Netzwerkschnittstelle, auf die der Server lauscht."
@@ -4205,6 +4364,14 @@ msgstr "Das Render-Backend für Irrlicht."
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"Die Empfindlichkeit der Joystick-Achsen, um den\n"
+"Pyramidenstumpf der Spielansicht herumzubewegen."
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4231,6 +4398,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Das Intervall in Sekunden, in dem Ereignisse wiederholt werden,\n"
+"wenn eine Joystick-Tastenkombination gedrückt gehalten wird."
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -4275,11 +4450,10 @@ msgid ""
"This determines how long they are slowed down after placing or removing a "
"node."
msgstr ""
-"Um Verzögerungen zu reduzieren, werden Kartenblockübertragungen verlangsamt, "
-"während\n"
-"ein Spieler etwas baut. Diese Einstellung bestimmt, wie lange sie "
-"verlangsamt sind,\n"
-"nachdem ein Block platziert oder entfernt wurde."
+"Um Verzögerungen zu reduzieren, werden Kartenblockübertragungen verlangsamt,"
+"\n"
+"wenn ein Spieler etwas baut. Diese Einstellung bestimmt, wie lange sie\n"
+"verlangsamt werden, nachdem ein Block platziert oder entfernt wurde."
#: src/settings_translation_file.cpp
msgid "Toggle camera mode key"
@@ -4354,10 +4528,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Trilineare Filterung bei der Skalierung von Texturen benutzen."
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Nützlich für Mod-Entwickler."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr "Vertikale Synchronisation"
@@ -4493,13 +4663,14 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
"Falls gui_scaling_filter_txr2img auf „wahr“ gesetzt ist, werden\n"
"diese Bilder von der Hardware zur Software für die Skalierung\n"
-"kopiert. Falls es auf „falsch“ gesetzt ist, wird für alte Videotreiber,\n"
-"die das Herunterladen von Texturen zurück von der Hardware\n"
-"nicht vernünftig unterstützen."
+"kopiert. Falls es auf „falsch“ gesetzt ist, wird die alte Skalierungs-\n"
+"methode angewandt, für Grafiktreiber, welche das\n"
+"Herunterladen von Texturen zurück von der Hardware nicht\n"
+"korrekt unterstützen."
#: src/settings_translation_file.cpp
msgid ""
@@ -4534,12 +4705,12 @@ msgstr ""
"Wo der Kartengenerator aufhört.\n"
"Bitte beachten Sie:\n"
"- Begrenzt auf 31000 (größere Werte sind wirkungslos).\n"
-"- Der Kartengenerator arbeitet in Gruppen von 80×80×80 Blöcken (5×5×5 "
-"Kartenblöcke).\n"
+"- Der Kartengenerator arbeitet in Gruppen von 80×80×80 Blöcken\n"
+" (5×5×5 Kartenblöcke).\n"
"- Diese Gruppen haben einen Abstand von [-32, -32] Blöcken vom Ursprung.\n"
"- Nur Gruppen, welche innerhalb der von map_generation_limit definierten "
-"Grenze liegen,\n"
-" werden erzeugt."
+"Grenze\n"
+" liegen, werden erzeugt."
#: src/settings_translation_file.cpp
msgid ""
@@ -4635,409 +4806,450 @@ msgstr "cURL-Parallel-Begrenzung"
msgid "cURL timeout"
msgstr "cURL-Zeitüberschreitung"
-#~ msgid "Item textures..."
-#~ msgstr "Inventarbilder ..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Detaillierte Mod-Profildaten. Nützlich für Mod-Entwickler."
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Eine etwas niedrigere Wasseroberfläche aktivieren, damit der Node\n"
-#~ "nicht vollständig „gefüllt“ wird. Beachten Sie, dass dies nicht wirklich\n"
-#~ "optimiert wurde, und dass weiches Licht auf der Wasseroberfläche\n"
-#~ "nicht mit dieser Einstellung funktioniert."
-
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr "Blöcke bei Auswahl aufleuchten lassen (Deaktiviert die Auswahlbox)."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Detailliertes Mod-Profiling"
#~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
#~ msgstr ""
-#~ "Julia-Menge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
-#~ "Reichweite liegt grob von -2 bis 2, wird mit j_scale für Versätze in\n"
-#~ "Nodes multipliziert."
+#~ "Wie viele Kartenblöcke gleichzeitig für den gesamten Server auf der "
+#~ "Leitung unterwegs sind."
-#~ msgid ""
-#~ "Julia set: W value determining the 4D shape.\n"
-#~ "Range roughly -2 to 2."
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
#~ msgstr ""
-#~ "Julia-Menge: W-Wert, der die 4D-Form festlegt.\n"
-#~ "Weite liegt grob zwischen -2 und 2."
-
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Taste zur Reduzierung der Sichtweite. Verändert die minimale Sichtweite.\n"
-#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ "Wie viele Kartenblöcke gleichzeitig pro Client auf der Leitung unterwegs "
+#~ "sind."
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Taste zur Erhöhung der Sichtweite. Verändert die minimale Sichtweite.\n"
-#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Nützlich für Mod-Entwickler."
-#~ msgid ""
-#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Mandelbrotmenge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
-#~ "Reichweite liegt grob von -2 bis 2, wird mit m_scale für\n"
-#~ "Versätze in Nodes multipliziert."
+#~ msgid "No of course not!"
+#~ msgstr "Nein, natürlich nicht!"
-#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
-#~ msgstr "Mandelbrotmenge: Approximative (X,Y,Z)-Skalierungen in Nodes."
+#~ msgid "Public Serverlist"
+#~ msgstr "Öffentliche Serverliste"
-#~ msgid ""
-#~ "Mandelbrot set: Iterations of the recursive function.\n"
-#~ "Controls scale of finest detail."
-#~ msgstr ""
-#~ "Mandelbrotmenge: Iterationen der rekursiven Funktion.\n"
-#~ "Steuert die Skalierung mit einem sehr hohem Detailgrad."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normalmaps generieren"
-#~ msgid ""
-#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
-#~ "Range roughly -2 to 2."
-#~ msgstr ""
-#~ "Madnelbrotmenge: W-Koordinate des generierten 3D-Ausschnitts der 4D-"
-#~ "Form.\n"
-#~ "Die Weite liegt grob zwischen -2 und 2."
+#~ msgid "No!!!"
+#~ msgstr "Nein!!!"
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen fractal.\n"
-#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
#~ msgstr ""
-#~ "Kartengenerierungsattribute, die speziell für den Fraktale-\n"
-#~ "Kartenerzeuger sind.\n"
-#~ "„julia“ wählt für die Erzeugung eine Julia-Menge statt einer\n"
-#~ "Mandelbrotmenge aus.\n"
-#~ "Bitschalter, welche in der Bitschalterzeichenkette nicht angegeben sind,\n"
+#~ "Kartengenerierungsattribute speziell für den Täler-Kartengenerator.\n"
+#~ "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
#~ "werden von der Standardeinstellung unverändert gelassen.\n"
-#~ "Bitschalter, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
-#~ "zu deaktivieren."
+#~ "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
+#~ "zu deaktivieren.\n"
+#~ "„altitude_chill“ macht höhere Höhen kälter, was zu einigen Biomproblemen "
+#~ "führen könnte.\n"
+#~ "„humid_rivers“ modifiziert die Luftfeuchtigkeit um Flüssen und in "
+#~ "Gebieten, in denen das Wasser sich in Pfützen ansammeln würde.\n"
+#~ "Dies könnte mit fein abgestimmten Biomen zu Konflikten führen."
-#~ msgid "Mapgen fractal mandelbrot iterations"
-#~ msgstr "Mandelbrotiterationen für Fraktale-Kartenerzeuger"
+#, fuzzy
+#~ msgid "\""
+#~ msgstr "â€"
-#~ msgid "Mapgen fractal mandelbrot offset"
-#~ msgstr "Mandelbrotversatz für Fraktale-Kartenerzeuger"
+#~ msgid "Enable a bit lower water surface, so it doesn't "
+#~ msgstr "Senkt ein bisschen den Wasserspiegel, so tut es nicht "
-#~ msgid "Mapgen fractal mandelbrot scale"
-#~ msgstr "Mandelbrotskalierung für Fraktale-Kartenerzeuger"
+#~ msgid "If disabled "
+#~ msgstr "Wenn deaktiviert "
-#~ msgid "Mapgen fractal mandelbrot slice w"
-#~ msgstr "Mandelbrot-w-Ausschnitt für Fraktale-Kartenerzeuger"
+#~ msgid "If enabled, "
+#~ msgstr "Wenn aktiviert, "
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Höchstabstand über dem Meeresspiegel für den Spieler-\n"
-#~ "startpunkt. Größere Werte führen zu Startpunkten näher an\n"
-#~ "(x = 0, z = 0). Kleinere Werte können dazu führen, dass kein\n"
-#~ "brauchbarer Startpunkt gefunden wird, was wiederum zu einem\n"
-#~ "Startpunkt bei (0, 0, 0) führt, der möglicherweise im Untergrund\n"
-#~ "eingegraben ist."
+#~ msgid "Rendering:"
+#~ msgstr "Rendering:"
+
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Neustart nach Ändern des Treibers erforderlich"
+
+#~ msgid "Downloading"
+#~ msgstr "Lade herunter"
+
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Linksklick: Alle Items bewegen, Rechtsklick: Einzelnes Item bewegen"
+
+#~ msgid "is required by:"
+#~ msgstr "wird benötigt von:"
+
+#~ msgid "Configuration saved. "
+#~ msgstr "Konfiguration gespeichert. "
+
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Warnung: Konfiguration nicht konsistent. "
+
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Kann Welt nicht erstellen: Name enthält ungültige Zeichen"
+
+#~ msgid "Show Public"
+#~ msgstr "Zeige öffentliche"
+
+#~ msgid "Show Favorites"
+#~ msgstr "Zeige Favoriten"
+
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Lasse die Adresse frei um einen eigenen Server zu starten."
+
+#~ msgid "Create world"
+#~ msgstr "Welt erstellen"
+
+#~ msgid "Address required."
+#~ msgstr "Adresse benötigt."
+
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Kann Welt nicht löchen: Nichts ausgewählt"
+
+#~ msgid "Files to be deleted"
+#~ msgstr "Zu löschende Dateien"
+
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Kann Welt nicht erstellen: Keine Spiele gefunden"
+
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Kann Welt nicht konfigurieren: Nichts ausgewählt"
+
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Es konnten nicht alle Welt Dateien gelöscht werden"
#~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
+#~ "Default Controls:\n"
+#~ "- WASD: Walk\n"
+#~ "- Mouse left: dig/hit\n"
+#~ "- Mouse right: place/use\n"
+#~ "- Mouse wheel: select item\n"
+#~ "- 0...9: select item\n"
+#~ "- Shift: sneak\n"
+#~ "- R: Toggle viewing all loaded chunks\n"
+#~ "- I: Inventory menu\n"
+#~ "- ESC: This menu\n"
+#~ "- T: Chat\n"
#~ msgstr ""
-#~ "Minimal gewünschte Bildwiederholrate.\n"
-#~ "Die Anzahl der berechneten Dinge wird anhand dieses Werts dynamisch "
-#~ "angepasst; auch\n"
-#~ "die minimale und maximale Sichtweite werden angepasst."
+#~ "Steuerung:\n"
+#~ "- WASD: Gehen\n"
+#~ "- Linksklick: Graben/Schlagen\n"
+#~ "- Rechtsklick: Platzieren\n"
+#~ "- Mausrad: Item auswählen\n"
+#~ "- 0...9: Item auswählen\n"
+#~ "- Shift: Schleichen\n"
+#~ "- R: alle geladenen Blöcke anzeigen (wechseln)\n"
+#~ "- I: Inventar\n"
+#~ "- T: Chat\n"
-#~ msgid "New style water"
-#~ msgstr "Wasser im neuen Stil"
+#~ msgid "Delete map"
+#~ msgstr "Karte löschen"
+
+#~ msgid "KEYBINDINGS"
+#~ msgstr "TASTEN EINST."
#~ msgid ""
-#~ "Pre-generate all item visuals used in the inventory.\n"
-#~ "This increases startup time, but runs smoother in-game.\n"
-#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
-#~ "the inventory."
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
#~ msgstr ""
-#~ "Alle Itembilder im Inventar vor dem Spielstart erzeugen.\n"
-#~ "Dies erhöht die Vorbereitungszeit, wird aber zu einem flüssigerem Spiel "
-#~ "führen.\n"
-#~ "Die erzeugten Texturen können Ihr VRAM leicht überlasten, was Artefakte "
-#~ "im Inventar\n"
-#~ "verursachen kann."
-
-#~ msgid "Preload inventory textures"
-#~ msgstr "Texturen vorgenerieren"
+#~ "Warnung: Einige konfigurierte Mods fehlen.\n"
+#~ "Mod Einstellungen werden gelöscht wenn die Konfiguration gespeichert "
+#~ "wird. "
#~ msgid ""
-#~ "The allowed adjustment range for the automatic rendering range "
-#~ "adjustment.\n"
-#~ "Set this to be equal to viewing range minimum to disable the auto-"
-#~ "adjustment algorithm."
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
#~ msgstr ""
-#~ "Die erlaubte Anpassungsreichweite für die automatische Render-"
-#~ "Reichweitenanpassung.\n"
-#~ "Setzen Sie den Wert auf den gleichen Wert wie die minimale Sichtweite, um "
-#~ "den automatischen\n"
-#~ "Anpassungsalgorithmus zu deaktivieren."
+#~ "Warnung: Einige Mods sind noch nicht konfiguriert.\n"
+#~ "Sie werden aktiviert wenn die Konfiguration gespeichert wird. "
-#~ msgid "Vertical initial window size."
-#~ msgstr "Anfängliche Fensterhöhe."
+#~ msgid "Local install"
+#~ msgstr "Lokale Install."
-#~ msgid "Vertical spawn range"
-#~ msgstr "Vertikaler Startpunktbereich"
+#~ msgid "Add mod:"
+#~ msgstr "Modifikation hinzufügen:"
-#~ msgid "Viewing range minimum"
-#~ msgstr "Minimale Sichtweite"
+#~ msgid "MODS"
+#~ msgstr "MODS"
-#~ msgid "Wanted FPS"
-#~ msgstr "Gewünschte Bildwiederholrate"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "TEXTUREN PAKETE"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Einzelspielerwelt zurücksetzen"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "EINZELSPIELER"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Auf Menüelemente angewandter Skalierfaktor: "
+#~ msgid "Finite Liquid"
+#~ msgstr "Endliches Wasser"
-#~ msgid "Touch free target"
-#~ msgstr "Berührungsfreies Ziel"
+#~ msgid "Preload item visuals"
+#~ msgstr "Lade Inventarbilder vor"
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#~ msgid "SETTINGS"
+#~ msgstr "EINSTELLUNGEN"
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#~ msgid "Password"
+#~ msgstr "Passwort"
-#~ msgid "Game Name"
-#~ msgstr "Spielname"
+#~ msgid "Name"
+#~ msgstr "Name"
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Kann mod \"$1\" nicht in Spiel \"$2\" kopieren"
+#~ msgid "START SERVER"
+#~ msgstr "SERVER STARTEN"
-#~ msgid "GAMES"
-#~ msgstr "SPIELE"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
-#~ msgid "Mods:"
-#~ msgstr "Mods:"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Mod hinzufügen"
-#~ msgid "new game"
-#~ msgstr "neues Spiel"
+#~ msgid "Remove selected mod"
+#~ msgstr "Ausgewählte Mod löschen"
#~ msgid "EDIT GAME"
#~ msgstr "SPIEL ÄNDERN"
-#~ msgid "Remove selected mod"
-#~ msgstr "Ausgewählte Mod löschen"
-
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Mod hinzufügen"
+#~ msgid "new game"
+#~ msgstr "neues Spiel"
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "Mods:"
+#~ msgstr "Mods:"
-#~ msgid "START SERVER"
-#~ msgstr "SERVER STARTEN"
+#~ msgid "GAMES"
+#~ msgstr "SPIELE"
-#~ msgid "Name"
-#~ msgstr "Name"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Kann mod \"$1\" nicht in Spiel \"$2\" kopieren"
-#~ msgid "Password"
-#~ msgstr "Passwort"
+#~ msgid "Game Name"
+#~ msgstr "Spielname"
-#~ msgid "SETTINGS"
-#~ msgstr "EINSTELLUNGEN"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
-#~ msgid "Preload item visuals"
-#~ msgstr "Lade Inventarbilder vor"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
-#~ msgid "Finite Liquid"
-#~ msgstr "Endliches Wasser"
+#~ msgid "Touch free target"
+#~ msgstr "Berührungsfreies Ziel"
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "EINZELSPIELER"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Auf Menüelemente angewandter Skalierfaktor: "
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "TEXTUREN PAKETE"
+#~ msgid "Wanted FPS"
+#~ msgstr "Gewünschte Bildwiederholrate"
-#~ msgid "MODS"
-#~ msgstr "MODS"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Minimale Sichtweite"
-#~ msgid "Add mod:"
-#~ msgstr "Modifikation hinzufügen:"
+#~ msgid "Vertical spawn range"
+#~ msgstr "Vertikaler Startpunktbereich"
-#~ msgid "Local install"
-#~ msgstr "Lokale Install."
+#~ msgid "Vertical initial window size."
+#~ msgstr "Anfängliche Fensterhöhe."
#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
+#~ "The allowed adjustment range for the automatic rendering range "
+#~ "adjustment.\n"
+#~ "Set this to be equal to viewing range minimum to disable the auto-"
+#~ "adjustment algorithm."
#~ msgstr ""
-#~ "Warnung: Einige Mods sind noch nicht konfiguriert.\n"
-#~ "Sie werden aktiviert wenn die Konfiguration gespeichert wird. "
+#~ "Die erlaubte Anpassungsreichweite für die automatische Render-"
+#~ "Reichweitenanpassung.\n"
+#~ "Setzen Sie den Wert auf den gleichen Wert wie die minimale Sichtweite, um "
+#~ "den automatischen\n"
+#~ "Anpassungsalgorithmus zu deaktivieren."
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Texturen vorgenerieren"
#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
+#~ "Pre-generate all item visuals used in the inventory.\n"
+#~ "This increases startup time, but runs smoother in-game.\n"
+#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
+#~ "the inventory."
#~ msgstr ""
-#~ "Warnung: Einige konfigurierte Mods fehlen.\n"
-#~ "Mod Einstellungen werden gelöscht wenn die Konfiguration gespeichert "
-#~ "wird. "
-
-#~ msgid "KEYBINDINGS"
-#~ msgstr "TASTEN EINST."
+#~ "Alle Itembilder im Inventar vor dem Spielstart erzeugen.\n"
+#~ "Dies erhöht die Vorbereitungszeit, wird aber zu einem flüssigerem Spiel "
+#~ "führen.\n"
+#~ "Die erzeugten Texturen können Ihr VRAM leicht überlasten, was Artefakte "
+#~ "im Inventar\n"
+#~ "verursachen kann."
-#~ msgid "Delete map"
-#~ msgstr "Karte löschen"
+#~ msgid "New style water"
+#~ msgstr "Wasser im neuen Stil"
#~ msgid ""
-#~ "Default Controls:\n"
-#~ "- WASD: Walk\n"
-#~ "- Mouse left: dig/hit\n"
-#~ "- Mouse right: place/use\n"
-#~ "- Mouse wheel: select item\n"
-#~ "- 0...9: select item\n"
-#~ "- Shift: sneak\n"
-#~ "- R: Toggle viewing all loaded chunks\n"
-#~ "- I: Inventory menu\n"
-#~ "- ESC: This menu\n"
-#~ "- T: Chat\n"
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
#~ msgstr ""
-#~ "Steuerung:\n"
-#~ "- WASD: Gehen\n"
-#~ "- Linksklick: Graben/Schlagen\n"
-#~ "- Rechtsklick: Platzieren\n"
-#~ "- Mausrad: Item auswählen\n"
-#~ "- 0...9: Item auswählen\n"
-#~ "- Shift: Schleichen\n"
-#~ "- R: alle geladenen Blöcke anzeigen (wechseln)\n"
-#~ "- I: Inventar\n"
-#~ "- T: Chat\n"
-
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Es konnten nicht alle Welt Dateien gelöscht werden"
-
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Kann Welt nicht konfigurieren: Nichts ausgewählt"
-
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Kann Welt nicht erstellen: Keine Spiele gefunden"
-
-#~ msgid "Files to be deleted"
-#~ msgstr "Zu löschende Dateien"
-
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Kann Welt nicht löchen: Nichts ausgewählt"
+#~ "Minimal gewünschte Bildwiederholrate.\n"
+#~ "Die Anzahl der berechneten Dinge wird anhand dieses Werts dynamisch "
+#~ "angepasst; auch\n"
+#~ "die minimale und maximale Sichtweite werden angepasst."
-#~ msgid "Address required."
-#~ msgstr "Adresse benötigt."
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Höchstabstand über dem Meeresspiegel für den Spieler-\n"
+#~ "startpunkt. Größere Werte führen zu Startpunkten näher an\n"
+#~ "(x = 0, z = 0). Kleinere Werte können dazu führen, dass kein\n"
+#~ "brauchbarer Startpunkt gefunden wird, was wiederum zu einem\n"
+#~ "Startpunkt bei (0, 0, 0) führt, der möglicherweise im Untergrund\n"
+#~ "eingegraben ist."
-#~ msgid "Create world"
-#~ msgstr "Welt erstellen"
+#~ msgid "Mapgen fractal mandelbrot slice w"
+#~ msgstr "Mandelbrot-w-Ausschnitt für Fraktale-Kartenerzeuger"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Lasse die Adresse frei um einen eigenen Server zu starten."
+#~ msgid "Mapgen fractal mandelbrot scale"
+#~ msgstr "Mandelbrotskalierung für Fraktale-Kartenerzeuger"
-#~ msgid "Show Favorites"
-#~ msgstr "Zeige Favoriten"
+#~ msgid "Mapgen fractal mandelbrot offset"
+#~ msgstr "Mandelbrotversatz für Fraktale-Kartenerzeuger"
-#~ msgid "Show Public"
-#~ msgstr "Zeige öffentliche"
+#~ msgid "Mapgen fractal mandelbrot iterations"
+#~ msgstr "Mandelbrotiterationen für Fraktale-Kartenerzeuger"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Kann Welt nicht erstellen: Name enthält ungültige Zeichen"
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen fractal.\n"
+#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ msgstr ""
+#~ "Kartengenerierungsattribute, die speziell für den Fraktale-\n"
+#~ "Kartenerzeuger sind.\n"
+#~ "„julia“ wählt für die Erzeugung eine Julia-Menge statt einer\n"
+#~ "Mandelbrotmenge aus.\n"
+#~ "Bitschalter, welche in der Bitschalterzeichenkette nicht angegeben sind,\n"
+#~ "werden von der Standardeinstellung unverändert gelassen.\n"
+#~ "Bitschalter, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
+#~ "zu deaktivieren."
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Warnung: Konfiguration nicht konsistent. "
+#~ msgid ""
+#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Madnelbrotmenge: W-Koordinate des generierten 3D-Ausschnitts der 4D-"
+#~ "Form.\n"
+#~ "Die Weite liegt grob zwischen -2 und 2."
-#~ msgid "Configuration saved. "
-#~ msgstr "Konfiguration gespeichert. "
+#~ msgid ""
+#~ "Mandelbrot set: Iterations of the recursive function.\n"
+#~ "Controls scale of finest detail."
+#~ msgstr ""
+#~ "Mandelbrotmenge: Iterationen der rekursiven Funktion.\n"
+#~ "Steuert die Skalierung mit einem sehr hohem Detailgrad."
-#~ msgid "is required by:"
-#~ msgstr "wird benötigt von:"
+#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
+#~ msgstr "Mandelbrotmenge: Approximative (X,Y,Z)-Skalierungen in Nodes."
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Linksklick: Alle Items bewegen, Rechtsklick: Einzelnes Item bewegen"
+#~ msgid ""
+#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Mandelbrotmenge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
+#~ "Reichweite liegt grob von -2 bis 2, wird mit m_scale für\n"
+#~ "Versätze in Nodes multipliziert."
-#~ msgid "Downloading"
-#~ msgstr "Lade herunter"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Taste zur Erhöhung der Sichtweite. Verändert die minimale Sichtweite.\n"
+#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Neustart nach Ändern des Treibers erforderlich"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Taste zur Reduzierung der Sichtweite. Verändert die minimale Sichtweite.\n"
+#~ "Siehe http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "Rendering:"
-#~ msgstr "Rendering:"
+#~ msgid ""
+#~ "Julia set: W value determining the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Julia-Menge: W-Wert, der die 4D-Form festlegt.\n"
+#~ "Weite liegt grob zwischen -2 und 2."
-#~ msgid "If enabled, "
-#~ msgstr "Wenn aktiviert, "
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Julia-Menge: (X,Y,Z)-Versatz vom Mittelpunkt der Welt.\n"
+#~ "Reichweite liegt grob von -2 bis 2, wird mit j_scale für Versätze in\n"
+#~ "Nodes multipliziert."
-#~ msgid "If disabled "
-#~ msgstr "Wenn deaktiviert "
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr "Blöcke bei Auswahl aufleuchten lassen (Deaktiviert die Auswahlbox)."
-#~ msgid "Enable a bit lower water surface, so it doesn't "
-#~ msgstr "Senkt ein bisschen den Wasserspiegel, so tut es nicht "
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Eine etwas niedrigere Wasseroberfläche aktivieren, damit der Node\n"
+#~ "nicht vollständig „gefüllt“ wird. Beachten Sie, dass dies nicht wirklich\n"
+#~ "optimiert wurde, und dass weiches Licht auf der Wasseroberfläche\n"
+#~ "nicht mit dieser Einstellung funktioniert."
-#, fuzzy
-#~ msgid "\""
-#~ msgstr "â€"
+#~ msgid "Item textures..."
+#~ msgstr "Inventarbilder ..."
#~ msgid ""
#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with 'no' are used to explicitly disable them."
#~ msgstr ""
-#~ "Kartengenerierungsattribute speziell für Kartengenerator v7.\n"
-#~ "„ridges“ sind die Flüsse.\n"
-#~ "Flags, welche in der Bitschalterzeichenkette nicht angegeben sind,\n"
+#~ "Kartengenerierungsattribute speziell für den Kartengenerator v7.\n"
+#~ "Das „ridges“-Flag steuert die Flüsse.\n"
+#~ "Die von der Engine standardmäßig gesetzten Flags lauten:\n"
+#~ "„mountains, ridges“.\n"
+#~ "Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
+#~ "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
#~ "werden von der Standardeinstellung unverändert gelassen.\n"
#~ "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
#~ "zu deaktivieren."
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
#~ msgstr ""
-#~ "Kartengenerierungsattribute speziell für den Täler-Kartengenerator.\n"
+#~ "Kartengenerierungsattribute speziell für den flachen Kartengenerator.\n"
+#~ "Gelegentlich werden Seen und Hügel zur flachen Welt hinzugefügt.\n"
+#~ "Die von der Engine standardmäßig gesetzten Flags sind: keine.\n"
+#~ "Die Flags-Zeichenkette modifiert den Standardwert der Engine.\n"
#~ "Flags, welche in der Flags-Zeichenkette nicht angegeben sind,\n"
#~ "werden von der Standardeinstellung unverändert gelassen.\n"
#~ "Flags, welche mit „no“ beginnen, werden benutzt, um sie explizit\n"
-#~ "zu deaktivieren.\n"
-#~ "„altitude_chill“ macht höhere Höhen kälter, was zu einigen Biomproblemen "
-#~ "führen könnte.\n"
-#~ "„humid_rivers“ modifiziert die Luftfeuchtigkeit um Flüssen und in "
-#~ "Gebieten, in denen das Wasser sich in Pfützen ansammeln würde.\n"
-#~ "Dies könnte mit fein abgestimmten Biomen zu Konflikten führen."
-
-#~ msgid "No!!!"
-#~ msgstr "Nein!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normalmaps generieren"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Öffentliche Serverliste"
-
-#~ msgid "No of course not!"
-#~ msgstr "Nein, natürlich nicht!"
+#~ "zu deaktivieren."
diff --git a/po/eo/minetest.po b/po/eo/minetest.po
index d1c137f21..adf29a0b6 100644
--- a/po/eo/minetest.po
+++ b/po/eo/minetest.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-09-13 12:36+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-06-04 13:18+0000\n"
"Last-Translator: Tim <t4im@openmailbox.org>\n"
"Language-Team: Esperanto <https://hosted.weblate.org/projects/minetest/"
"minetest/eo/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.4-dev\n"
+"X-Generator: Weblate 2.7-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -220,18 +220,16 @@ msgid "Browse"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid "Disabled"
-msgstr "MalÅaltu modifaron"
+msgstr "MalÅaltita"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Edit"
-msgstr ""
+msgstr "Redakti"
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid "Enabled"
-msgstr "Åaltita"
+msgstr "Åœaltita"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
@@ -244,9 +242,8 @@ msgid ""
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid "Games"
-msgstr "Ludo"
+msgstr "Ludoj"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
msgid "Mods"
@@ -407,9 +404,8 @@ msgid "Uninstall selected modpack"
msgstr "Malinstali selektan modifaron"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "Adreso / Pordo:"
+msgstr "Adreso / Pordo"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -436,9 +432,8 @@ msgid "Favorite"
msgstr ""
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Nomo / Pasvorto:"
+msgstr "Nomo / Pasvorto"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -503,7 +498,6 @@ msgid "2x"
msgstr "2x"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "3D Clouds"
msgstr "3D nuboj"
@@ -516,9 +510,8 @@ msgid "8x"
msgstr "8x"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Advanced Settings"
-msgstr "Agordoj"
+msgstr "Pliaj Agordoj"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
@@ -529,12 +522,10 @@ msgid "Are you sure to reset your singleplayer world?"
msgstr "Ĉu vi certas, ke vi volas nuligi vian solludantan mondon?"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bilinear Filter"
msgstr "Bilineara filtrilo"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
msgstr "Protuberancmapado"
@@ -543,7 +534,6 @@ msgid "Change keys"
msgstr "ÅœanÄi klavojn"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Connected Glass"
msgstr "Ligata glaco"
@@ -564,7 +554,6 @@ msgid "No"
msgstr "Ne"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "No Filter"
msgstr "Neniu filtrilo"
@@ -573,23 +562,20 @@ msgid "No Mipmap"
msgstr "Neniu Mipmapo"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Highlighting"
-msgstr "Marki nodaĵojn"
+msgstr "Nodaĵa emfazado"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
-msgstr "Marki nodaĵojn"
+msgstr "Nodaĵa kadrado"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
-msgstr ""
+msgstr "Neniu"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "Protuberancmapado"
+msgstr "Normalmapado"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -609,6 +595,10 @@ msgid "Particles"
msgstr "Ŝaltu ĉiujn"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Nuligi solludantan mondon"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Agordoj"
@@ -643,22 +633,18 @@ msgid "Touchthreshold (px)"
msgstr "TuÅa sojlo (px)"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Trilinear Filter"
-msgstr "Triineara filtrilo"
+msgstr "Trilineara filtrilo"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Leaves"
msgstr "Ondantaj foliaĵoj"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Plants"
msgstr "Ondantaj plantoj"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Water"
msgstr "Ondanta akvo"
@@ -989,6 +975,10 @@ msgstr "Baskuli nekolizian reÄimon"
msgid "Use"
msgstr "Uzi"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zomo"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "premi klavon"
@@ -1305,10 +1295,6 @@ msgstr "X-Butono 1"
msgid "X Button 2"
msgstr "X-Butono 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zomo"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1325,7 +1311,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "3D clouds"
msgstr "3D nuboj"
@@ -1376,6 +1361,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1450,6 +1439,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "MalantaÅ­en"
@@ -1468,7 +1461,6 @@ msgid "Basic Privileges"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bilinear filtering"
msgstr "Bilineara filtrilo"
@@ -1486,6 +1478,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Protuberancmapado"
@@ -1528,6 +1524,11 @@ msgid "Chat toggle key"
msgstr "ÅœanÄi klavojn"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Komando"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1585,9 +1586,8 @@ msgid "Cloud radius"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Clouds"
-msgstr "3D nuboj"
+msgstr "Nuboj"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
@@ -1604,14 +1604,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1639,14 +1639,12 @@ msgid "Console alpha"
msgstr "Konzolo"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console color"
-msgstr "Konzolo"
+msgstr "Konzola koloro"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console key"
-msgstr "Konzolo"
+msgstr "Konzola klavo"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
@@ -1657,9 +1655,8 @@ msgid "Continuous forward movement (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Controls"
-msgstr "Stiro"
+msgstr "Stirado"
#: src/settings_translation_file.cpp
msgid ""
@@ -1727,9 +1724,8 @@ msgid "DPI"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Damage"
-msgstr "Åœalti damaÄon"
+msgstr "DamaÄon"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
@@ -1758,15 +1754,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Default password"
-msgstr "Nova pasvorto"
+msgstr "DefaÅ­lta pasvorto"
#: src/settings_translation_file.cpp
msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1783,6 +1782,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1813,14 +1816,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1833,6 +1828,18 @@ msgid "Disable anticheat"
msgstr "Åœalti partiklojn"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
@@ -1859,6 +1866,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Åœaltu modifaron"
@@ -1945,6 +1956,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2006,11 +2025,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2148,12 +2177,14 @@ msgid "Generate normalmaps"
msgstr "Generi Normalmapojn"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2185,6 +2216,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2213,15 +2253,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2316,6 +2347,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2351,6 +2416,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2511,6 +2584,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2546,7 +2626,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2698,6 +2778,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2732,8 +2827,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2743,8 +2836,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2755,8 +2846,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2766,8 +2855,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3148,6 +3235,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3189,17 +3284,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3211,10 +3310,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Menuo"
@@ -3257,10 +3352,6 @@ msgid "Mipmapping"
msgstr "Protuberancmapado"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3473,11 +3564,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3485,7 +3582,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3522,6 +3619,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Report path"
+msgstr "Selekto"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Right key"
msgstr "Dekstra Menuo"
@@ -3690,7 +3792,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3728,7 +3830,7 @@ msgstr "Glatiga lumo"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3810,10 +3912,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3829,6 +3943,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3844,6 +3964,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3948,11 +4074,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Eksaj kernprogramistoj"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4042,22 +4163,18 @@ msgid "Water surface level of the world."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving Nodes"
-msgstr "Ondantaj foliaĵoj"
+msgstr "Ondantaj nodaĵoj"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving leaves"
msgstr "Ondantaj foliaĵoj"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving plants"
msgstr "Ondantaj plantoj"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving water"
msgstr "Ondanta akvo"
@@ -4088,7 +4205,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4189,41 +4306,42 @@ msgid "cURL timeout"
msgstr ""
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Ŝargi teksturojn…"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Eksaj kernprogramistoj"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Nuligi solludantan mondon"
+#~ msgid "No of course not!"
+#~ msgstr "Ne, memkompreneble!"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Skala faktoro por menuoj "
+#~ msgid "Public Serverlist"
+#~ msgstr "Publika servilolisto"
-#~ msgid "Touch free target"
-#~ msgstr "SentuÅa celo"
+#, fuzzy
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generi Normalmapojn"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Restartigu Minetest-on por efikigi pelilan ÅanÄon"
+#~ msgid "No!!!"
+#~ msgstr "Ne!!!"
-#~ msgid "Rendering:"
-#~ msgstr "Bildigo:"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "MalÅaltu modifaron"
#, fuzzy
#~ msgid "If enabled, "
#~ msgstr "Åaltita"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "MalÅaltu modifaron"
+#~ msgid "Rendering:"
+#~ msgstr "Bildigo:"
-#~ msgid "No!!!"
-#~ msgstr "Ne!!!"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Restartigu Minetest-on por efikigi pelilan ÅanÄon"
-#, fuzzy
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generi Normalmapojn"
+#~ msgid "Touch free target"
+#~ msgstr "SentuÅa celo"
-#~ msgid "Public Serverlist"
-#~ msgstr "Publika servilolisto"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Skala faktoro por menuoj "
-#~ msgid "No of course not!"
-#~ msgstr "Ne, memkompreneble!"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Ŝargi teksturojn…"
diff --git a/po/es/minetest.po b/po/es/minetest.po
index 03df1d597..72438dc26 100644
--- a/po/es/minetest.po
+++ b/po/es/minetest.po
@@ -7,17 +7,17 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-10 18:21+0000\n"
-"Last-Translator: Diego Martínez <lkaezadl3@gmail.com>\n"
-"Language-Team: Spanish "
-"<https://hosted.weblate.org/projects/minetest/minetest/es/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-04 03:39+0000\n"
+"Last-Translator: Alfonso R. Zepeda R. <ing.a.zepeda@gmx.com>\n"
+"Language-Team: Spanish <https://hosted.weblate.org/projects/minetest/"
+"minetest/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -49,11 +49,11 @@ msgstr "Cargando..."
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
-msgstr "Desajuste con la versión del protocolo. "
+msgstr "La versión del protocolo no coincide. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr "El servidor hace respetar la versión $1 del protocolo "
+msgstr "El servidor utiliza el protocolo versión $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
@@ -103,7 +103,7 @@ msgid ""
"chararacters [a-z0-9_] are allowed."
msgstr ""
"Error al activar el mod \"$1\" por contener caracteres no permitidos. Solo "
-"los caracteres [a-z0-9_] estan permitidos."
+"los caracteres [a-z0-9_] están permitidos."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
@@ -257,7 +257,9 @@ msgstr "Mods"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
-msgstr "Opcionalmente, el lacunaridad puede ser anexado con una coma líder."
+msgstr ""
+"Opcionalmente, el parámetro \"lacunarity\" puede ser anexado separándolo "
+"mediante una coma."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a comma seperated list of flags."
@@ -603,6 +605,10 @@ msgid "Particles"
msgstr "Partículas"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reiniciar mundo de un jugador"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Configuración"
@@ -981,6 +987,10 @@ msgstr "Activar noclip"
msgid "Use"
msgstr "Usar"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "pulsa una tecla"
@@ -1152,7 +1162,7 @@ msgstr "Bloq Núm"
#: src/keycode.cpp
msgid "Numpad *"
-msgstr "Numpad *"
+msgstr "Teclado Numérico *"
#: src/keycode.cpp
msgid "Numpad +"
@@ -1298,10 +1308,6 @@ msgstr "X Botón 1"
msgid "X Button 2"
msgstr "X Botón 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1389,12 +1395,17 @@ msgid "Active Block Modifier interval"
msgstr "Intervalo de modificador de bloques activos"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Intervalo de modificador de bloques activos"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr "Rango de bloque activo"
#: src/settings_translation_file.cpp
msgid "Active object send range"
-msgstr "Alcance de objetos activos a enviar"
+msgstr "Rango de envío en objetos activos"
#: src/settings_translation_file.cpp
msgid ""
@@ -1437,7 +1448,7 @@ msgstr "Siempre volar y rápido"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
-msgstr "Gamma de oclusión de ambiente"
+msgstr "Oclusión ambiental gamma"
#: src/settings_translation_file.cpp
msgid "Amplifies the valleys"
@@ -1463,7 +1474,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr "Escala aproximada (X,Y,Z) en nodos, de los fractales"
+msgstr "Escala aproximada (X,Y,Z) del fractal en nodos."
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
@@ -1474,6 +1485,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "Automáticamente informar a la lista del servidor."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Tecla de Auto Ejecutar"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Tecla retroceso"
@@ -1508,6 +1523,10 @@ msgid "Build inside player"
msgstr "Construir dentro de jugador"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Mapeado de relieve"
@@ -1548,6 +1567,10 @@ msgid "Chat toggle key"
msgstr "Tecla alternativa para el chat"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comandos de Chat"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1638,17 +1661,9 @@ msgid "Colored fog"
msgstr "Niebla colorida"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
-msgstr ""
-"Lista de mods de fiar separada por coma que se permiten acceder a funciones\n"
-"inseguras incluso quando securidad de mods está puesto (vía "
-"request_insecure_environment())."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
"allow them to upload and download data to/from the internet."
msgstr ""
"Lista separada por comas de los mods a los que se les permite usar las\n"
@@ -1657,6 +1672,15 @@ msgstr ""
"la Internet."
#: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
+msgstr ""
+"Lista de mods de fiar separada por coma que se permiten acceder a funciones\n"
+"inseguras incluso quando securidad de mods está puesto (vía "
+"request_insecure_environment())."
+
+#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Tecla comando"
@@ -1812,6 +1836,10 @@ msgid "Default privileges"
msgstr "Privilegios por defecto"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Formato de Reporte por defecto"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1834,6 +1862,11 @@ msgstr ""
"límite)."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Delay in sending blocks after building"
+msgstr "Retraso en enviar bloques después de construir"
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "Demora para mostrar información sobre herramientas, en milisegundos."
@@ -1866,15 +1899,6 @@ msgid "Desynchronize block animation"
msgstr "Desincronizar animación de bloques"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Datos detallados de perfilación de mod. Útil para desarrolladores de mods."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Perfilador detallado de los mods"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1889,6 +1913,23 @@ msgid "Disable anticheat"
msgstr "Desactivar Anticheat"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Desactivar secuencias de escape"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Deshabilita las secuencias de escape, por ejemplo: colorear el chat.\n"
+"Usa esto si tu quieres correr un servidor con clientes pre-0.4.14 y quieres "
+"deshabilitar\n"
+"las secuencias de escape generadas por los mods."
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "No permitir contraseñas vacías"
@@ -1914,6 +1955,11 @@ msgid "Dump the mapgen debug infos."
msgstr "Imprimir información de depuración del generador de mapas."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Enable Joysticks"
+msgstr "Activar Control"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "Activar VBO"
@@ -2004,8 +2050,8 @@ msgid ""
"Enables on the fly normalmap generation (Emboss effect).\n"
"Requires bumpmapping to be enabled."
msgstr ""
-"Habilita la generación de mapas de normales (efecto realzado) en el momento."
-"\n"
+"Habilita la generación de mapas de normales (efecto realzado) en el "
+"momento.\n"
"Requiere habilitar mapeado de relieve."
#: src/settings_translation_file.cpp
@@ -2017,6 +2063,14 @@ msgstr ""
"Requiere habilitar sombreadores."
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Métodos de entidad"
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2030,7 +2084,7 @@ msgstr "FPS (cuadros/s) en el menú de pausa"
#: src/settings_translation_file.cpp
msgid "FSAA"
-msgstr ""
+msgstr "FSAA"
#: src/settings_translation_file.cpp
msgid "Fall bobbing"
@@ -2081,10 +2135,23 @@ msgid "Field of view"
msgstr "Campo visual"
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Campo visual del zoom"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Campo visual en grados."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Movimiento rápido (por medio de tecla de \"Uso\").\n"
+"Requiere privilegio \"fast\" (rápido) en el servidor."
+
+#: src/settings_translation_file.cpp
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
@@ -2221,23 +2288,25 @@ msgstr "Filtro de escala de IGU \"txr2img\""
#: src/settings_translation_file.cpp
msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
#: src/settings_translation_file.cpp
msgid "General"
-msgstr ""
+msgstr "General"
#: src/settings_translation_file.cpp
msgid "Generate normalmaps"
msgstr "Generar mapas normales"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2245,20 +2314,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Graphics"
-msgstr ""
+msgstr "Gráficos"
#: src/settings_translation_file.cpp
msgid "Gravity"
-msgstr ""
+msgstr "Gravedad"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "HTTP Mods"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
-msgstr ""
+msgstr "Tecla de cambio del HUD"
#: src/settings_translation_file.cpp
msgid ""
@@ -2267,26 +2335,43 @@ msgid ""
"- log: mimic and log backtrace of deprecated call (default for debug).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
+"Manejo de las llamadas de la API LUA obsoletas:\n"
+"- legacy: (intenta)imita el antiguo comportamiento (por defecto para "
+"lanzamientos).\n"
+"- log: imita y guarda el seguimiento de las llamadas obsoletas (por defecto "
+"para depuración).\n"
+"- error: Cancela en el uso de llamadas obsoletas (sugerido para los "
+"desarrolladores de Mods)."
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Componente de altura del tamaño inicial de la ventana."
+
+#: src/settings_translation_file.cpp
msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Altura sobre la cual están apareciendo las nubes."
#: src/settings_translation_file.cpp
msgid "High-precision FPU"
-msgstr ""
+msgstr "Alta-precisión FPU"
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
msgstr ""
+"Página de inicio del servidor, que se mostrará en la lista de servidores."
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr ""
+msgstr "Profundidad para los ríos"
#: src/settings_translation_file.cpp
msgid ""
@@ -2297,40 +2382,37 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
+"Cuanto espera el servidor antes de descargar los bloques de mapa no "
+"utilizados.\n"
+"Con valores mayores es mas fluido, pero se utiliza mas RAM."
#: src/settings_translation_file.cpp
msgid "How wide to make rivers"
-msgstr ""
+msgstr "Ancho de los ríos"
#: src/settings_translation_file.cpp
msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 server"
-msgstr ""
+msgstr "servidor IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 support."
-msgstr ""
+msgstr "soporte IPv6."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"If FPS would go higher than this, limit it by sleeping\n"
"to not waste CPU power for no benefit."
msgstr ""
+"Si los FPS llegan a ser mas altos que esto, limítelos con interrupciones\n"
+"no gaste recursos del CPU en algo que no tiene beneficio."
#: src/settings_translation_file.cpp
msgid ""
@@ -2352,14 +2434,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
+"Si esta activiado, las accione son guardadas para un rollback.\n"
+"Esta opciones es de solo lectura cuando el servidor inicia."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "If enabled, disable cheat prevention in multiplayer."
-msgstr ""
+msgstr "Si esta habilitado, desactiva la prevención de trampas en multijugador"
#: src/settings_translation_file.cpp
msgid ""
@@ -2368,8 +2454,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "If enabled, new players cannot join with an empty password."
msgstr ""
+"Si esta activado, los nuevos jugadores no pueden unirse con contraseñas "
+"vacías."
#: src/settings_translation_file.cpp
msgid ""
@@ -2379,24 +2468,60 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Si se activa, los jugadores siempre reaparecerán en la posición dada."
#: src/settings_translation_file.cpp
msgid "Ignore world errors"
-msgstr ""
+msgstr "Ignora los errores del mundo"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "In-Game"
-msgstr "Juego"
+msgstr "Dentro del Juego"
#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
+"Valor alfa del fondo de la consola de chat durante el juego (opacidad, entre "
+"0 y 255)."
#: src/settings_translation_file.cpp
msgid "In-game chat console background color (R,G,B)."
+msgstr "Color del fondo de la consola de chat durante el juego (R, G, B)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2434,6 +2559,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2593,6 +2726,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2628,7 +2768,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2779,6 +2919,22 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Intervalo de modificador de bloques activos"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2811,8 +2967,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2822,8 +2976,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2834,8 +2986,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2845,8 +2995,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3226,6 +3374,15 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Cantidad de bloques que flotan simultáneamente por cliente."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3267,17 +3424,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3289,10 +3450,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Menús"
@@ -3334,10 +3491,6 @@ msgid "Mipmapping"
msgstr "Mapeado de relieve"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3548,11 +3701,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3560,7 +3719,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3595,6 +3754,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Ruta de fuentes"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Tecla derecha"
@@ -3754,7 +3918,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3791,7 +3955,7 @@ msgstr "Iluminación suave"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3872,10 +4036,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3891,6 +4067,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3906,6 +4088,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -4008,10 +4196,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Útil para los desarrolladores de mods."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4116,9 +4300,8 @@ msgid "Waving water"
msgstr "Oleaje en el agua"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving water height"
-msgstr "Oleaje en el agua"
+msgstr "Altura de las ondulaciones del agua"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -4141,7 +4324,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4223,7 +4406,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
-msgstr ""
+msgstr "Y de suelo plano."
#: src/settings_translation_file.cpp
msgid "Y of upper limit of large pseudorandom caves."
@@ -4241,47 +4424,59 @@ msgstr ""
msgid "cURL timeout"
msgstr "Tiempo de espera de cURL"
-#~ msgid "Preload inventory textures"
-#~ msgstr "Precarga de las texturas del inventario"
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr ""
+#~ "Datos detallados de perfilación de mod. Útil para desarrolladores de mods."
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Reiniciar mundo de un jugador"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Perfilador detallado de los mods"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Factor de escala aplicado a los elementos del menú: "
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "Cantidad de bloques que flotan simultáneamente en todo el servidor."
-#~ msgid "Touch free target"
-#~ msgstr "Tocar para interactuar"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Útil para los desarrolladores de mods."
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#~ msgid "No of course not!"
+#~ msgstr "¡No, claro que no!"
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista de servidores públicos"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr ""
-#~ "Reinicia minetest para que los cambios en el controlador tengan efecto"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generar mapas normales"
-#~ msgid "Rendering:"
-#~ msgstr "Renderizado:"
+#~ msgid "No!!!"
+#~ msgstr "¡¡¡No!!!"
+
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Desactivar paquete"
#, fuzzy
#~ msgid "If enabled, "
#~ msgstr "Activado"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Desactivar paquete"
+#~ msgid "Rendering:"
+#~ msgstr "Renderizado:"
-#~ msgid "No!!!"
-#~ msgstr "¡¡¡No!!!"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr ""
+#~ "Reinicia minetest para que los cambios en el controlador tengan efecto"
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generar mapas normales"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista de servidores públicos"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
-#~ msgid "No of course not!"
-#~ msgstr "¡No, claro que no!"
+#~ msgid "Touch free target"
+#~ msgstr "Tocar para interactuar"
+
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Factor de escala aplicado a los elementos del menú: "
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Precarga de las texturas del inventario"
diff --git a/po/et/minetest.po b/po/et/minetest.po
index 15cfe12ae..94c9c7207 100644
--- a/po/et/minetest.po
+++ b/po/et/minetest.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: 2016-04-09 13:53+0000\n"
"Last-Translator: Jan Harald <kuus29@gmail.com>\n"
"Language-Team: Estonian <https://hosted.weblate.org/projects/minetest/"
@@ -616,6 +616,11 @@ msgid "Particles"
msgstr "Luba kõik"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Üksikmäng"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Sätted"
@@ -982,6 +987,10 @@ msgstr "Lülita läbi seinte minek sisse"
msgid "Use"
msgstr "Tegevus"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Suumi"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "Vajuta nuppu"
@@ -1298,10 +1307,6 @@ msgstr "X Nuppp 1"
msgid "X Button 2"
msgstr "X Nupp 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Suumi"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1369,6 +1374,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1444,6 +1453,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "Tagasi"
@@ -1479,6 +1492,10 @@ msgid "Build inside player"
msgstr "Mitmikmäng"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bumpmapping"
msgstr "Väga hea kvaliteet"
@@ -1522,6 +1539,11 @@ msgid "Chat toggle key"
msgstr "Vaheta nuppe"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Käsklus"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1598,14 +1620,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1761,6 +1783,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1777,6 +1803,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1807,14 +1837,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1827,6 +1849,18 @@ msgid "Disable anticheat"
msgstr "Lülita osakesed sisse"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
@@ -1853,6 +1887,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Luba MP"
@@ -1938,6 +1976,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1998,11 +2044,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2138,12 +2194,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2174,6 +2232,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2202,15 +2269,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2305,6 +2363,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2340,6 +2432,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2500,6 +2600,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2535,7 +2642,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2687,6 +2794,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2721,8 +2843,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2732,8 +2852,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2744,8 +2862,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2755,8 +2871,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3137,6 +3251,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3178,17 +3300,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3200,10 +3326,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Menüü"
@@ -3246,10 +3368,6 @@ msgid "Mipmapping"
msgstr "Väga hea kvaliteet"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3454,11 +3572,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3466,7 +3590,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3503,6 +3627,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Report path"
+msgstr "Vali"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Right key"
msgstr "Parem Menüü"
@@ -3666,7 +3795,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3704,7 +3833,7 @@ msgstr "Ilus valgustus"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3785,10 +3914,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3804,6 +3945,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3819,6 +3966,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3923,11 +4076,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Põhiline arendaja"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4055,7 +4203,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4156,55 +4304,70 @@ msgid "cURL timeout"
msgstr ""
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Alla"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Põhiline arendaja"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Vasak hiireklõps: Liiguta kõiki asju, Parem hiireklõps: Liiguta üksikut "
-#~ "asja"
+#~ msgid "Public Serverlist"
+#~ msgstr "Avalikud serverid"
-#~ msgid "is required by:"
-#~ msgstr "Seda vajavad:"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Lülita kõik välja"
-#~ msgid "Configuration saved. "
-#~ msgstr "Konfiguratsioon salvestatud. "
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "Sisse lülitatud"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Hoiatus: Konfiguratsioon pole kindel."
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Mäng"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Maailma loomine ebaõnnestus: Nimes esineb keelatud tähti"
+#~ msgid "GAMES"
+#~ msgstr "MÄNGUD"
-#~ msgid "Show Public"
-#~ msgstr "Näita avalikke"
+#~ msgid "new game"
+#~ msgstr "uus mängu"
-#~ msgid "Show Favorites"
-#~ msgstr "Näita lemmikuid"
+#~ msgid "EDIT GAME"
+#~ msgstr "MUUDA MÄNGU"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Jäta IP lahter tühjaks et alustada LAN serverit."
+#, fuzzy
+#~ msgid "Remove selected mod"
+#~ msgstr "Eemalda valitud muutus"
-#~ msgid "Create world"
-#~ msgstr "Loo maailm"
+#, fuzzy
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Lisama muutus"
-#~ msgid "Address required."
-#~ msgstr "IP on vajalkik."
+#~ msgid "Name"
+#~ msgstr "Nimi"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Maailma kustutamine ebaõnnestus: Maailma pole valitud"
+#~ msgid "Password"
+#~ msgstr "Parool"
-#~ msgid "Files to be deleted"
-#~ msgstr "Failid mida kustutada"
+#~ msgid "SETTINGS"
+#~ msgstr "Seaded"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Maailma loomine ebaõnnestus: Mängu ei leitud"
+#~ msgid "Preload item visuals"
+#~ msgstr "Lae asjade visuaale"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Maailma konfigureerimine ebaõnnestus: Pole midagi valitud"
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Löppev vedelik"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Kõigi maailma failide kustutamine ebaõnnestus"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Hoiatus: Mõned modifikatsioonid pole sätitud veel.\n"
+#~ "Need lülitatakse sisse kohe pärast sätete salvestamist."
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Hoiatus: Mõned konfigureeritud modifikatsioonid on kaotsi läinud.\n"
+#~ "Nende sätted kustutatakse kui salvestada konfiguratsioon."
#~ msgid ""
#~ "Default Controls:\n"
@@ -4231,64 +4394,53 @@ msgstr ""
#~ "- ESC: Menüü\n"
#~ "- T: Jututupa\n"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Hoiatus: Mõned konfigureeritud modifikatsioonid on kaotsi läinud.\n"
-#~ "Nende sätted kustutatakse kui salvestada konfiguratsioon."
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Kõigi maailma failide kustutamine ebaõnnestus"
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Hoiatus: Mõned modifikatsioonid pole sätitud veel.\n"
-#~ "Need lülitatakse sisse kohe pärast sätete salvestamist."
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Maailma konfigureerimine ebaõnnestus: Pole midagi valitud"
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Löppev vedelik"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Maailma loomine ebaõnnestus: Mängu ei leitud"
-#~ msgid "Preload item visuals"
-#~ msgstr "Lae asjade visuaale"
+#~ msgid "Files to be deleted"
+#~ msgstr "Failid mida kustutada"
-#~ msgid "SETTINGS"
-#~ msgstr "Seaded"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Maailma kustutamine ebaõnnestus: Maailma pole valitud"
-#~ msgid "Password"
-#~ msgstr "Parool"
+#~ msgid "Address required."
+#~ msgstr "IP on vajalkik."
-#~ msgid "Name"
-#~ msgstr "Nimi"
+#~ msgid "Create world"
+#~ msgstr "Loo maailm"
-#, fuzzy
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Lisama muutus"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Jäta IP lahter tühjaks et alustada LAN serverit."
-#, fuzzy
-#~ msgid "Remove selected mod"
-#~ msgstr "Eemalda valitud muutus"
+#~ msgid "Show Favorites"
+#~ msgstr "Näita lemmikuid"
-#~ msgid "EDIT GAME"
-#~ msgstr "MUUDA MÄNGU"
+#~ msgid "Show Public"
+#~ msgstr "Näita avalikke"
-#~ msgid "new game"
-#~ msgstr "uus mängu"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Maailma loomine ebaõnnestus: Nimes esineb keelatud tähti"
-#~ msgid "GAMES"
-#~ msgstr "MÄNGUD"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Hoiatus: Konfiguratsioon pole kindel."
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Mäng"
+#~ msgid "Configuration saved. "
+#~ msgstr "Konfiguratsioon salvestatud. "
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "Sisse lülitatud"
+#~ msgid "is required by:"
+#~ msgstr "Seda vajavad:"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Lülita kõik välja"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Vasak hiireklõps: Liiguta kõiki asju, Parem hiireklõps: Liiguta üksikut "
+#~ "asja"
-#~ msgid "Public Serverlist"
-#~ msgstr "Avalikud serverid"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Alla"
diff --git a/po/fr/minetest.po b/po/fr/minetest.po
index 523c73bbf..f3aec72a6 100644
--- a/po/fr/minetest.po
+++ b/po/fr/minetest.po
@@ -7,21 +7,21 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-07 11:19+0000\n"
-"Last-Translator: Yvan YR <yvan_yr@yahoo.fr>\n"
-"Language-Team: French "
-"<https://hosted.weblate.org/projects/minetest/minetest/fr/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-27 10:39+0000\n"
+"Last-Translator: Onyx Steinheim <thevoxelmanonyx@gmail.com>\n"
+"Language-Team: French <https://hosted.weblate.org/projects/minetest/minetest/"
+"fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Une erreur est survenue avec un script Lua, il peut s'agir d'un mod :"
+msgstr "Une erreur est survenue dans un script Lua, il peut s'agir d'un mod :"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -53,7 +53,7 @@ msgstr "La version du protocole ne correspond pas. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr "Le serveur impose une version du protocole $1. "
+msgstr "Le serveur impose la version $1 du protocole. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
@@ -103,7 +103,7 @@ msgid ""
msgstr ""
"Échec du chargement du mod \"$1\" car il contient des caractères non-"
"autorisés.\n"
-"Seulement les caractères alphanumériques [a-z0-9_] sont autorisés."
+"Seuls les caractères alphanumériques [a-z0-9_] sont autorisés."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
@@ -111,7 +111,7 @@ msgstr "Cacher le jeu"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide mp content"
-msgstr "Cacher le pack de mods"
+msgstr "Cacher le contenu du mod"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
@@ -235,7 +235,8 @@ msgstr "Activé"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
msgstr ""
-"Le format est 3 nombres séparés par des virgules et entre les parenthèses."
+"Le format est composé de 3 nombres séparés par des virgules et entre "
+"parenthèses."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid ""
@@ -341,7 +342,7 @@ msgstr "Page $1 de $2"
#: builtin/mainmenu/store.lua
msgid "Rating"
-msgstr "Note"
+msgstr "Évaluation"
#: builtin/mainmenu/store.lua
msgid "Search"
@@ -361,7 +362,7 @@ msgstr "Non-trié"
#: builtin/mainmenu/store.lua
msgid "re-Install"
-msgstr "Ré-installer"
+msgstr "Réinstaller"
#: builtin/mainmenu/tab_credits.lua
msgid "Active Contributors"
@@ -393,7 +394,7 @@ msgstr "Informations du mod :"
#: builtin/mainmenu/tab_mods.lua
msgid "No mod description available"
-msgstr "Pas de description disponible"
+msgstr "Pas de description du mod disponible"
#: builtin/mainmenu/tab_mods.lua
msgid "Rename"
@@ -401,18 +402,17 @@ msgstr "Renommer"
#: builtin/mainmenu/tab_mods.lua
msgid "Select Mod File:"
-msgstr "Sélectionner un fichier de mod :"
+msgstr "Sélectionner le fichier du mod :"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected mod"
-msgstr "Désinstaller le mod"
+msgstr "Désinstaller le mod sélectionné"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected modpack"
-msgstr "Désinstaller le pack de mods"
+msgstr "Désinstaller le pack de mods sélectionné"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
msgstr "Adresse / Port :"
@@ -433,19 +433,16 @@ msgid "Damage enabled"
msgstr "Dégâts activés"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Del. Favorite"
-msgstr "Supprimer favoris :"
+msgstr "Supprimer favori :"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Favorite"
-msgstr "Favoris :"
+msgstr "Favori"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Nom / Mot de passe :"
+msgstr "Nom / Mot de passe"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -538,16 +535,14 @@ msgid "Bilinear Filter"
msgstr "Filtrage bilinéaire"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
-msgstr "Bump mapping"
+msgstr "Placage de relief"
#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
msgstr "Changer les touches"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Connected Glass"
msgstr "Verre unifié"
@@ -576,23 +571,20 @@ msgid "No Mipmap"
msgstr "Sans MIP map"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Highlighting"
msgstr "Surbrillance des blocs"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
-msgstr "Surbrillance des blocs"
+msgstr "Non-surbrillance des blocs"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
msgstr "Aucun"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "Échantillonnage de normalmaps"
+msgstr "Mappage de texture"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -607,11 +599,14 @@ msgid "Parallax Occlusion"
msgstr "Occlusion parallaxe"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
msgstr "Activer les particules"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Réinitialiser le monde"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Réglages"
@@ -633,12 +628,12 @@ msgstr "Textures :"
#: builtin/mainmenu/tab_settings.lua
msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Pour activer les shaders, le pilote OpenGL doit être utilisé."
+msgstr ""
+"Pour activer les textures nuancées, le pilote OpenGL doit être utilisé."
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
msgid "Tone Mapping"
-msgstr "Mip-mapping"
+msgstr "mappage tonal"
#: builtin/mainmenu/tab_settings.lua
msgid "Touchthreshold (px)"
@@ -670,7 +665,7 @@ msgstr "Configurer les mods"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Main"
-msgstr "Menu principal"
+msgstr "Principal"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Start Singleplayer"
@@ -718,7 +713,7 @@ msgstr "Chargement des textures..."
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Reconstruction des shaders..."
+msgstr "Reconstruction des textures nuancées..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -726,7 +721,7 @@ msgstr "Erreur de connexion (perte de connexion ?)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game \""
-msgstr "Le jeu \" n'a pas pu être trouvé"
+msgstr "Impossible de trouver ou charger le jeu"
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
@@ -750,7 +745,8 @@ msgstr "Le chemin du monde spécifié n'existe pas : "
#: src/fontengine.cpp
msgid "needs_fallback_font"
-msgstr "yes"
+msgstr ""
+"needs_fallback_font (besoin ou pas des caractères spéciaux dans une police)"
#: src/game.cpp
msgid ""
@@ -833,7 +829,7 @@ msgstr ""
"Menu / Inventaire visible :\n"
"- double-appui (en dehors) : fermeture\n"
"- objet(s) dans l'inventaire : déplacement\n"
-"- appui, glissement et appui : placement d'un seul item par slot\n"
+"- appui, glissement et appui : pose d'un seul item par emplacement\n"
#: src/game.cpp
msgid "Exit to Menu"
@@ -983,6 +979,10 @@ msgstr "Mode sans collision"
msgid "Use"
msgstr "Utiliser"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoomer"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "appuyez sur une touche"
@@ -1299,10 +1299,6 @@ msgstr "Bouton X 1"
msgid "X Button 2"
msgstr "Bouton X 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoomer"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1311,6 +1307,14 @@ msgid ""
"sets.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"(X,Y,Z) décalage de fractale à partir du centre du monde en unités "
+"\"d'échelle\".\n"
+"Utilisé pour déplacer une zone de frai convenable à proximité des basses "
+"terres (0, 0).\n"
+"La valeur par défaut est adaptée pour les ensembles de Mandelbrot, elle doit "
+"être modifiée pour les ensembles de julia.\n"
+"Portée environ -2 à 2. A multiplier par \"l'échelle\" pour le décalage dans "
+"les nœuds."
#: src/settings_translation_file.cpp
msgid ""
@@ -1376,14 +1380,16 @@ msgid "Acceleration in air"
msgstr "Accélération en l'air"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Management interval"
-msgstr "Portée des mapblocks actifs"
+msgstr "intervalle de gestion des blocs actifs"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Modifier interval"
-msgstr "Portée des mapblocks actifs"
+msgstr "Intervalle du modificateur de bloc actif"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modificateurs de bloc actif"
#: src/settings_translation_file.cpp
msgid "Active block range"
@@ -1401,13 +1407,16 @@ msgid ""
msgstr ""
"Adresse où se connecter.\n"
"Laisser vide pour démarrer un serveur local.\n"
-"Le champ de l'adresse dans le menu peut annuler cette option."
+"Notez que le champ de l'adresse dans le menu principal passe outre ce "
+"réglage."
#: src/settings_translation_file.cpp
msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
-msgstr "Ajuster le DPI de votre écran (non-X11 / Android seulement)."
+msgstr ""
+"Ajuster la résolution de votre écran (non-X11 / Android seulement) ex. pour "
+"les écrans 4k."
#: src/settings_translation_file.cpp
msgid ""
@@ -1422,9 +1431,8 @@ msgid "Advanced"
msgstr "Avancé"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Altitude Chill"
-msgstr "Altitude d'état de froid"
+msgstr "Refroidissement en altitude"
#: src/settings_translation_file.cpp
msgid "Always fly and fast"
@@ -1457,9 +1465,8 @@ msgstr ""
"servers.minetest.net."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr "Série Julia : échelles (X,Y,Z) en blocs."
+msgstr "Série Julia: échelles (X,Y,Z) en blocs."
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
@@ -1471,6 +1478,10 @@ msgstr ""
"Déclarer automatiquement votre serveur à la liste des serveurs publics."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Touche pour courir"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Reculer"
@@ -1483,7 +1494,6 @@ msgid "Basic"
msgstr "Principal"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic Privileges"
msgstr "Privilèges par défaut"
@@ -1504,6 +1514,10 @@ msgid "Build inside player"
msgstr "Placement de bloc à la position du joueur"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Intégré"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bump mapping"
@@ -1525,16 +1539,15 @@ msgstr "Bruit de cave #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
-msgstr "Bruit de cave #2"
+msgstr "Bruit de grotte #2"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cave width"
-msgstr "Largeur de la fenêtre"
+msgstr "Largeur de la grotte"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr "Les caves et tunnels se forment à l'intersection de deux bruits"
+msgstr "Les grottes et tunnels se forment à l'intersection de deux bruits"
#: src/settings_translation_file.cpp
msgid "Chat key"
@@ -1545,6 +1558,10 @@ msgid "Chat toggle key"
msgstr "Afficher le chat"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Commandes de chat"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1566,6 +1583,25 @@ msgid ""
"17 = 4D \"Mandelbulb\" mandelbrot set.\n"
"18 = 4D \"Mandelbulb\" julia set."
msgstr ""
+"Choix de 18 fractales provenant de 9 formules.\n"
+"1 = réglage Mandelbrot \"Roundy\" 4D.\n"
+"2 = réglage Julia \"Roundy\" 4D.\n"
+"3 = réglage Mandelbrot \"Squarry\" 4D.\n"
+"4 = réglage Julia \"Squarry\" 4D.\n"
+"5 = réglage Mandelbrot \"Cousin Mandy\" 4D.\n"
+"6 = réglage Julia \"Cousin Mandy\" 4D.\n"
+"7 = réglage Mandelbrot \"Variation\" 4D.\n"
+"8 = réglage Julia \"Variation\" 4D.\n"
+"9 = réglage Mandelbrot \"Mandelbrot/Mandelbar\" 3D.\n"
+"10 = réglage Julia \"Mandelbrot/Mandelbar\" 3D.\n"
+"11 = réglage Mandelbrot \"Christmas Tree\" 3D.\n"
+"12 = réglage Julia \"Christmas Tree\" 3D.\n"
+"13 = réglage Mandelbrot \"Mandelbulb\" 3D.\n"
+"14 = réglage Julia \"Mandelbulb\" 3D.\n"
+"15 = réglage Mandelbrot \"Cosine Mandelbulb\" 3D.\n"
+"16 = réglage Julia \"Cosine Mandelbulb\" 3D.\n"
+"17 = réglage Mandelbrot \"Mandelbulb\" 4D.\n"
+"18 = réglage Julia \"Mandelbulb\" 4D."
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -1617,6 +1653,16 @@ msgstr "Brume colorée"
#: src/settings_translation_file.cpp
msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Liste des mods de confiance séparés par des virgules qui sont autorisés à "
+"accéder\n"
+"aux API HTTP, leur permettant d'envoyer et de télécharger des données vers/"
+"depuis Internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
@@ -1626,16 +1672,6 @@ msgstr ""
"request_insecure_environment())."
#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Liste séparée par des virgules des mods de confiance qui sont autorisés à "
-"accéder\n"
-"aux API HTTP, leur permettant d'envoyer et de télécharger des données vers/"
-"depuis Internet."
-
-#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Commande"
@@ -1705,6 +1741,8 @@ msgstr "Contrôle l'élévation/hauteur des collines."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
msgstr ""
+"Contrôle la largeur des tunnels, une valeur plus petite crée des tunnels "
+"plus larges."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1791,6 +1829,10 @@ msgid "Default privileges"
msgstr "Privilèges par défaut"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Format de rapport par défaut"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1813,6 +1855,10 @@ msgstr ""
"illimité)."
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Retard dans les blocs envoyés après la construction"
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "Latence d'apparition des infobulles, établie en millisecondes."
@@ -1843,15 +1889,6 @@ msgid "Desynchronize block animation"
msgstr "Désynchroniser les textures animées par mapblock"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Profil détaillé des données du mod. Utile pour les développeurs de mods."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Profil détaillé des mods"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1866,6 +1903,22 @@ msgid "Disable anticheat"
msgstr "Désactiver l'anti-triche"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Désactive les séquences d'échappement"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Désactive les séquences d'échappement. ex : chat coloré.\n"
+"Utilisez cette option si vous voulez exécuter un serveur avec des clients "
+"antérieurs à la 0. 4. 14 et que vous souhaitez désactiver\n"
+"les séquences d'échappement générées par les mods."
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Refuser les mots de passe vides"
@@ -1890,9 +1943,12 @@ msgid "Dump the mapgen debug infos."
msgstr "Afficher les infos de débogage de la génération de terrain."
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Enable Joysticks"
+msgstr "Activer souris"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
-msgstr "Activer le pack de mods"
+msgstr "Activer Vertex Buffer Object: objet tampon de vertex"
#: src/settings_translation_file.cpp
msgid "Enable mod security"
@@ -1974,9 +2030,8 @@ msgid "Enables caching of facedir rotated meshes."
msgstr "Active la mise en cache des meshnodes."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enables filmic tone mapping"
-msgstr "Active la mini-carte."
+msgstr "Autorise le mappage tonal cinématographique"
#: src/settings_translation_file.cpp
msgid "Enables minimap."
@@ -1999,6 +2054,14 @@ msgstr ""
"Nécessite les shaders pour être activé."
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Intervalle d'impression des données du moteur de profil"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Systèmes d'entité"
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2016,7 +2079,7 @@ msgstr "FSAA"
#: src/settings_translation_file.cpp
msgid "Fall bobbing"
-msgstr "Fréquence du mouvement du bras en tombant"
+msgstr "Fréquence de mouvement du bras en tombant"
#: src/settings_translation_file.cpp
msgid "Fallback font"
@@ -2063,11 +2126,23 @@ msgid "Field of view"
msgstr "Champ de vision"
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Champ de vision du zoom"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Champ de vision en degrés."
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Champ de vision en degrés pendant le zoom. \n"
+"Ceci nécessite le privilège \"zoom\" sur le serveur."
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2076,11 +2151,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Filler Depth"
-msgstr ""
+msgstr "Profondeur du remplissage"
#: src/settings_translation_file.cpp
msgid "Filmic tone mapping"
-msgstr "Tone Mapping"
+msgstr "Mappage tonal cinématographique"
#: src/settings_translation_file.cpp
msgid ""
@@ -2146,9 +2221,8 @@ msgid "Font size"
msgstr "Taille de la police"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Format of screenshots."
-msgstr "Chemin où les captures d'écran sont sauvegardées."
+msgstr "Format de captures d'écran."
#: src/settings_translation_file.cpp
msgid "Forward key"
@@ -2217,20 +2291,24 @@ msgid "Generate normalmaps"
msgstr "Normal mapping"
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Global callbacks"
+msgstr "Rappels globaux"
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
+"Attributs de génération de terrain globaux.\n"
+"Dans le générateur de terrain V6, le drapeau 'décorations' contrôle toutes "
+"les décorations sauf les arbres\n"
+"et l'herbe de la jungle, dans tous les autres générateurs de terrain, ce "
+"drapeau contrôle toutes les décorations.\n"
+"La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
"Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
"défaut.\n"
"Les drapeaux commençant par \"non\" sont désactivés."
@@ -2244,9 +2322,8 @@ msgid "Gravity"
msgstr "Gravité"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "HTTP Mods"
-msgstr "Mods"
+msgstr "Mods utilisant le protocole de transfert hypertexte"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -2261,12 +2338,27 @@ msgid ""
msgstr ""
"Traitement des appels d'API Lua obsolètes :\n"
"- legacy : imite l'ancien comportement (par défaut en mode release).\n"
-"- log : imite et registre les appels obsolètes (par défaut en mode debug).\n"
+"- log : imite et enregistre les appels obsolètes (par défaut en mode "
+"debug).\n"
"- error : interruption à l'usage d'un appel obsolète (recommandé pour les "
"développeurs de mods)."
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Auto-instrumentaliser le profileur:\n"
+"* Instrumentalise une fonction vide.\n"
+"La surcharge sera évaluée. (l'auto-instrumentalisation ajoute 1 appel de "
+"fonction à chaque fois).\n"
+"* Instrumentalise l’échantillonneur utilisé pour mettre à jour les "
+"statistiques."
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr "Résolution verticale de la fenêtre de jeu."
@@ -2298,15 +2390,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr "Nombre maximum de mapblocks simultanés envoyés sur le serveur."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "Nombre maximum de mapblocks simultanés envoyés par client."
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2423,6 +2506,49 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Couleur de fond de la console du jeu (R,G,B)."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Instrument d'intégration.\n"
+"Ceci est habituellement nécessaire pour les contributeurs d'intégration au "
+"noyau"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Instrument d'enregistrement des commandes de chat."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Instrument des fonctions de rappel global enregistrées.\n"
+"(tout ce que vous passez dans une fonction minetest.register_*())"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+"Instrumentalise la fonction d'action des modificateurs actifs de bloc lors "
+"de l'enregistrement."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+"Instrumentalise la fonction d'action des modificateurs de blocs chargés lors "
+"de l'enregistrement."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Instrumentalise les systèmes d'entités lors de l'enregistrement."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentalisation"
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Intervalle de sauvegarde des changements importants dans le monde, établie "
@@ -2430,7 +2556,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Interval of sending time of day to clients."
-msgstr "Intervalle d'envoi de l'heure de jeu aux clients."
+msgstr "Intervalle d'envoi de l'heure aux clients."
#: src/settings_translation_file.cpp
msgid "Inventory items animations"
@@ -2438,7 +2564,7 @@ msgstr "Animation des items d'inventaire"
#: src/settings_translation_file.cpp
msgid "Inventory key"
-msgstr "Inventaire"
+msgstr "Touche d'inventaire"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
@@ -2453,13 +2579,20 @@ msgid "Item entity TTL"
msgstr "Durée de vie des items abandonnés"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Iterations of the recursive function.\n"
"Controls the amount of fine detail."
msgstr ""
-"Série Julia : itérations de la fonction récursive.\n"
-"Contrôle l'échelle du détail le plus subtil."
+"Itérations de la fonction récursive.\n"
+"Contrôle la quantité de détails fins."
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Intervalle de répétition du bouton du Joystick"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilité tronconique du joystick"
#: src/settings_translation_file.cpp
msgid ""
@@ -2468,36 +2601,40 @@ msgid ""
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
+"Réglage Julia uniquement: composante W de la constante \"hypercomplex\" "
+"déterminant la forme Julia.\n"
+"N'a aucun effet sur fractales 3D.\n"
+"Portée environ -2 et 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: X component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
-"Série Julia : valeur X déterminant la forme 4D.\n"
-"La portée est environ entre -2 et 2."
+"Série Julia uniquement: composant X de la constante \"hypercomplex\" "
+"déterminant la forme Julia.\n"
+"Portée environ -2 et 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: Y component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
-"Série Julia : valeur Y déterminant la forme 4D.\n"
-"La portée est environ entre -2 et 2."
+"Série Julia uniquement: composante Y de la constante \"hypercomplex\" "
+"determinant la forme Julia.\n"
+"La portée est d'environ -2 à 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: Z component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
-"Série Julia : valeur Z déterminant la forme 4D.\n"
-"La portée est environ entre -2 et 2."
+"Série Julia uniquement: composante Z de la constante \"hypercomplex\" "
+"déterminant la forme Julia.\n"
+"La portée est d'environ -2 à 2."
#: src/settings_translation_file.cpp
msgid "Jump key"
@@ -2508,13 +2645,12 @@ msgid "Jumping speed"
msgstr "Vitesse de saut du joueur"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for decreasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour activer/désactiver la distance de vue illimitée.\n"
+"Touche pour diminuer le champ de vision.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2529,13 +2665,12 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for increasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour activer/désactiver la distance de vue illimitée.\n"
+"Touche pour accroitre le champ de vision.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2605,7 +2740,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour ouvrir la console de jeu.\n"
+"Touche pour ouvrir la console de chat.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2615,7 +2750,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour ouvrir la fenêtre de chat pour entrer des commandes.\n"
+"Touche pour ouvrir la fenêtre du chat pour entrer des commandes.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2657,8 +2792,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour se déplacer lentement.\n"
-"Utilisé pour descendre si aux1_descends est désactivé.\n"
+"Touche pour se faufiler.\n"
+"Egalement utilisée pour descendre et plonger dans l'eau si aux1_descends est "
+"désactivé.\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2684,6 +2820,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Touche d’exécution automatique.\n"
+"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2734,7 +2880,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2759,7 +2905,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Touche pour afficher/cacher le HUD.\n"
+"Touche pour afficher/masquer le HUD ( Affichage tête haute).\n"
"Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2806,7 +2952,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Key use for climbing/descending"
-msgstr "Touche \"utiliser\" pour monter/descendre"
+msgstr "Touche utilisée pour monter/descendre"
#: src/settings_translation_file.cpp
msgid "Language"
@@ -2838,7 +2984,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Left key"
-msgstr "Gauche"
+msgstr "Touche gauche"
#: src/settings_translation_file.cpp
msgid ""
@@ -2848,11 +2994,11 @@ msgstr "Temps d'intervalle entre la mise à jour des objets sur le réseau."
#: src/settings_translation_file.cpp
msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Durée entre les cycles d’exécution ABM"
#: src/settings_translation_file.cpp
msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Durée entre les cycles d’exécution NodeTimer"
#: src/settings_translation_file.cpp
msgid ""
@@ -2906,7 +3052,7 @@ msgstr "Régularité de la fluidité des liquides"
#: src/settings_translation_file.cpp
msgid "Liquid loop max"
-msgstr "Itérations maximum pendant la transformation des liquides"
+msgstr "Itérations maximales pendant la transformation des liquides"
#: src/settings_translation_file.cpp
msgid "Liquid queue purge time"
@@ -2925,23 +3071,41 @@ msgid "Liquid update tick"
msgstr "Intervalle de mise-à-jour des liquides"
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Charger le profil de jeu"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Charge le profil du jeu pour collecter des données de profil du jeu.\n"
+"Fournit une commande /profiler pour accéder au profil compilé.\n"
+"Utile pour les développeurs de mod et les opérateurs de serveurs."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Chargement des modificateurs de blocs"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
-msgstr "Gestionnaire de jeux du menu"
+msgstr "Gestionnaire du menu principal du jeu"
#: src/settings_translation_file.cpp
msgid "Main menu mod manager"
-msgstr "Gestionnaire de mods du menu"
+msgstr "Gestionnaire du menu principal du mod"
#: src/settings_translation_file.cpp
msgid "Main menu script"
-msgstr "Script de menu personnalisé"
+msgstr "Script du menu principal"
#: src/settings_translation_file.cpp
msgid ""
"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
msgstr ""
-"Rendre la couleur de la brume et du ciel différente selon l'heure du jour et "
-"la direction du regard."
+"Rendre la couleur de la brume et du ciel différents selon l'heure du jour "
+"(aube/crépuscule) et la direction du regard."
#: src/settings_translation_file.cpp
msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
@@ -2951,10 +3115,9 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Map directory"
-msgstr "Chemin du monde"
+msgstr "Répertoire de la carte du monde"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen Valleys.\n"
"'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2962,72 +3125,65 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
+"Attributs spécifiques au générateur de terrain: Mapgen Valleys.\n"
+"Le paramètre: 'altitude_chill' provoque un refroidissement à des altitudes "
+"élevées, ce qui cause des problèmes dans les biomes.\n"
+"Le paramètre 'humid_rivers' modifie l'humidité autour des rivières et dans "
+"les zones où l'eau est assez présente,\n"
+"cela peut interférer avec des biomes ajustés délicatement.\n"
+"La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
"Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
"défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Les drapeaux commençant par \"non\" sont utilisés pour désactiver de manière "
+"explicite."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Attributs de terrain spécifiques à Mapgen V7.\n"
-"'ridges' sont les rivières.\n"
-"Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
+"Attributs de terrain spécifiques à Mapgen flat.\n"
+"Des lacs et des collines occasionnels peuvent être ajoutés au monde plat.\n"
+"Les drapeaux qui ne sont spécifiés dans le champ ne sont pas modifiés par "
"défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Les drapeaux commençant par \"non\" sont désactivés explicitement."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
"Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
+"Quand les terrains neigeux sont activés, les jungles sont activées "
+"automatiquement, les drapeaux \"jungles\" sont ignorés.\n"
"Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
"défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Les drapeaux commençant par \"non\" sont désactivés explicitement."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Attributs spécifiques à Mapgen V6.\n"
-"Quand les terrains neigeux sont activés, les jungles sont activés et les "
-"drapeaux jungle est ignoré.\n"
-"Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs par "
-"défaut.\n"
-"Les drapeaux commençant par \"non\" sont désactivés."
+"Attributs de terrain spécifiques au Mapgen V7.\n"
+"Le drapeau 'des crêtes' contrôle les rivières.\n"
+"Les drapeaux qui ne sont pas spécifiés dans la chaîne de drapeau ne sont pas "
+"modifiés par rapport à la valeur par défaut.\n"
+"Les drapeaux commençant par \"non\" sont désactivés explicitement."
#: src/settings_translation_file.cpp
msgid "Map generation limit"
@@ -3046,9 +3202,8 @@ msgid "Mapblock unload timeout"
msgstr "Délais d'interruption du déchargement des mapblocks"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Valleys"
-msgstr "Nom du générateur de carte"
+msgstr "Générateur de carte avec des vallées"
#: src/settings_translation_file.cpp
msgid "Mapgen biome heat noise parameters"
@@ -3071,76 +3226,64 @@ msgid "Mapgen flags"
msgstr "Drapeaux de génération de terrain"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat"
-msgstr "Drapeaux de génération de terrain"
+msgstr "Générateur de terrain plat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Ampleur de grotte du générateur de terrain plat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave1 noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit cave1"
+msgstr "Générateur de terrain plat: paramètres de bruit grotte1"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave2 noise parameters"
-msgstr "Mapgen V5 : paramètre de bruit cave2"
+msgstr "Générateur de terrain plat: paramètres de bruit grotte2"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat filler depth noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit sur la profondeur"
+msgstr "Générateur de terrain plat: paramètres de bruit sur la profondeur"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat flags"
-msgstr "Drapeaux des fractales de la génération de terrain"
+msgstr "Drapeaux du générateur de terrain plat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat ground level"
-msgstr "Drapeaux de génération de terrain"
+msgstr "Niveau du sol du générateur de terrain plat"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill steepness"
-msgstr "Élévation des collines plates"
+msgstr "Élévation des collines dans le générateur de terrain plat"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill threshold"
-msgstr ""
+msgstr "Seuil du générateur de cartes avec de faibles collines"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat lake steepness"
-msgstr "Mapgen Julia : itérations fractales"
+msgstr "Escarpement des lacs du générateur de terrain plat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat lake threshold"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Seuil des lacs du générateur de terrain plat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat large cave depth"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Profondeur des grandes grottes du générateur de terrain plat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat terrain noise parameters"
-msgstr "Mapgen V6 : paramètres de bruit du terrain de base"
+msgstr "Paramètres de bruit du générateur de terrain plat"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal"
-msgstr "Fractales de la génération de terrain"
+msgstr "Fractales du générateur de terrain"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal cave width"
-msgstr "Mapgen Julia : couche fractale W"
+msgstr "Ampleur des grottes du générateur de terrain Julia"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
@@ -3155,14 +3298,12 @@ msgid "Mapgen fractal filler depth noise parameters"
msgstr "Mapgen V5 : paramètres de bruit sur la profondeur"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal fractal"
-msgstr "Drapeaux des fractales de la génération de terrain"
+msgstr "Drapeaux des fractales du générateur de terrain"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal iterations"
-msgstr "Mapgen Julia : itérations fractales"
+msgstr "Itérations du générateur de terrain julia"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia w"
@@ -3181,27 +3322,25 @@ msgid "Mapgen fractal julia z"
msgstr "Mapgen Julia : fractale Z"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal offset"
-msgstr "Mapgen Julia : décalages fractals"
+msgstr "Générateur de terrain Julia: décalages fractals"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal scale"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Générateur de terrain Julia: échelles fractales"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal seabed noise parameters"
-msgstr "Mapgen : paramètres de bruit du fond de l'eau"
+msgstr "Paramètres de bruit du fond marin pour le générateur de terrain julia"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal slice w"
-msgstr "Mapgen Julia : couche fractale W"
+msgstr "Générateur de terrain Julia: couche fractale W"
#: src/settings_translation_file.cpp
msgid "Mapgen heat blend noise parameters"
-msgstr "Mapgen : paramètres de mélange de la température"
+msgstr ""
+"Paramètres de bruit du mélange de température pour le générateur de terrain"
#: src/settings_translation_file.cpp
msgid "Mapgen name"
@@ -3209,40 +3348,41 @@ msgstr "Nom du générateur de carte"
#: src/settings_translation_file.cpp
msgid "Mapgen v5"
-msgstr "Mapgen V5"
+msgstr "Générateur de terrain V5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 cave width"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Ampleur des grottes du générateur de terrain V5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit cave1"
+msgstr "Paramètres du bruit cave1 du générateur de terrain v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave2 noise parameters"
-msgstr "Mapgen V5 : paramètre de bruit cave2"
+msgstr "Paramètres du bruit cave2 du générateur de terrain v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 factor noise parameters"
-msgstr "Mapgen V5 : paramètres de facteur de dispersion"
+msgstr "Paramètres du facteur de dispersion du générateur de terrain v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 filler depth noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit sur la profondeur"
+msgstr ""
+"Paramètres du bruit de la profondeur de remplissage du générateur de terrain "
+"v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 height noise parameters"
-msgstr "Mapgen V5 : paramètres de bruit de la hauteur"
+msgstr "Paramètres du bruit en altitude du générateur de terrain v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v6"
-msgstr "Mapgen V6"
+msgstr "Générateur de terrain V6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 apple trees noise parameters"
-msgstr "Mapgen V6 : paramètres de bruit des pommiers"
+msgstr "Paramètres du bruit des pommiers du générateur de terrain v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach frequency"
@@ -3301,9 +3441,8 @@ msgid "Mapgen v7"
msgstr "Mapgen V7"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 cave width"
-msgstr "Mapgen Julia : échelles fractales"
+msgstr "Ampleur des grottes du générateur de terrain: Mapgen V7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
@@ -3402,6 +3541,14 @@ msgid "Maximum hotbar width"
msgstr "Largeur maximale de la barre d'inventaire"
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Nombre maximal de blocs pouvant être envoyés simultanément."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Nombre maximal de blocs pouvant être envoyés simultanément par client."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr "Nombre maximum de mapblocks qui peuvent être listés pour chargement."
@@ -3448,13 +3595,17 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum number of players that can connect simultaneously."
-msgstr "Nombre maximum de joueurs qui peuvent être connectés en même temps."
+msgstr "Nombre maximal de joueurs qui peuvent être connectés en même temps."
#: src/settings_translation_file.cpp
msgid "Maximum number of statically stored objects in a block."
msgstr "Nombre maximum d'objets sauvegardés dans un mapblock (16^3 blocs)."
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Nombre maximal d'objets par bloc"
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
@@ -3463,17 +3614,17 @@ msgstr ""
"Utile quand il y a quelque chose à afficher à gauche ou à droite de la barre."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Nombre maximum de mapblocks simultanés envoyés par client"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Nombre maximal de blocs simultanés envoyés par client"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Nombre maximum total de mapblocks simultanés envoyés"
+msgid "Maximum simultaneous block sends total"
+msgstr "Nombre maximal de blocs simultanés envoyés"
#: src/settings_translation_file.cpp
msgid "Maximum time in ms a file download (e.g. a mod download) may take."
msgstr ""
-"Délais maximum de téléchargement d'un fichier (ex.: un mod), établi en "
+"Délais maximaux de téléchargement d'un fichier (ex.: un mod), établi en "
"millisecondes."
#: src/settings_translation_file.cpp
@@ -3481,10 +3632,6 @@ msgid "Maximum users"
msgstr "Joueurs maximum"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Nombre maximum d'objets par mapblock"
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Menus"
@@ -3525,10 +3672,6 @@ msgid "Mipmapping"
msgstr "Mip-mapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Profilage des mods"
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr "URL des détails du magasin de mods"
@@ -3624,17 +3767,16 @@ msgstr "Mode sans collision"
#: src/settings_translation_file.cpp
msgid "Node highlighting"
-msgstr "Eclairage des blocs"
+msgstr "Surbrillance des blocs"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "NodeTimer interval"
-msgstr "Intervalle d'envoi du temps"
+msgstr "Intervalle de temps d'un nœud"
#: src/settings_translation_file.cpp
msgid "Noise parameters for biome API temperature, humidity and biome blend."
msgstr ""
-"Paramètres de mélange pour la température, humidité et mélange de biomes."
+"Paramètres de bruit pour la température, l'humidité et le mélange de biomes."
#: src/settings_translation_file.cpp
msgid "Noises"
@@ -3650,7 +3792,7 @@ msgstr "Force des normalmaps"
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
-msgstr "Nombre de threads"
+msgstr "Nombre de tâches en cours"
#: src/settings_translation_file.cpp
msgid ""
@@ -3660,11 +3802,11 @@ msgid ""
"speed greatly\n"
"at the cost of slightly buggy caves."
msgstr ""
-"Nombre de threads à utiliser. Laisser ce champ vide, ou augmenter cette "
-"valeur\n"
-"pour utiliser le multi-threading. Sur des systèmes multi-processeurs, cela "
-"va améliorer grandement\n"
-"la génération de terrain au détriment de quelques caves altérées."
+"Nombre de tâches en cours à utiliser. Laisser ce champ vide, ou augmenter "
+"cette valeur\n"
+"pour utiliser le multi-tâches. Sur des systèmes multi-processeurs, cela va "
+"améliorer grandement\n"
+"la génération de terrain au détriment de quelques altérations de grottes."
#: src/settings_translation_file.cpp
msgid ""
@@ -3684,12 +3826,11 @@ msgstr "Nombre d'itérations sur l'occlusion parallaxe."
#: src/settings_translation_file.cpp
msgid "Overall bias of parallax occlusion effect, usually scale/2."
-msgstr ""
-"Bias général de l'occlusion parallaxe, habituellement échelle divisée par 2."
+msgstr "Bias général de l'occlusion parallaxe, habituellement échelle/2."
#: src/settings_translation_file.cpp
msgid "Overall scale of parallax occlusion effect."
-msgstr "Echelle générale de l'occlusion parallaxe."
+msgstr "Echelle générale de l'effet de l'occlusion parallaxe."
#: src/settings_translation_file.cpp
msgid "Parallax occlusion"
@@ -3759,7 +3900,7 @@ msgid ""
"Note that the port field in the main menu overrides this setting."
msgstr ""
"Port où se connecter (UDP).\n"
-"Le champ de port dans le menu va annuler ce paramètre."
+"Notez que le champ de port dans le menu principal passe outre ce réglage."
#: src/settings_translation_file.cpp
msgid "Prevent mods from doing insecure things like running shell commands."
@@ -3768,23 +3909,31 @@ msgstr ""
"système)."
#: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
msgstr ""
+"Imprime les données de profilage du moteur à intervalles réguliers. 0 = "
+"désactivation.\n"
+"Utile pour les développeurs."
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Privileges that players with basic_privs can grant"
msgstr ""
-"Délais d’intervalle d'affichage du profilage des données. 0 = "
-"désactivation.\n"
-"Utile pour les développeurs."
+"Les privilèges que les joueurs ayant le privilège basic_privs peuvent "
+"accorder"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr "Profileur"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
msgstr "Profilage"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Délais d'intervale du profilage"
+msgid "Profiling"
+msgstr "Profilage"
#: src/settings_translation_file.cpp
msgid ""
@@ -3792,7 +3941,7 @@ msgid ""
"Values larger than 26 will start to produce sharp cutoffs at cloud area "
"corners."
msgstr ""
-"Rayon de l'aire des nuages où se trouve 64 blocs de nuage.\n"
+"Rayon de l'aire des nuages où se trouve 64 blocs carrés de nuages.\n"
"Les valeurs plus grandes que 26 entraînent une \"coupure\" nette des nuages "
"aux coins de l'aire."
@@ -3821,6 +3970,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr "Remplace le menu par défaut par un menu personnalisé."
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Chemin du rapport"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Droite"
@@ -3842,7 +3995,7 @@ msgstr "Taille des rivières"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
-msgstr "Bruit des rivières"
+msgstr "Bruit des rivières -- les rivières se forment près de zéro"
#: src/settings_translation_file.cpp
msgid "Rollback recording"
@@ -3892,14 +4045,12 @@ msgid "Screenshot folder"
msgstr "Dossier des captures d'écran"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Dossier des captures d'écran"
+msgstr "Format des captures d'écran"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Capture d'écran"
+msgstr "Qualité des captures d'écran"
#: src/settings_translation_file.cpp
msgid ""
@@ -3907,6 +4058,9 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"Qualité de capture d'écran. Utilisé uniquement pour le format JPEG.\n"
+"1 signifie mauvaise qualité; 100 signifie la meilleure qualité.\n"
+"Utilisez 0 pour la qualité par défaut."
#: src/settings_translation_file.cpp
msgid "Security"
@@ -3989,22 +4143,22 @@ msgid ""
"Set to true enables waving water.\n"
"Requires shaders to be enabled."
msgstr ""
-"Mettre sur \"true\" active les liquides mouvants.\n"
+"Mettre sur \"true\" active les vagues.\n"
"Nécessite les shaders pour être activé."
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
-"Les shaders permettent des effets visuels avancés et peut améliorer les "
+"Les shaders permettent des effets visuels avancés et peuvent améliorer les "
"performances sur certaines cartes graphiques.\n"
"Fonctionne seulement avec OpenGL."
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr "Forme de la mini-carte. Activé = ronde, désactivé = carré."
+msgstr "Forme de la mini-carte. Activé = ronde, désactivé = carrée."
#: src/settings_translation_file.cpp
msgid "Show debug info"
@@ -4012,7 +4166,7 @@ msgstr "Afficher les infos de débogage"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Afficher les boîtes de sélection de l'entité"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -4027,6 +4181,7 @@ msgstr "Taille des chunks à générer, établie en mapblocks (16^3 blocs)."
#: src/settings_translation_file.cpp
msgid "Slope and fill work together to modify the heights"
msgstr ""
+"La pente et le remplissage fonctionnent ensemble pour modifier les hauteurs"
#: src/settings_translation_file.cpp
msgid "Smooth lighting"
@@ -4034,7 +4189,7 @@ msgstr "Lumière douce"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
"Lisse les mouvement de la caméra en se déplaçant et en regardant autour.\n"
@@ -4068,11 +4223,12 @@ msgstr ""
"$filename doit être accessible depuis $remote_media$filename via cURL "
"(évidemment, remote_media devrait\n"
"se terminer avec un slash).\n"
-"Les fichiers qui ne sont pas présents seront obtenus avec le moyen usuel."
+"Les fichiers qui ne sont pas présents seront récupérés de la manière "
+"habituelle."
#: src/settings_translation_file.cpp
msgid "Static spawnpoint"
-msgstr "Emplacement du spawn"
+msgstr "Emplacement du spawn statique"
#: src/settings_translation_file.cpp
msgid "Strength of generated normalmaps."
@@ -4088,7 +4244,7 @@ msgstr "Vérification stricte du protocole"
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "Fonctionne sur d'anciens serveurs"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
@@ -4104,6 +4260,9 @@ msgid ""
"Controls proportion of world area covered by hills.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Seuil du bruit de relief pour les collines.\n"
+"Contrôle la proportion sur la superficie d'un monde recouvert de collines.\n"
+"Ajuster vers 0. 0 pour une plus grande proportion."
#: src/settings_translation_file.cpp
msgid ""
@@ -4111,6 +4270,9 @@ msgid ""
"Controls proportion of world area covered by lakes.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Seuil du bruit de relief pour les lacs.\n"
+"Contrôle la proportion sur la superficie d'un monde recouvert de lacs.\n"
+"Ajuster vers 0. 0 pour une plus grande proportion."
#: src/settings_translation_file.cpp
msgid "Texture path"
@@ -4121,8 +4283,24 @@ msgid "The altitude at which temperature drops by 20C"
msgstr "L'altitude à laquelle la température descend de 20°C"
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"Le format par défaut dans lequel les profils seront sauvegardés,\n"
+"lorsque la commande `/profiler save [format]` est entrée sans format."
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
+msgstr "La profondeur de la terre ou autre matériau"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
msgstr ""
+"Le chemin d'accès au fichier relatif au monde dans lequel les profils seront "
+"sauvegardés.\n"
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
@@ -4142,6 +4320,14 @@ msgstr "Le pilote vidéo pour Irrlicht."
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"Sensibilité de la souris pour déplacer la \n"
+"vue en jeu autour du tronc."
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4162,9 +4348,17 @@ msgid ""
msgstr ""
"Le temps (en secondes) où la file des liquides peut s'agrandir au-delà de "
"sa\n"
-"capacité de traitement jusqu'à ce qu'une tentative est faite pour réduire sa "
-"taille en vidant\n"
-"l'ancienne file d'items. Une valeur de 0 désactive cette fonctionnalité."
+"capacité de traitement jusqu'à ce qu'une tentative soit faite pour réduire "
+"sa taille en vidant\n"
+"l'ancienne file d'articles. Une valeur de 0 désactive cette fonctionnalité."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"L'intervalle en secondes entre des clics droits répétés lors de l'appui sur "
+"le bouton droit de la souris."
#: src/settings_translation_file.cpp
msgid ""
@@ -4180,15 +4374,15 @@ msgstr "Cette police sera utilisée pour certaines langues."
#: src/settings_translation_file.cpp
msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "Temps entre les cycles de gestion des blocs actifs"
#: src/settings_translation_file.cpp
msgid ""
"Time in seconds for item entity (dropped items) to live.\n"
"Setting it to -1 disables the feature."
msgstr ""
-"Durée de visibilité des objets jetés.\n"
-"Définir ceci à -1 pour désactiver cette fonctionnalité."
+"Durée en secondes pendant laquelle les objets jetés sont présents.\n"
+"Définir à -1 pour désactiver cette fonctionnalité."
#: src/settings_translation_file.cpp
msgid "Time send interval"
@@ -4201,7 +4395,7 @@ msgstr "Vitesse du temps"
#: src/settings_translation_file.cpp
msgid "Timeout for client to remove unused map data from memory."
msgstr ""
-"Temps de délais pour le client pour supprimer les données de la carte de sa "
+"Délai pendant lequel le client supprime les données de la carte de sa "
"mémoire."
#: src/settings_translation_file.cpp
@@ -4211,7 +4405,7 @@ msgid ""
"This determines how long they are slowed down after placing or removing a "
"node."
msgstr ""
-"Pour réduire le lag, le transfert des mapblocks sont ralentis quand un "
+"Pour réduire le lag, les transferts des mapblocks sont ralentis quand un "
"joueur\n"
"est en train de construire quelque chose.\n"
"Cela détermine la durée du ralentissement après placement ou destruction "
@@ -4219,7 +4413,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Toggle camera mode key"
-msgstr "Changer de caméra"
+msgstr "Basculement en mode caméra"
#: src/settings_translation_file.cpp
msgid "Tooltip delay"
@@ -4258,15 +4452,18 @@ msgstr "Purger les données de serveur inutiles"
#: src/settings_translation_file.cpp
msgid "Use 3D cloud look instead of flat."
-msgstr "Activation des nuages 3D au lieu des nuages 2D (plats)."
+msgstr "Activer les nuages 3D au lieu des nuages 2D (plats)."
#: src/settings_translation_file.cpp
msgid "Use a cloud animation for the main menu background."
-msgstr "Mouvement des nuages dans le menu."
+msgstr ""
+"Utiliser une animation de nuages pour l'arrière-plan du menu principal."
#: src/settings_translation_file.cpp
msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr "Utilisation du filtrage anisotrope."
+msgstr ""
+"Utilisation du filtrage anisotrope lors de la visualisation des textures de "
+"biais."
#: src/settings_translation_file.cpp
msgid "Use bilinear filtering when scaling textures."
@@ -4278,17 +4475,14 @@ msgstr "Utiliser"
#: src/settings_translation_file.cpp
msgid "Use mip mapping to scale textures. May slightly increase performance."
-msgstr "Utilisation du mip-mapping. Peut impacter les performances."
+msgstr ""
+"Utilisation du mip-mapping. Peut augmenter légèrement les performances."
#: src/settings_translation_file.cpp
msgid "Use trilinear filtering when scaling textures."
msgstr "Utilisation du filtrage trilinéaire."
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Utile pour les développeurs de mods."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr "Synchronisation verticale"
@@ -4302,7 +4496,7 @@ msgstr "Profondeur des vallées"
#: src/settings_translation_file.cpp
msgid "Valley Fill"
-msgstr ""
+msgstr "Comblement de vallée"
#: src/settings_translation_file.cpp
msgid "Valley Profile"
@@ -4314,7 +4508,7 @@ msgstr "Inclinaison des vallées"
#: src/settings_translation_file.cpp
msgid "Valleys C Flags"
-msgstr ""
+msgstr "Drapeaux de Valleys C"
#: src/settings_translation_file.cpp
msgid "Vertical screen synchronization."
@@ -4345,16 +4539,14 @@ msgid "View range increase key"
msgstr "Augmenter la distance d'affichage"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Viewing range"
-msgstr "Distance de vue maximum"
+msgstr "Plage de visualisation"
#: src/settings_translation_file.cpp
msgid "Volume"
msgstr "Volume du son"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"W co-ordinate of the generated 3D slice of a 4D fractal.\n"
"Determines which 3D slice of the 4D shape is generated.\n"
@@ -4362,6 +4554,8 @@ msgid ""
"Range roughly -2 to 2."
msgstr ""
"Série Julia : coordonnée W de la couche 3D de la forme 4D.\n"
+"Détermine la tranche 3D de la forme 4D qui est générée.\n"
+"N'a aucun effet sur les fractales 3D.\n"
"La portée est environ entre -2 et 2."
#: src/settings_translation_file.cpp
@@ -4369,9 +4563,8 @@ msgid "Walking speed"
msgstr "Vitesse de marche"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Water Features"
-msgstr "Niveau de l'eau"
+msgstr "Caractéristiques de l'eau"
#: src/settings_translation_file.cpp
msgid "Water level"
@@ -4379,7 +4572,7 @@ msgstr "Niveau de l'eau"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
-msgstr "Niveau de la surface de l'eau dans le monde."
+msgstr "Niveau de la surface de l'eau du monde."
#: src/settings_translation_file.cpp
msgid "Waving Nodes"
@@ -4395,11 +4588,11 @@ msgstr "Plantes mouvantes"
#: src/settings_translation_file.cpp
msgid "Waving water"
-msgstr "Liquides mouvants"
+msgstr "Vagues"
#: src/settings_translation_file.cpp
msgid "Waving water height"
-msgstr "Hauteur des liquides mouvants"
+msgstr "Hauteur des vagues"
#: src/settings_translation_file.cpp
msgid "Waving water length"
@@ -4424,13 +4617,13 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
-"Quand gui_scaling_filter_txr2img est activé, cela copie les images depuis\n"
-"votre matériel vers Minetest pour mise à l'échelle. Si désactivé, retour à "
-"la méthode par défaut\n"
-"pour les pilotes vidéo qui ne supportent pas le chargement des textures "
-"depuis le matériel."
+"Quand gui_scaling_filter_txr2img est activé, c'est Minetest qui s'occupe de\n"
+"la mise à l'échelle des images et non votre matériel. Si désactivé,\n"
+"l'ancienne méthode de mise à l'échelle est utilisée, pour les pilotes "
+"vidéos\n"
+"qui ne supportent pas le chargement des textures depuis le matériel."
#: src/settings_translation_file.cpp
msgid ""
@@ -4444,16 +4637,16 @@ msgid ""
msgstr ""
"En utilisant le filtrage bilinéaire / trilinéaire / anisotrope, les textures "
"de basse résolution\n"
-"peuvent être floues en agrandissat automatiquement les textures avec une "
+"peuvent être floues en agrandissant automatiquement les textures avec une "
"interpolation précise\n"
"pour préserver les pixels hasardeux.\n"
"\n"
-"Ceci détermine la taille de la texture minimale pour les textures agrandie. "
+"Ceci détermine la taille de la texture minimale pour les textures agrandies. "
"Les valeurs plus hautes rendent\n"
"les textures plus détaillées, mais nécessitent plus de mémoire.\n"
"Les valeurs en puissance de 2 sont recommandées. Définir une valeur "
"supérieure à 1 peut ne pas\n"
-"avoir un effet visible sauf le filtrage bilinéaire / trilinéaire / "
+"avoir un effet visible sauf si le filtrage bilinéaire / trilinéaire / "
"anisotrope est activé."
#: src/settings_translation_file.cpp
@@ -4502,9 +4695,9 @@ msgid ""
"Whether to ask clients to reconnect after a (Lua) crash.\n"
"Set this to true if your server is set up to restart automatically."
msgstr ""
-"Détermine la possibilité des clients de se re-connecter après une "
-"interruption de serveur.\n"
-"Activé-le si votre serveur est paramétré pour redémarrer automatiquement."
+"Détermine la possibilité des clients à se reconnecter après une extinction "
+"du serveur.\n"
+"Activez-le si votre serveur est paramétré pour redémarrer automatiquement."
#: src/settings_translation_file.cpp
msgid "Whether to fog out the end of the visible area."
@@ -4524,9 +4717,14 @@ msgid ""
"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
"Disabling this option will protect your password better."
msgstr ""
+"Supporte les anciens serveurs antérieurs au protocole version 25.\n"
+"A activer si vous souhaitez vous connecter aux serveurs version 0.4.12 et "
+"antérieure.\n"
+"Les serveurs démarrant en 0.4.13 vont fonctionner, pas ceux en 0.4.12-dev.\n"
+"La désactivation de cette option permettra de mieux protéger votre mot de "
+"passe."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Width component of the initial window size."
msgstr "Résolution verticale de la fenêtre de jeu."
@@ -4544,11 +4742,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
-msgstr ""
+msgstr "Coordonnée Y des terrains plats."
#: src/settings_translation_file.cpp
msgid "Y of upper limit of large pseudorandom caves."
msgstr ""
+"Coordonnée Y de la limite supérieure des grandes grottes pseudo-aléatoires."
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
@@ -4562,237 +4761,150 @@ msgstr "Limite parallèle de cURL"
msgid "cURL timeout"
msgstr "Délais d'interruption de cURL"
-#~ msgid "Item textures..."
-#~ msgstr "Textures d'items..."
-
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Rend la surface de l'eau légèrement plus basse, de façon à ce qu'elle ne "
-#~ "submerge pas\n"
-#~ "entièrement le bloc voisin.\n"
-#~ "Cette fonctionnalité est encore expérimentale et la lumière douce "
-#~ "n’apparaît pas à la\n"
-#~ "surface de l'eau."
-
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
#~ msgstr ""
-#~ "Active l'éclairage des blocs pointés (et supprime les bordures noires de "
-#~ "sélection)."
+#~ "Profil détaillé des données du mod. Utile pour les développeurs de mods."
-#~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Série Julia : décalages (X,Y,Z) à partir du centre du monde.\n"
-#~ "La portée est environ entre -2 et 2. Multiplier par j_scale pour décaler "
-#~ "en nombre de blocs."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Profil détaillé des mods"
#~ msgid ""
-#~ "Julia set: W value determining the 4D shape.\n"
-#~ "Range roughly -2 to 2."
-#~ msgstr ""
-#~ "Série Julia : valeur W déterminant la forme 4D.\n"
-#~ "La portée est environ entre -2 et 2."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "Nombre maximum de mapblocks simultanés envoyés sur le serveur."
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Touche pour réduire la distance de vue. Modifie la distance de vue "
-#~ "minimale.\n"
-#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Nombre maximum de mapblocks simultanés envoyés par client."
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Touche pour augmenter la distance de vue. Modifie la distance de vue "
-#~ "minimale.\n"
-#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Utile pour les développeurs de mods."
-#~ msgid ""
-#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Série Mandelbrot : décalages (X,Y,Z) à partir du centre du monde.\n"
-#~ "La portée est environ entre -2 et 2. Multiplier par m_scale pour décaler "
-#~ "en nombre de blocs."
+#~ msgid "No of course not!"
+#~ msgstr "Non, bien sûr que non !"
-#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
-#~ msgstr "Série Mandelbrot : échelles (X,Y,Z) en blocs."
+#~ msgid "Public Serverlist"
+#~ msgstr "Liste de serveurs publics"
-#~ msgid ""
-#~ "Mandelbrot set: Iterations of the recursive function.\n"
-#~ "Controls scale of finest detail."
-#~ msgstr ""
-#~ "Série Mandelbrot : itérations de la fonction récursive.\n"
-#~ "Contrôle l'échelle du détail le plus subtil."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normal Mapping"
-#~ msgid ""
-#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
-#~ "Range roughly -2 to 2."
-#~ msgstr ""
-#~ "Série Mandelbrot : coordonnée W de la couche 3D de la forme 4D.\n"
-#~ "La portée est environ entre -2 et 2."
+#~ msgid "No!!!"
+#~ msgstr "Non !"
+#, fuzzy
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen fractal.\n"
-#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
#~ msgstr ""
-#~ "Attributs de terrain spécifiques à Mapgen V7.\n"
-#~ "'ridges' sont les rivières.\n"
-#~ "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs "
-#~ "par défaut.\n"
-#~ "Les drapeaux commençant par \"non\" sont désactivés."
-
-#~ msgid "Mapgen fractal mandelbrot iterations"
-#~ msgstr "Mapgen Mandelbrot : itérations fractales"
-
-#~ msgid "Mapgen fractal mandelbrot offset"
-#~ msgstr "Mapgen Mandelbrot : décalages fractals"
-
-#~ msgid "Mapgen fractal mandelbrot scale"
-#~ msgstr "Mapgen Mandelbrot : échelles fractales"
-
-#~ msgid "Mapgen fractal mandelbrot slice w"
-#~ msgstr "Mapgen Mandelbrot : couche fractale W"
+#~ "Attributs généraux de la génération de terrain.\n"
+#~ "Les drapeaux qui ne sont spécifiés dans leur champ respectif gardent "
+#~ "leurs valeurs par défaut."
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Distance maximum au-dessus du niveau de l'eau où le joueur apparaît.\n"
-#~ "Des valeurs plus grandes aboutissent à des locations plus proches de (x = "
-#~ "0, z = 0).\n"
-#~ "Des valeurs plus petites peut résulter à une location de spawn non-"
-#~ "trouvée, résultant\n"
-#~ "à une location située à (0, 0, 0) probablement enterrée sous le sol."
+#~ msgid "\""
+#~ msgstr "\""
-#~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
+#~ msgid "Enable a bit lower water surface, so it doesn't "
#~ msgstr ""
-#~ "Images par seconde (FPS) minimum.\n"
-#~ "Le niveau de rendu est dynamiquement adapté selon ce paramètre et la "
-#~ "distance de vue (minimale et maximale)."
-
-#~ msgid "New style water"
-#~ msgstr "Nouveau style de liquide"
+#~ "Rend l'eau légèrement plus basse, de façon à ce qu'elle ne submerge pas "
+#~ "le bloc complètement.\n"
+#~ "Note : cette fonctionnalité est assez expérimentale et l'éclairage doux "
+#~ "ne fonctionne pas dessus. "
-#~ msgid ""
-#~ "Pre-generate all item visuals used in the inventory.\n"
-#~ "This increases startup time, but runs smoother in-game.\n"
-#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
-#~ "the inventory."
-#~ msgstr ""
-#~ "Pré-générer tous les visuels d'items utilisés dans l'inventaire.\n"
-#~ "Cela augmente le temps de démarrage, mais rend les inventaires plus "
-#~ "fluides.\n"
-#~ "Les textures générées peuvent facilement déborder votre VRAM, causant des "
-#~ "bugs dans votre inventaire."
+#~ msgid "If disabled "
+#~ msgstr "Si désactivé "
-#~ msgid "Preload inventory textures"
-#~ msgstr "Pré-chargement des textures d'inventaire"
+#~ msgid "If enabled, "
+#~ msgstr "Si activé, "
-#~ msgid ""
-#~ "The allowed adjustment range for the automatic rendering range "
-#~ "adjustment.\n"
-#~ "Set this to be equal to viewing range minimum to disable the auto-"
-#~ "adjustment algorithm."
-#~ msgstr ""
-#~ "Distance d'affichage maximum.\n"
-#~ "Définir cette valeur égale à la distance de vue minimum pour désactiver\n"
-#~ "l'auto-ajustement dynamique de la distance d'affichage."
+#~ msgid "Rendering:"
+#~ msgstr "Affichage :"
-#~ msgid "Vertical initial window size."
-#~ msgstr "Largeur initiale de la fenêtre de jeu."
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Redémarrez Minetest pour que le changement du pilote prenne effet"
-#~ msgid "Vertical spawn range"
-#~ msgstr "Portée verticale du spawn"
+#~ msgid "Game Name"
+#~ msgstr "Nom du jeu"
-#~ msgid "Viewing range minimum"
-#~ msgstr "Distance de vue minimum"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr : Impossible de copier le mod \"$1\" dans le jeu \"$2\""
-#~ msgid "Wanted FPS"
-#~ msgstr "FPS minimum"
+#~ msgid "GAMES"
+#~ msgstr "JEUX"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Réinitialiser le monde"
+#~ msgid "Mods:"
+#~ msgstr "Mods :"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Taille appliquée aux menus : "
+#~ msgid "new game"
+#~ msgstr "nouveau jeu"
-#~ msgid "Downloading"
-#~ msgstr "Téléchargement"
+#~ msgid "EDIT GAME"
+#~ msgstr "MODIFIER LE JEU"
-#~ msgid " KB/s"
-#~ msgstr " Ko/s"
+#~ msgid "Remove selected mod"
+#~ msgstr "Supprimer le mod sélectionné"
-#~ msgid " MB/s"
-#~ msgstr " Mo/s"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Ajouter un mod"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Clic gauche : déplacer tous les objets -- Clic droit : déplacer un objet"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
-#~ msgid "is required by:"
-#~ msgstr "est requis par :"
+#~ msgid "START SERVER"
+#~ msgstr "DÉMARRER LE SERVEUR"
-#~ msgid "Configuration saved. "
-#~ msgstr "Configuration enregistrée. "
+#~ msgid "Name"
+#~ msgstr "Nom"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Attention : configuration incorrecte. "
+#~ msgid "Password"
+#~ msgstr "Mot de passe"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr ""
-#~ "Impossible de créer le monde : le nom contient des caractères invalides"
+#~ msgid "SETTINGS"
+#~ msgstr "PARAMÈTRES"
-#~ msgid "Show Public"
-#~ msgstr "Voir les serveurs publics"
+#~ msgid "Preload item visuals"
+#~ msgstr "Précharger les objets"
-#~ msgid "Show Favorites"
-#~ msgstr "Voir les serveurs favoris"
+#~ msgid "Finite Liquid"
+#~ msgstr "Liquides limités"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Laisser l'adresse vide pour lancer un serveur local."
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "PARTIE SOLO"
-#~ msgid "Create world"
-#~ msgstr "Créer un monde"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACKS DE TEXTURES"
-#~ msgid "Address required."
-#~ msgstr "Adresse requise."
+#~ msgid "MODS"
+#~ msgstr "MODS"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Impossible de supprimer le monde : rien n'est sélectionné"
+#~ msgid "Add mod:"
+#~ msgstr "Ajouter un mod :"
-#~ msgid "Files to be deleted"
-#~ msgstr "Fichiers à supprimer"
+#~ msgid "Local install"
+#~ msgstr "Installation locale"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Impossible de créer le monde : aucun jeu n'est présent"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Attention : certains mods ne sont pas encore configurés.\n"
+#~ "Ils seront activés par défaut quand vous enregistrerez la configuration. "
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Impossible de configurer ce monde : aucune sélection active"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Attention : certains mods configurés sont introuvables.\n"
+#~ "Leurs réglages seront effacés quand vous enregistrerez la configuration. "
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Tous les fichiers du monde n'ont pu être supprimés"
+#~ msgid "Delete map"
+#~ msgstr "Supprimer la carte"
#~ msgid ""
#~ "Default Controls:\n"
@@ -4819,108 +4931,142 @@ msgstr "Délais d'interruption de cURL"
#~ "- Échap : ce menu\n"
#~ "- T : discuter\n"
-#~ msgid "Delete map"
-#~ msgstr "Supprimer la carte"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Tous les fichiers du monde n'ont pu être supprimés"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Attention : certains mods configurés sont introuvables.\n"
-#~ "Leurs réglages seront effacés quand vous enregistrerez la configuration. "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Impossible de configurer ce monde : aucune sélection active"
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Attention : certains mods ne sont pas encore configurés.\n"
-#~ "Ils seront activés par défaut quand vous enregistrerez la configuration. "
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Impossible de créer le monde : aucun jeu n'est présent"
-#~ msgid "Local install"
-#~ msgstr "Installation locale"
+#~ msgid "Files to be deleted"
+#~ msgstr "Fichiers à supprimer"
-#~ msgid "Add mod:"
-#~ msgstr "Ajouter un mod :"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Impossible de supprimer le monde : rien n'est sélectionné"
-#~ msgid "MODS"
-#~ msgstr "MODS"
+#~ msgid "Address required."
+#~ msgstr "Adresse requise."
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACKS DE TEXTURES"
+#~ msgid "Create world"
+#~ msgstr "Créer un monde"
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "PARTIE SOLO"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Laisser l'adresse vide pour lancer un serveur local."
-#~ msgid "Finite Liquid"
-#~ msgstr "Liquides limités"
+#~ msgid "Show Favorites"
+#~ msgstr "Voir les serveurs favoris"
-#~ msgid "Preload item visuals"
-#~ msgstr "Précharger les objets"
+#~ msgid "Show Public"
+#~ msgstr "Voir les serveurs publics"
-#~ msgid "SETTINGS"
-#~ msgstr "PARAMÈTRES"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr ""
+#~ "Impossible de créer le monde : le nom contient des caractères invalides"
-#~ msgid "Password"
-#~ msgstr "Mot de passe"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Attention : configuration incorrecte. "
-#~ msgid "Name"
-#~ msgstr "Nom"
+#~ msgid "Configuration saved. "
+#~ msgstr "Configuration enregistrée. "
-#~ msgid "START SERVER"
-#~ msgstr "DÉMARRER LE SERVEUR"
+#~ msgid "is required by:"
+#~ msgstr "est requis par :"
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Clic gauche : déplacer tous les objets -- Clic droit : déplacer un objet"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Ajouter un mod"
+#~ msgid " MB/s"
+#~ msgstr " Mo/s"
-#~ msgid "Remove selected mod"
-#~ msgstr "Supprimer le mod sélectionné"
+#~ msgid " KB/s"
+#~ msgstr " Ko/s"
-#~ msgid "EDIT GAME"
-#~ msgstr "MODIFIER LE JEU"
+#~ msgid "Downloading"
+#~ msgstr "Téléchargement"
-#~ msgid "new game"
-#~ msgstr "nouveau jeu"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Taille appliquée aux menus : "
-#~ msgid "Mods:"
-#~ msgstr "Mods :"
+#~ msgid "Wanted FPS"
+#~ msgstr "FPS minimum"
-#~ msgid "GAMES"
-#~ msgstr "JEUX"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Distance de vue minimum"
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr : Impossible de copier le mod \"$1\" dans le jeu \"$2\""
+#~ msgid "Vertical spawn range"
+#~ msgstr "Portée verticale du spawn"
-#~ msgid "Game Name"
-#~ msgstr "Nom du jeu"
+#~ msgid "Vertical initial window size."
+#~ msgstr "Largeur initiale de la fenêtre de jeu."
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Redémarrez Minetest pour que le changement du pilote prenne effet"
+#~ msgid ""
+#~ "The allowed adjustment range for the automatic rendering range "
+#~ "adjustment.\n"
+#~ "Set this to be equal to viewing range minimum to disable the auto-"
+#~ "adjustment algorithm."
+#~ msgstr ""
+#~ "Distance d'affichage maximum.\n"
+#~ "Définir cette valeur égale à la distance de vue minimum pour désactiver\n"
+#~ "l'auto-ajustement dynamique de la distance d'affichage."
-#~ msgid "Rendering:"
-#~ msgstr "Affichage :"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Pré-chargement des textures d'inventaire"
-#~ msgid "If enabled, "
-#~ msgstr "Si activé, "
+#~ msgid ""
+#~ "Pre-generate all item visuals used in the inventory.\n"
+#~ "This increases startup time, but runs smoother in-game.\n"
+#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
+#~ "the inventory."
+#~ msgstr ""
+#~ "Pré-générer tous les visuels d'items utilisés dans l'inventaire.\n"
+#~ "Cela augmente le temps de démarrage, mais rend les inventaires plus "
+#~ "fluides.\n"
+#~ "Les textures générées peuvent facilement déborder votre VRAM, causant des "
+#~ "bugs dans votre inventaire."
-#~ msgid "If disabled "
-#~ msgstr "Si désactivé "
+#~ msgid "New style water"
+#~ msgstr "Nouveau style de liquide"
-#~ msgid "Enable a bit lower water surface, so it doesn't "
+#~ msgid ""
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
#~ msgstr ""
-#~ "Rend l'eau légèrement plus basse, de façon à ce qu'elle ne submerge pas "
-#~ "le bloc complètement.\n"
-#~ "Note : cette fonctionnalité est assez expérimentale et l'éclairage doux "
-#~ "ne fonctionne pas dessus. "
+#~ "Images par seconde (FPS) minimum.\n"
+#~ "Le niveau de rendu est dynamiquement adapté selon ce paramètre et la "
+#~ "distance de vue (minimale et maximale)."
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Distance maximum au-dessus du niveau de l'eau où le joueur apparaît.\n"
+#~ "Des valeurs plus grandes aboutissent à des locations plus proches de (x = "
+#~ "0, z = 0).\n"
+#~ "Des valeurs plus petites peut résulter à une location de spawn non-"
+#~ "trouvée, résultant\n"
+#~ "à une location située à (0, 0, 0) probablement enterrée sous le sol."
+
+#~ msgid "Mapgen fractal mandelbrot slice w"
+#~ msgstr "Mapgen Mandelbrot : couche fractale W"
+
+#~ msgid "Mapgen fractal mandelbrot scale"
+#~ msgstr "Mapgen Mandelbrot : échelles fractales"
+
+#~ msgid "Mapgen fractal mandelbrot offset"
+#~ msgstr "Mapgen Mandelbrot : décalages fractals"
+
+#~ msgid "Mapgen fractal mandelbrot iterations"
+#~ msgstr "Mapgen Mandelbrot : itérations fractales"
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "Map generation attributes specific to Mapgen fractal.\n"
+#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
#~ "Flags starting with \"no\" are used to explicitly disable them."
@@ -4931,30 +5077,119 @@ msgstr "Délais d'interruption de cURL"
#~ "par défaut.\n"
#~ "Les drapeaux commençant par \"non\" sont désactivés."
-#, fuzzy
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Mandelbrot set: W co-ordinate of the generated 3D slice of the 4D shape.\n"
+#~ "Range roughly -2 to 2."
#~ msgstr ""
-#~ "Attributs généraux de la génération de terrain.\n"
-#~ "Les drapeaux qui ne sont spécifiés dans leur champ respectif gardent "
-#~ "leurs valeurs par défaut."
+#~ "Série Mandelbrot : coordonnée W de la couche 3D de la forme 4D.\n"
+#~ "La portée est environ entre -2 et 2."
-#~ msgid "No!!!"
-#~ msgstr "Non !"
+#~ msgid ""
+#~ "Mandelbrot set: Iterations of the recursive function.\n"
+#~ "Controls scale of finest detail."
+#~ msgstr ""
+#~ "Série Mandelbrot : itérations de la fonction récursive.\n"
+#~ "Contrôle l'échelle du détail le plus subtil."
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normal Mapping"
+#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
+#~ msgstr "Série Mandelbrot : échelles (X,Y,Z) en blocs."
-#~ msgid "Public Serverlist"
-#~ msgstr "Liste de serveurs publics"
+#~ msgid ""
+#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Série Mandelbrot : décalages (X,Y,Z) à partir du centre du monde.\n"
+#~ "La portée est environ entre -2 et 2. Multiplier par m_scale pour décaler "
+#~ "en nombre de blocs."
-#~ msgid "No of course not!"
-#~ msgstr "Non, bien sûr que non !"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Touche pour augmenter la distance de vue. Modifie la distance de vue "
+#~ "minimale.\n"
+#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Touche pour réduire la distance de vue. Modifie la distance de vue "
+#~ "minimale.\n"
+#~ "Voir http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Julia set: W value determining the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Série Julia : valeur W déterminant la forme 4D.\n"
+#~ "La portée est environ entre -2 et 2."
+
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Série Julia : décalages (X,Y,Z) à partir du centre du monde.\n"
+#~ "La portée est environ entre -2 et 2. Multiplier par j_scale pour décaler "
+#~ "en nombre de blocs."
+
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr ""
+#~ "Active l'éclairage des blocs pointés (et supprime les bordures noires de "
+#~ "sélection)."
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Rend la surface de l'eau légèrement plus basse, de façon à ce qu'elle ne "
+#~ "submerge pas\n"
+#~ "entièrement le bloc voisin.\n"
+#~ "Cette fonctionnalité est encore expérimentale et la lumière douce "
+#~ "n’apparaît pas à la\n"
+#~ "surface de l'eau."
+
+#~ msgid "Item textures..."
+#~ msgstr "Textures d'items..."
+
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen v7.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "Attributs spécifiques à Mapgen V7.\n"
+#~ "Le drapeau 'des crêtes' contrôle les rivières.\n"
+#~ "Les drapeaux par défaut définis dans le moteur sont: montagnes, crêtes.\n"
+#~ "La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
+#~ "Les drapeaux qui ne sont spécifiés dans le champ gardent leurs valeurs "
+#~ "par défaut.\n"
+#~ "Les drapeaux commençant par \"non\" sont désactivés."
+
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "Attributs de terrain spécifiques au générateur de carte plate.\n"
+#~ "Lacs et collines peuvent partiellement être ajoutés à un monde plat.\n"
+#~ "Aucun drapeau par défaut défini dans le moteur.\n"
+#~ "La chaîne de drapeaux modifie les paramètres par défaut du moteur.\n"
+#~ "Les drapeaux qui ne sont pas spécifiés dans le champ gardent leurs "
+#~ "valeurs par défaut.\n"
+#~ "Les drapeaux commençant par \"non\" sont désactivés."
diff --git a/po/he/minetest.po b/po/he/minetest.po
index f4229208c..2e5367a9d 100644
--- a/po/he/minetest.po
+++ b/po/he/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-10-26 16:22+0200\n"
-"Last-Translator: ChaosWormz <chaoswormz@openmailbox.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-05-26 21:01+0000\n"
+"Last-Translator: yuval hreman <huckvrni@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/minetest/minetest/"
"he/>\n"
"Language: he\n"
@@ -17,11 +17,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.5-dev\n"
+"X-Generator: Weblate 2.7-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
+msgstr "×ירעה שגי××” בקוד לו××” (Lua), כנר××” ב×חד המודי×:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -41,7 +41,7 @@ msgstr "התחבר מחדש"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr ""
+msgstr "השרת מבקש שתתחבר מחדש:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
@@ -49,27 +49,27 @@ msgstr "טוען..."
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
-msgstr ""
+msgstr "שגי××” בגרס×ות הפרוטוקול. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr ""
+msgstr "השרת יפעיל ×ת פרוטוקול גרסה $1. בכוח "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr ""
+msgstr "השרת תומך ×‘×¤×¨×•×˜×•×§×•×œ×™× ×‘×™×Ÿ גרסה $1 וגרסה $2. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
-msgstr ""
+msgstr "נסה לצ×ת והכנס מחדש לרשימת ×”×©×¨×ª×™× ×•×‘×“×•×§ ×ת חיבור ×”×ינטרנט שלך."
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr ""
+msgstr "×נו ×ª×•×ž×›×™× ×¨×§ בגירסה 1$ של הפרוטוקול."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
-msgstr ""
+msgstr "×נו ×ª×•×ž×›×™× ×‘×’×¨×¡×ות בין 1$ ל-2$ של הפרוטוקול."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -93,13 +93,15 @@ msgstr ""
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
-msgstr "×פשר בכל"
+msgstr "×פשר הכל"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
msgstr ""
+"טעינת המוד \"1$\" נכשלה מכיוון ×©×”×•× ×ž×›×™×œ ×ª×•×•×™× ×œ× ×—×•×§×™×™×. רק ×”×ª×•×•×™× [a-"
+"z0-9_] מותרי×."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
@@ -128,7 +130,7 @@ msgstr "מופעל"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "×¢×•×œ× ×‘×©× \"1$\" כבר קיי×"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
@@ -136,11 +138,11 @@ msgstr "ליצור"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr ""
+msgstr "הורד מפעיל משחק, למשל \"minetest_game\", מה×תר: minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
-msgstr ""
+msgstr "הורד ×חד מ-\"minetest.net\""
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@@ -148,11 +150,11 @@ msgstr "משחק"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
-msgstr ""
+msgstr "מנוע מפות"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No worldname given or no game selected"
-msgstr ""
+msgstr "×œ× × ×‘×—×¨ ×©× ×œ×¢×•×œ× ×ו ש××£ מפעיל משחק ×œ× × ×‘×—×¨"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Seed"
@@ -160,7 +162,7 @@ msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
+msgstr "×זהרה: מצב ×”×ž×¤×ª×—×™× × ×•×¢×“ למפתחי×!."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@@ -168,7 +170,7 @@ msgstr "×©× ×”×¢×•×œ×"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
-msgstr ""
+msgstr "×ין לך ××£ מפעיל משחק מותקן."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
@@ -397,9 +399,8 @@ msgid "Uninstall selected modpack"
msgstr ""
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "כתובת / פורט :"
+msgstr "כתובת / פורט"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -426,9 +427,8 @@ msgid "Favorite"
msgstr ""
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "ש×/סיסמה :"
+msgstr "ש×/סיסמה"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -505,9 +505,8 @@ msgid "8x"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Advanced Settings"
-msgstr "הגדרות"
+msgstr "הגדרות מתקדמות"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
@@ -587,9 +586,13 @@ msgid "Parallax Occlusion"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "×פשר בכל"
+msgstr "חלקיקי×"
+
+#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "שרת"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -940,6 +943,10 @@ msgstr ""
msgid "Use"
msgstr ""
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr ""
@@ -1256,10 +1263,6 @@ msgstr ""
msgid "X Button 2"
msgstr ""
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1326,6 +1329,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1400,6 +1407,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr ""
@@ -1432,6 +1443,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr ""
@@ -1472,6 +1487,10 @@ msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1544,14 +1563,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1698,6 +1717,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1714,6 +1737,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1744,22 +1771,26 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1787,6 +1818,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "×פשר בכל"
@@ -1870,6 +1905,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1930,11 +1973,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2068,12 +2121,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2105,6 +2160,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2133,15 +2197,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2235,6 +2290,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2269,6 +2358,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2428,6 +2525,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2463,7 +2567,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2614,6 +2718,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2646,8 +2765,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2657,8 +2774,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2669,8 +2784,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2680,8 +2793,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3040,6 +3151,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3081,17 +3200,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3103,10 +3226,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr ""
@@ -3147,10 +3266,6 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3355,11 +3470,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3367,7 +3488,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3402,6 +3523,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr ""
@@ -3559,7 +3684,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3596,7 +3721,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3675,10 +3800,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3694,6 +3831,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3709,6 +3852,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3811,10 +3960,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -3940,7 +4085,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4040,8 +4185,8 @@ msgstr ""
msgid "cURL timeout"
msgstr ""
-#~ msgid "Public Serverlist"
-#~ msgstr "רשימת ×©×¨×ª×™× ×¤×•×ž×‘×™"
-
#~ msgid "No of course not!"
#~ msgstr "×œ× ×‘×¨×•×¨ של×!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "רשימת ×©×¨×ª×™× ×¤×•×ž×‘×™"
diff --git a/po/hu/minetest.po b/po/hu/minetest.po
index 776ce693f..a461b6a6b 100644
--- a/po/hu/minetest.po
+++ b/po/hu/minetest.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: 2016-05-07 03:17+0000\n"
"Last-Translator: Kisbenedek Márton <martonkisbenedek@gmail.com>\n"
-"Language-Team: Hungarian "
-"<https://hosted.weblate.org/projects/minetest/minetest/hu/>\n"
+"Language-Team: Hungarian <https://hosted.weblate.org/projects/minetest/"
+"minetest/hu/>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -600,6 +600,10 @@ msgid "Particles"
msgstr "Részecskék"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Egyjátékos világ visszaállítása"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Beállítások"
@@ -976,6 +980,10 @@ msgstr "Váltás noclip-re"
msgid "Use"
msgstr "Használat"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Nagyítás"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "Nyomj meg egy gombot"
@@ -1303,10 +1311,6 @@ msgstr "X gomb 1"
msgid "X Button 2"
msgstr "X Gomb 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Nagyítás"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1386,6 +1390,11 @@ msgid "Active Block Modifier interval"
msgstr "Aktív blokk módosító időköze"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Aktív blokk módosító időköze"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr "Aktív blokk kiterjedési terület"
@@ -1470,6 +1479,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "Automatikus bejelentés a szerverlistára."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Vissza gomb"
@@ -1503,6 +1516,10 @@ msgid "Build inside player"
msgstr "Építés játékos helyére"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bumpmapping"
msgstr "Bumpmapping"
@@ -1544,6 +1561,11 @@ msgid "Chat toggle key"
msgstr "Csevegés váltás gomb"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Parancs"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1615,6 +1637,16 @@ msgid "Colored fog"
msgstr "Színezett köd"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Modok vesszővel elválasztott listája, melyeknek engedélyezett HTTP API-k "
+"elérése, amik\n"
+"lehetővé teszik, hogy feltöltsenek és letöltsenek adatokat a netről/netre."
+
+#: src/settings_translation_file.cpp
msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
@@ -1625,15 +1657,6 @@ msgstr ""
"(request_insecure_environment())."
#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Modok vesszővel elválasztott listája, melyeknek engedélyezett HTTP API-k "
-"elérése, amik\n"
-"lehetővé teszik, hogy feltöltsenek és letöltsenek adatokat a netről/netre."
-
-#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Parancs gomb"
@@ -1791,6 +1814,10 @@ msgid "Default privileges"
msgstr "Alap jogosultságok"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1807,6 +1834,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "Eszköztippek megjelenítésének késleltetése, ezredmásodpercben megadva."
@@ -1839,14 +1870,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Részletes mod profil adat. Mod fejlesztőknek hasznos."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1861,6 +1884,18 @@ msgid "Disable anticheat"
msgstr "Csalás elleni védelem letiltása"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Üres jelszavak tiltása"
@@ -1885,6 +1920,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "VBO engedélyez"
@@ -1981,6 +2020,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2045,10 +2092,24 @@ msgid "Field of view"
msgstr "Látótávolság"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "Látótávolság"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Látóterület fokokban."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Gyors mozgás (a használat gombbal).\n"
+"Szükséges hozzá a \"fast\" (gyorsaság) jogosultság a szerveren."
+
+#: src/settings_translation_file.cpp
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
@@ -2191,16 +2252,26 @@ msgid "Generate normalmaps"
msgstr "Normálfelületek generálása"
#: src/settings_translation_file.cpp
+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.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n"
+"Esetenkénti tavak és dombok generálása a lapos világba.\n"
+"The default flags set in the engine are: none\n"
+"The flags string modifies the engine defaults.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with \"no\" are used to explicitly disable them."
#: src/settings_translation_file.cpp
msgid "Graphics"
@@ -2227,6 +2298,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr "A kezdeti ablak méret magasság összetevője."
@@ -2255,15 +2335,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2380,6 +2451,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Játékon belüli csevegő konzol hátterének színe (R,G,B)."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Fontos változások mentésének időköze a világban, másodpercekben megadva."
@@ -2415,6 +2520,16 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Jobb kattintás ismétlés időköz"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Egér érzékenység"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2623,6 +2738,17 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Gomb a gyors (fast) módra váltáshoz.\n"
+"Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2673,8 +2799,9 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2848,6 +2975,22 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Aktív blokk módosító időköze"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr "Főmenü játék kezelő"
@@ -2884,8 +3027,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2907,8 +3048,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2927,8 +3066,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2943,15 +3080,21 @@ msgstr ""
"Flags starting with \"no\" are used to explicitly disable them."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Térkép generálási jellemzők csak a Flat (lapos) térképgenerátor esetében.\n"
+"Esetenkénti tavak és dombok generálása a lapos világba.\n"
+"The default flags set in the engine are: none\n"
+"The flags string modifies the engine defaults.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with \"no\" are used to explicitly disable them."
#: src/settings_translation_file.cpp
msgid "Map generation limit"
@@ -3306,6 +3449,16 @@ msgid "Maximum hotbar width"
msgstr "Maximum hotbar szélesség"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Az egy időben csatlakozó játékosok maximális száma."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Maximum blokkok száma, amik sorban állhatnak betöltésre."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr "Maximum blokkok száma, amik sorban állhatnak betöltésre."
@@ -3353,6 +3506,11 @@ msgid "Maximum number of statically stored objects in a block."
msgstr "Statikusan tárolt objektumok maximális száma egy térképblokkban."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum objects per block"
+msgstr "Maximum objektum térképblokkonként"
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
@@ -3361,11 +3519,13 @@ msgstr ""
"Hasznos, ha valamit el kell helyezni a hotbar jobb, vagy bal oldalán."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+#, fuzzy
+msgid "Maximum simultaneous block sends per client"
msgstr "Az egyidejűleg a kliensenként küldött térképblokkok maximális száma"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+#, fuzzy
+msgid "Maximum simultaneous block sends total"
msgstr "Egyidejűleg küldött térképblokkok maximális száma összesen"
#: src/settings_translation_file.cpp
@@ -3379,10 +3539,6 @@ msgid "Maximum users"
msgstr "Maximum felhasználók"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Maximum objektum térképblokkonként"
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Menük"
@@ -3424,10 +3580,6 @@ msgid "Mipmapping"
msgstr "Mip-mapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr "Mod áruház részletek URL"
@@ -3649,11 +3801,17 @@ msgstr ""
"shell parancsok."
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr "Jogosultságok, amiket a basic_privs adhat a játékosoknak"
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3661,7 +3819,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3696,6 +3854,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr "Az alapértelmezett főmenüt lecseréli egy másikkal."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Betűtípus helye"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Jobb gomb"
@@ -3869,8 +4032,9 @@ msgstr ""
"A shaderek engedélyezése szükséges hozzá."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3913,8 +4077,9 @@ msgid "Smooth lighting"
msgstr "Simított megvilágítás"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
"Kamera mozgásának simítása mozgáskor és körbenézéskor.\n"
@@ -3996,10 +4161,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr "A magasság, ahol a hőmérséklet 20 fokkal csökken"
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -4018,6 +4195,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4032,6 +4215,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Ennyi másodperc szükséges az ismételt jobb kattintáshoz a jobb egérgomb "
+"nyomva tartásakor."
+
+#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
@@ -4148,10 +4340,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Trilineáris szűrés a textúrák méretezéséhez."
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Mod fejlesztőknek hasznos."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4279,7 +4467,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4392,204 +4580,207 @@ msgstr ""
msgid "cURL timeout"
msgstr ""
-#~ msgid "Item textures..."
-#~ msgstr "Elem textúrák..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Részletes mod profil adat. Mod fejlesztőknek hasznos."
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Kicsivel alacsonyabb víz felszín engedélyezése, hogy ne töltse meg "
-#~ "teljesen a blokkot.\n"
-#~ "Megjegyzés: ez nem teljesen optimalizált, és a simított megvilágítás\n"
-#~ "így nem működik a víz felszínén."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Mod fejlesztőknek hasznos."
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr ""
-#~ "Kijelölés kiemelés (kivilágítás) engedélyezése a blokkoknál (letiltja a "
-#~ "kijelölődobozt)."
+#~ msgid "No of course not!"
+#~ msgstr "Persze, hogy nem!"
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "A látóterület csökkentésének gombja. A minimum látóterületet módosítja.\n"
-#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Public Serverlist"
+#~ msgstr "Nyilvános szerverlista"
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "A látóterület növelésének gombja. A minimum látótávolságot módosítja.\n"
-#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normálfelületek generálása"
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Maximum távolság a vízszinttől, ahol a játékosok újraéledhetnek/"
-#~ "megjelenhetnek csatlakozáskor (spawn).\n"
-#~ "Magasabb értékek közelebb visznek az (x = 0, z = 0)-hoz.\n"
-#~ "Alacsonyabb értékek azt eredményezhetik, hogy nem lesz megfelelő pont a "
-#~ "feléledéshez,\n"
-#~ "(0,0,0) pozícióban történő feléledést, ami valószínűleg a föld alatt lesz."
+#~ msgid "No!!!"
+#~ msgstr "Nem!!!"
#, fuzzy
#~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
#~ msgstr ""
-#~ "Minimum kívánt FPS.\n"
-#~ "A renderelt cuccok mennyisége dinamikusan ez alapján állítódik be (és a "
-#~ "látórerület min és max)."
-
-#~ msgid "New style water"
-#~ msgstr "Új stílusú víz"
-
-#~ msgid "Preload inventory textures"
-#~ msgstr "Eszköztár textúráinak előtöltése"
-
-#~ msgid "Vertical initial window size."
-#~ msgstr "Függőleges kezdeti ablak méret."
-
-#~ msgid "Vertical spawn range"
-#~ msgstr "Az (újra)éledés függőleges irányú területe"
+#~ "Térkép generálási jellemzők csak a Valleys térképgenerátor esetében.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
-#~ msgid "Viewing range minimum"
-#~ msgstr "Minimum látóterület"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Csomag letiltás"
-#~ msgid "Wanted FPS"
-#~ msgstr "Kívánt FPS"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "Engedélyez"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Egyjátékos világ visszaállítása"
+#~ msgid "Rendering:"
+#~ msgstr "Renderelés:"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "A méretarány alkalmazva a menü elemekre: "
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "A driver változások életbe lépéséhez indítsd újra a Minetestet"
#, fuzzy
-#~ msgid "Touch free target"
-#~ msgstr "Touch free target"
+#~ msgid "Game Name"
+#~ msgstr "Játék"
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Le"
+#~ msgid "Password"
+#~ msgstr "Régi jelszó"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Ball gomb: Tárgyak mozgatása, Jobb gomb: egy tárgyat mozgat"
+#~ msgid "Preload item visuals"
+#~ msgstr "Előretöltött tárgy láthatóság"
-#~ msgid "is required by:"
-#~ msgstr "kell neki:"
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Végtelen folyadék"
-#~ msgid "Configuration saved. "
-#~ msgstr "Beállítások mentve. "
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Hiba az összes világ törlése közben"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Figyelem: A beállítások nem egyformák. "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Nem sikerült a világ beállítása: Nincs kiválasztva"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Nem sikerült a világ létrehozása: A névben nem jó karakterek vannak"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Nem sikerült a világot létrehozni: Nem található a játék"
-#~ msgid "Show Public"
-#~ msgstr "Publikus mutatása"
+#~ msgid "Files to be deleted"
+#~ msgstr "A fájl törölve lett"
-#~ msgid "Show Favorites"
-#~ msgstr "Kedvencek mutatása"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Nem törölhető a világ: Nincs kiválasztva"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Hagyd el a nevét, hogy helyi szervert indíts."
+#~ msgid "Address required."
+#~ msgstr "Cím szükséges."
#~ msgid "Create world"
#~ msgstr "Világ létrehozása"
-#~ msgid "Address required."
-#~ msgstr "Cím szükséges."
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Hagyd el a nevét, hogy helyi szervert indíts."
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Nem törölhető a világ: Nincs kiválasztva"
+#~ msgid "Show Favorites"
+#~ msgstr "Kedvencek mutatása"
-#~ msgid "Files to be deleted"
-#~ msgstr "A fájl törölve lett"
+#~ msgid "Show Public"
+#~ msgstr "Publikus mutatása"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Nem sikerült a világot létrehozni: Nem található a játék"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Nem sikerült a világ létrehozása: A névben nem jó karakterek vannak"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Nem sikerült a világ beállítása: Nincs kiválasztva"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Figyelem: A beállítások nem egyformák. "
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Hiba az összes világ törlése közben"
+#~ msgid "Configuration saved. "
+#~ msgstr "Beállítások mentve. "
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Végtelen folyadék"
+#~ msgid "is required by:"
+#~ msgstr "kell neki:"
-#~ msgid "Preload item visuals"
-#~ msgstr "Előretöltött tárgy láthatóság"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Ball gomb: Tárgyak mozgatása, Jobb gomb: egy tárgyat mozgat"
#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Régi jelszó"
+#~ msgid "Downloading"
+#~ msgstr "Le"
#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Játék"
+#~ msgid "Touch free target"
+#~ msgstr "Touch free target"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "A driver változások életbe lépéséhez indítsd újra a Minetestet"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "A méretarány alkalmazva a menü elemekre: "
-#~ msgid "Rendering:"
-#~ msgstr "Renderelés:"
+#~ msgid "Wanted FPS"
+#~ msgstr "Kívánt FPS"
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "Engedélyez"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Minimum látóterület"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Csomag letiltás"
+#~ msgid "Vertical spawn range"
+#~ msgstr "Az (újra)éledés függőleges irányú területe"
+
+#~ msgid "Vertical initial window size."
+#~ msgstr "Függőleges kezdeti ablak méret."
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Eszköztár textúráinak előtöltése"
+
+#~ msgid "New style water"
+#~ msgstr "Új stílusú víz"
#, fuzzy
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
#~ msgstr ""
-#~ "Térkép generálási jellemzők csak a Valleys térképgenerátor esetében.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Minimum kívánt FPS.\n"
+#~ "A renderelt cuccok mennyisége dinamikusan ez alapján állítódik be (és a "
+#~ "látórerület min és max)."
-#~ msgid "No!!!"
-#~ msgstr "Nem!!!"
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Maximum távolság a vízszinttől, ahol a játékosok újraéledhetnek/"
+#~ "megjelenhetnek csatlakozáskor (spawn).\n"
+#~ "Magasabb értékek közelebb visznek az (x = 0, z = 0)-hoz.\n"
+#~ "Alacsonyabb értékek azt eredményezhetik, hogy nem lesz megfelelő pont a "
+#~ "feléledéshez,\n"
+#~ "(0,0,0) pozícióban történő feléledést, ami valószínűleg a föld alatt lesz."
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normálfelületek generálása"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "A látóterület növelésének gombja. A minimum látótávolságot módosítja.\n"
+#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "Public Serverlist"
-#~ msgstr "Nyilvános szerverlista"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "A látóterület csökkentésének gombja. A minimum látóterületet módosítja.\n"
+#~ "Lásd: http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "No of course not!"
-#~ msgstr "Persze, hogy nem!"
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr ""
+#~ "Kijelölés kiemelés (kivilágítás) engedélyezése a blokkoknál (letiltja a "
+#~ "kijelölődobozt)."
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Kicsivel alacsonyabb víz felszín engedélyezése, hogy ne töltse meg "
+#~ "teljesen a blokkot.\n"
+#~ "Megjegyzés: ez nem teljesen optimalizált, és a simított megvilágítás\n"
+#~ "így nem működik a víz felszínén."
+
+#~ msgid "Item textures..."
+#~ msgstr "Elem textúrák..."
diff --git a/po/id/minetest.po b/po/id/minetest.po
index 3505fca58..137caaff8 100644
--- a/po/id/minetest.po
+++ b/po/id/minetest.po
@@ -6,10 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-12 19:07+0000\n"
-"Last-Translator: Muhammad Rifqi Priyo Susanto "
-"<muhammadrifqipriyosusanto@gmail.com>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-10 10:03+0000\n"
+"Last-Translator: Alvin Hikmawan <alvin.hikmawan@gmail.com>\n"
"Language-Team: Indonesian <https://hosted.weblate.org/projects/minetest/"
"minetest/id/>\n"
"Language: id\n"
@@ -17,11 +16,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Sebuah kesalahan terjadi di sebuah skrip Lua, seperti sebuah mod:"
+msgstr "Sebuah kesalahan terjadi di salah satu skrip Lua, misalnya sebuah mod:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -53,7 +52,7 @@ msgstr "Versi protokol tidak cocok. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr "Server memberlakukan protokol versi $1. "
+msgstr "Server menjalankan protokol versi $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
@@ -143,7 +142,7 @@ msgstr "Buat"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Unduh sebuah sub-permainan, seperti minetest_game, dari minetest.net"
+msgstr "Unduh sebuah sub-permainan, misalnya minetest_game, dari minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
@@ -241,7 +240,6 @@ msgstr ""
"Format adalah 3 angka yang dipisahkan oleh koma dan di dalam tanda kurung."
#: builtin/mainmenu/dlg_settings_advanced.lua
-#, fuzzy
msgid ""
"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
@@ -261,7 +259,7 @@ msgstr "Mod"
#, fuzzy
msgid "Optionally the lacunarity can be appended with a leading comma."
msgstr ""
-"lacunarity (celah, opsional) dapat ditambahkan dengan awalan tanda koma."
+"Lacunarity (celah, opsional) dapat ditambahkan dengan awalan tanda koma."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a comma seperated list of flags."
@@ -414,9 +412,8 @@ msgid "Uninstall selected modpack"
msgstr "Copot pemasangan paket mod terpilih"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "Alamat / Port :"
+msgstr "Alamat / Port"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -436,16 +433,15 @@ msgstr "Kerusakan diaktifkan"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Del. Favorite"
-msgstr ""
+msgstr "Hapus Favorit"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Favorite"
-msgstr ""
+msgstr "Favorit"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Nama / Kata sandi :"
+msgstr "Nama / Kata sandi"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -526,7 +522,6 @@ msgid "Advanced Settings"
msgstr "Pengaturan Lanjutan"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Antialiasing:"
msgstr "Antialiasing:"
@@ -535,14 +530,12 @@ msgid "Are you sure to reset your singleplayer world?"
msgstr "Apakah Anda yakin ingin mengatur ulang dunia Anda?"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bilinear Filter"
msgstr "Bilinear Filter"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
-msgstr "Bumpmapping"
+msgstr "Bump Mapping"
#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
@@ -557,12 +550,10 @@ msgid "Fancy Leaves"
msgstr "Daun Megah"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Mipmap"
msgstr "Mipmap"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Mipmap + Aniso. Filter"
msgstr "Mipmap + Aniso. Filter"
@@ -586,7 +577,7 @@ msgstr "Node Highlighting"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Node Outlining"
-msgstr "Node Highlighting"
+msgstr "Node Outlining"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
@@ -595,7 +586,7 @@ msgstr "Tidak ada"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Normal Mapping"
-msgstr "Tone Mapping"
+msgstr "Normal Mapping"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -606,14 +597,16 @@ msgid "Opaque Water"
msgstr "Air Buram"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
msgid "Parallax Occlusion"
msgstr "Parallax Occlusion"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "Aktifkan Partikel"
+msgstr "Partikel"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Atur ulang dunia pemain tunggal"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -637,7 +630,7 @@ msgstr "Penteksturan:"
#: builtin/mainmenu/tab_settings.lua
msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Untuk mengaktifkan shaders OpenGL driver harus digunakan."
+msgstr "Untuk mengaktifkan shader, driver OpenGL harus digunakan."
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
@@ -648,7 +641,6 @@ msgid "Touchthreshold (px)"
msgstr "Batas sentuhan (px)"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Trilinear Filter"
msgstr "Trilinear Filter"
@@ -722,7 +714,7 @@ msgstr "Memuat tekstur..."
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Membangun ulang shaders..."
+msgstr "Membangun ulang shader..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -805,7 +797,7 @@ msgstr ""
"Kontrol Bawaan:\n"
"- WASD: bergerak\n"
"- Space: lompat/panjat\n"
-"- Shift: merayap/turun\n"
+"- Shift: menyelinap/turun\n"
"- Q: jatuhkan barang\n"
"- I: inventaris\n"
"- Mouse: belok/melihat\n"
@@ -924,9 +916,7 @@ msgstr "Konsol"
#: src/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
-msgstr ""
-"Tekan ganda \"lompat\" untuk\n"
-"beralih terbang"
+msgstr "Tekan ganda \"lompat\" untuk terbang"
#: src/guiKeyChangeMenu.cpp
msgid "Drop"
@@ -976,7 +966,7 @@ msgstr "Menyelinap"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle Cinematic"
-msgstr "Toggle Sinematik"
+msgstr "Mode sinema"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle fast"
@@ -988,12 +978,16 @@ msgstr "Terbang"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle noclip"
-msgstr "Beralih tembus blok"
+msgstr "Tembus blok"
#: src/guiKeyChangeMenu.cpp
msgid "Use"
msgstr "Pakai"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "tekan tombol"
@@ -1310,10 +1304,6 @@ msgstr "Tombol X 1"
msgid "X Button 2"
msgstr "Tombol X 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1322,6 +1312,11 @@ msgid ""
"sets.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"Pergeseran (X,Y,Z) fraktal dari tengah dunia dalam satuan 'scale'.\n"
+"Digunakan untuk memindahkan daerah bangkit dataran rendah mendekati (0, 0).\n"
+"Nilai bawaan cocok untuk mandelbrot sets, butuh diganti untuk julia sets.\n"
+"Berjangkauan sekitar -2 ke 2. Kalikan dengan 'scale' untuk pergeseran dalam "
+"node."
#: src/settings_translation_file.cpp
msgid ""
@@ -1356,7 +1351,7 @@ msgstr ""
"- anaglyph: 3d berwarna cyan/magenta.\n"
"- interlaced: garis ganjil/genap berdasarkan polarisasi dukungan layar.\n"
"- topbottom: pisahkan layar atas/bawah.\n"
-"- sidebyside: pisahkan layar berdampingan."
+"- sidebyside: pisahkan layar kiri/kanan."
#: src/settings_translation_file.cpp
msgid ""
@@ -1385,18 +1380,20 @@ msgid "Acceleration in air"
msgstr "Percepatan di udara"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Management interval"
-msgstr "Batas blok aktif"
+msgstr "Jarak Pengelola Blok Aktif"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Modifier interval"
-msgstr "Batas blok aktif"
+msgstr "Jarak Pengubah Blok Aktif"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Pengubah Blok Aktif"
#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr "Batas blok aktif"
+msgstr "Jangkauan blok aktif"
#: src/settings_translation_file.cpp
msgid "Active object send range"
@@ -1408,7 +1405,7 @@ msgid ""
"Leave this blank to start a local server.\n"
"Note that the address field in the main menu overrides this setting."
msgstr ""
-"Alamat untuk menghubungkan.\n"
+"Alamat tujuan.\n"
"Biarkan kosong untuk memulai sebuah server lokal.\n"
"Perhatikan bahwa bidang alamat dalam menu utama menimpa pengaturan ini."
@@ -1447,9 +1444,8 @@ msgid "Ambient occlusion gamma"
msgstr "Ambient occlusion gamma"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Amplifies the valleys"
-msgstr "Menguatkan lembah"
+msgstr "Memperbesar lembah"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -1472,7 +1468,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr "Memperkirakan skala (X,Y,Z) dari fraktal pada node."
+msgstr "Memperkirakan skala (X,Y,Z) fraktal pada node."
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
@@ -1483,26 +1479,26 @@ msgid "Automaticaly report to the serverlist."
msgstr "Secara otomatis melaporkan ke daftar server."
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
-msgstr "Mundur"
+msgstr "Tombol mundur"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Base terrain height"
-msgstr "Air Berombak"
+msgstr "Tinggi dasar medan"
#: src/settings_translation_file.cpp
msgid "Basic"
msgstr "Dasar"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic Privileges"
-msgstr "Izin bawaan"
+msgstr "Izin Dasar"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bilinear filtering"
msgstr "Bilinear filtering"
@@ -1519,7 +1515,10 @@ msgid "Build inside player"
msgstr "Bangun di dalam pemain"
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Builtin"
+msgstr "Terpasang bawaan"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bumpmapping"
@@ -1545,7 +1544,7 @@ msgstr "Noise #2 gua"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Lebar gua"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1560,6 +1559,10 @@ msgid "Chat toggle key"
msgstr "Tombol beralih obrolan"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Perintah obrolan"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1651,6 +1654,15 @@ msgstr "Kabut berwarna"
#: src/settings_translation_file.cpp
msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Daftar yang dipisahkan koma dari mod yang dibolehkan untuk mengakses\n"
+"HTTP API, membolehkan mereka untuk mengunggah dan mengunduh data\n"
+"ke/dari internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
@@ -1659,15 +1671,6 @@ msgstr ""
"(melalui request_insecure_environment())."
#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Daftar yang dipisahkan koma dari mod yang dibolehkan untuk mengakses\n"
-"HTTP API, membolehkan mereka untuk mengunggah dan mengunduh data\n"
-"ke/dari internet."
-
-#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Tombol perintah"
@@ -1677,7 +1680,7 @@ msgstr "Sambungkan kaca"
#: src/settings_translation_file.cpp
msgid "Connect to external media server"
-msgstr "Menyambungkan ke server media eksternal"
+msgstr "Sambungkan ke server media eksternal"
#: src/settings_translation_file.cpp
msgid "Connects glass if supported by node."
@@ -1685,7 +1688,7 @@ msgstr "Sambungkan kaca jika didukung oleh node."
#: src/settings_translation_file.cpp
msgid "Console alpha"
-msgstr "Alpha konsol"
+msgstr "Keburaman konsol"
#: src/settings_translation_file.cpp
msgid "Console color"
@@ -1723,19 +1726,19 @@ msgid ""
"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
msgstr ""
"Mengatur ukuran padang gurun dan pantai dalam Mapgen v6.\n"
-"Jika snowbiomes di aktifkan 'mgv6_freq_desert' akan dihiraukan."
+"Jika snowbiomes di aktifkan 'mgv6_freq_desert' akan diabaikan."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
-msgstr "Mengatur kecuraman/kedalaman dari lekukan danau."
+msgstr "Mengatur kecuraman/kedalaman lekukan danau."
#: src/settings_translation_file.cpp
msgid "Controls steepness/height of hills."
-msgstr "Mengatur kecuraman/ketinggian dari bukit."
+msgstr "Mengatur kecuraman/ketinggian bukit."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Mengatur lebar terowongan, nilai lebih kecil terowongan semakin lebar."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1747,7 +1750,7 @@ msgid ""
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
"Membuat lava yang tidak dapat diprediksi di dalam gua.\n"
-"Ini dapat menyebabkan menambang menjadi sulit. Nol menonaktifkannya. (0-10)"
+"Ini dapat menyebabkan penambangan menjadi sulit. Nol menonaktifkannya. (0-10)"
#: src/settings_translation_file.cpp
msgid ""
@@ -1755,7 +1758,7 @@ msgid ""
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
"Membuat air yang tidak dapat diprediksi di dalam gua.\n"
-"Ini dapat menyebabkan menambang menjadi sulit. Nol menonaktifkannya. (0-10)"
+"Ini dapat menyebabkan penambangan menjadi sulit. Nol menonaktifkannya. (0-10)"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
@@ -1771,11 +1774,11 @@ msgstr "Warna crosshair"
#: src/settings_translation_file.cpp
msgid "Crosshair color (R,G,B)."
-msgstr "Warna crosshair (merah,hijau,biru atau R,G,B)."
+msgstr "Warna crosshair: (merah,hijau,biru) atau (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Crouch speed"
-msgstr ""
+msgstr "Kecepatan jalan merunduk"
#: src/settings_translation_file.cpp
msgid "DPI"
@@ -1787,7 +1790,7 @@ msgstr "Kerusakan"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
-msgstr "Tombol beralih info debug"
+msgstr "Tombol info debug"
#: src/settings_translation_file.cpp
msgid "Debug log level"
@@ -1822,6 +1825,10 @@ msgid "Default privileges"
msgstr "Izin bawaan"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Format laporan bawaan"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1834,14 +1841,22 @@ msgid ""
"Defines sampling step of texture.\n"
"A higher value results in smoother normal maps."
msgstr ""
+"Menentukan tahap sampling atas tekstur\n"
+"Nilai yg lebih tinggi menghasilkan peta yg lebih halus"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
+"Menentukan jarak maksimal perpindahan pemain dalam blok (0 = tak terhingga)"
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Jeda dalam mengirim blok setelah membangun"
#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
-msgstr ""
+msgstr "Jeda menampilkan tooltip, dalam milidetik."
#: src/settings_translation_file.cpp
msgid "Deprecated Lua API handling"
@@ -1864,20 +1879,12 @@ msgid ""
"Description of server, to be displayed when players join and in the "
"serverlist."
msgstr ""
-"Deskripsi dari server yang akan ditampilkan saat pemain bergabung dan pada "
-"daftar server."
+"Deskripsi dari server, ditampilkan saat pemain bergabung dan dalam daftar "
+"server."
#: src/settings_translation_file.cpp
msgid "Desynchronize block animation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
+msgstr "Putuskan sinkronasi animasi blok"
#: src/settings_translation_file.cpp
msgid ""
@@ -1894,6 +1901,21 @@ msgid "Disable anticheat"
msgstr "Nonaktifkan anticurang (anticheat)"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Nonaktifkan karakter kabur"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Nonaktifkan karakter kabur (escape sequences), misal: pewarnaan obrolan.\n"
+"Gunakan ini jika Anda ingin menjalankan server dengan klien pre-0.4.14 dan\n"
+"Anda ingin menonaktifkan karakter kabur yang dihasilkan oleh mods."
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Larang kata sandi kosong"
@@ -1907,7 +1929,7 @@ msgstr "Tekan ganda \"lompat\" untuk terbang"
#: src/settings_translation_file.cpp
msgid "Double-tapping the jump key toggles fly mode."
-msgstr "Menekan ganda tombol \"lompat\" untuk beralih terbang."
+msgstr "Menekan ganda tombol lompat untuk beralih terbang."
#: src/settings_translation_file.cpp
msgid "Drop item key"
@@ -1918,6 +1940,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Aktifkan Joystick"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "Aktifkan VBO"
@@ -1934,7 +1960,6 @@ msgid "Enable random user input (only used for testing)."
msgstr "Aktifkan masukan acak dari pengguna (hanya digunakan untuk pengujian)."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
@@ -1950,7 +1975,7 @@ msgid ""
"to new servers, but they may not support all new features that you are "
"expecting."
msgstr ""
-"Membolehkan untuk melarang klien lawas untuk terhubung.\n"
+"Aktifkan untuk melarang klien lawas untuk terhubung.\n"
"Klien-klien lawas dianggap sesuai jika mereka tidak rusak saat "
"menghubungkan\n"
"ke server-server baru, tetapi mereka mungkin tidak mendukung semua fitur "
@@ -1964,8 +1989,9 @@ msgid ""
"textures)\n"
"when connecting to the server."
msgstr ""
-"Membolehkan penggunaan server media asing (jika diberikan oleh server).\n"
-"Server asing menawarkan cara lebih cepat untuk mengunduh media (misal.: "
+"Membolehkan penggunaan server media jarak jauh (jika diberikan oleh "
+"server).\n"
+"Server jarak jauh menawarkan cara lebih cepat untuk mengunduh media (misal: "
"tekstur)\n"
"saat terhubung ke server."
@@ -2017,6 +2043,16 @@ msgid ""
"Enables parallax occlusion mapping.\n"
"Requires shaders to be enabled."
msgstr ""
+"Mengaktifkan pemetaan parallax occlusion.\n"
+"Membutuhkan shader diaktifkan."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
@@ -2057,7 +2093,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Fast key"
-msgstr ""
+msgstr "Tombol gerak cepat"
#: src/settings_translation_file.cpp
msgid "Fast mode acceleration"
@@ -2069,24 +2105,36 @@ msgstr "Mode cepat"
#: src/settings_translation_file.cpp
msgid "Fast movement"
-msgstr ""
+msgstr "Gerakan cepat"
#: src/settings_translation_file.cpp
msgid ""
"Fast movement (via use key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
+"Gerakan cepat (lewat tombol gunakan).\n"
+"Membutuhkan izin \"fast\" pada server."
#: src/settings_translation_file.cpp
msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2134,19 +2182,19 @@ msgstr "Tombol beralih kabut"
#: src/settings_translation_file.cpp
msgid "Font path"
-msgstr ""
+msgstr "Jalur font"
#: src/settings_translation_file.cpp
msgid "Font shadow"
-msgstr ""
+msgstr "Bayangan font"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha"
-msgstr ""
+msgstr "Keburaman bayangan font"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Keburaman bayangan font (keopakan, antara 0 sampai 255)."
#: src/settings_translation_file.cpp
msgid "Font shadow offset, if 0 then shadow will not be drawn."
@@ -2158,12 +2206,11 @@ msgstr "Ukuran font"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
-msgstr ""
+msgstr "Format tangkapan layar."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Forward key"
-msgstr "Maju"
+msgstr "Tombol maju"
#: src/settings_translation_file.cpp
msgid "Freetype fonts"
@@ -2199,11 +2246,11 @@ msgstr "Mode layar penuh."
#: src/settings_translation_file.cpp
msgid "GUI scaling"
-msgstr "Skala antarmuka"
+msgstr "Skala GUI"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter"
-msgstr "Filter skala antarmuka"
+msgstr "Filter skala GUI"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter txr2img"
@@ -2218,17 +2265,18 @@ msgid "General"
msgstr "Umum"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Generate normalmaps"
-msgstr "Gunakan Normalmaps"
+msgstr "Hasilkan normalmaps"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2257,6 +2305,21 @@ msgid ""
"- log: mimic and log backtrace of deprecated call (default for debug).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
+"Penanganan panggilan lua api usang:\n"
+"- legacy: (mencoba untuk) menyerupai aturan lawas (bawaan untuk rilis).\n"
+"- log: menyerupai dan mencatat asal-usul panggilan usang (bawaan untuk "
+"debug).\n"
+"- error: batalkan penggunaan panggilan usang (disarankan untuk pengembang "
+"mod)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
@@ -2268,15 +2331,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "High-precision FPU"
-msgstr ""
+msgstr "FPU (satuan titik mengambang) berketelitian tinggi"
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Halaman awal server, ditampilkan di daftar server."
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr ""
+msgstr "Seberapa dalam sungai yang dibuat"
#: src/settings_translation_file.cpp
msgid ""
@@ -2287,22 +2350,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
#: src/settings_translation_file.cpp
msgid "How wide to make rivers"
-msgstr ""
+msgstr "Seberapa lebar sungai yang dibuat"
#: src/settings_translation_file.cpp
msgid "IPv6"
@@ -2310,7 +2364,7 @@ msgstr "IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 server"
-msgstr ""
+msgstr "Server IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 support."
@@ -2348,6 +2402,8 @@ msgid ""
"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
"and descending."
msgstr ""
+"Jika diaktifkan, tombol \"gunakan\" akan digunakan untuk memanjat turun "
+"danbergerak turun dari pada tombol \"menyelinap\"."
#: src/settings_translation_file.cpp
msgid ""
@@ -2378,7 +2434,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Jika diatur, pemain akan bangkit (ulang) pada posisi yang diberikan."
#: src/settings_translation_file.cpp
msgid "Ignore world errors"
@@ -2391,9 +2447,44 @@ msgstr "Dalam Permainan"
#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
msgstr ""
+"Keburaman konsol obrolan dalam permainan (keopakan, antara 0 sampai 255)."
#: src/settings_translation_file.cpp
msgid "In-game chat console background color (R,G,B)."
+msgstr "Warna latar belakang konsol obrolan dalam permainan (R,G,B)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2402,16 +2493,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Interval of sending time of day to clients."
-msgstr ""
+msgstr "Jarak pengiriman waktu ke klien."
#: src/settings_translation_file.cpp
msgid "Inventory items animations"
-msgstr ""
+msgstr "Animasi barang inventaris"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Inventory key"
-msgstr "Inventaris"
+msgstr "Tombol inventaris"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
@@ -2432,6 +2522,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2461,22 +2559,20 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Jump key"
-msgstr "Lompat"
+msgstr "Tombol lompat"
#: src/settings_translation_file.cpp
msgid "Jumping speed"
-msgstr ""
+msgstr "Kecepatan lompat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for decreasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Tombol untuk bergerak cepat dalam mode cepat.\n"
+"Tombol untuk mengurangi jarak pandang.\n"
"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2491,13 +2587,12 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for increasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Tombol untuk bergerak cepat dalam mode cepat.\n"
+"Tombol untuk menambah jarak pandang.\n"
"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2567,6 +2662,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk membuka konsol obrolan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2574,6 +2672,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk membuka jendela obrolan untuk mengetik perintah.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2581,6 +2682,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk membuka jendela obrolan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2607,6 +2711,11 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk menyelinap.\n"
+"Juga digunakan untuk turun dan menyelam dalam air jika aux1_descends "
+"dinonaktifkan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2630,6 +2739,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tombol untuk beralih lari otomatis.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2644,7 +2763,7 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Tombol untuk mennganti tampilan peta mini.\n"
+"Tombol untuk mengganti tampilan peta mini.\n"
"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2680,10 +2799,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk beralih pembaruan kamera. Hanya digunakan dalam pengembangan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2691,6 +2813,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk beralih tampilan info debug.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2698,6 +2823,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk beralih tampilan HUD.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2705,6 +2833,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk beralih tampilan obrolan.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2712,6 +2843,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk beralih tampilan kabut.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2726,10 +2860,13 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tombol untuk beralih menjadi jarak pandang tanpa batas.\n"
+"Lihat http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Tombol untuk memanjat/turun"
#: src/settings_translation_file.cpp
msgid "Language"
@@ -2737,7 +2874,7 @@ msgstr "Bahasa"
#: src/settings_translation_file.cpp
msgid "Large cave depth"
-msgstr ""
+msgstr "Kedalaman gua besar"
#: src/settings_translation_file.cpp
msgid "Lava Features"
@@ -2754,11 +2891,15 @@ msgid ""
"- Simple: only outer faces, if defined special_tiles are used\n"
"- Opaque: disable transparency"
msgstr ""
+"Gaya daun:\n"
+"- Fancy: semua sisi terlihat\n"
+"- Simple: hanya sisi terluar, jika special_tiles yang didefinisikan "
+"digunakan\n"
+"- Opaque: menonaktifkan transparansi"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Left key"
-msgstr "Left Menu"
+msgstr "Tombol kiri"
#: src/settings_translation_file.cpp
msgid ""
@@ -2785,6 +2926,14 @@ msgid ""
"- info\n"
"- verbose"
msgstr ""
+"Tingkatan pencatatan yang ditulis ke debug.txt:\n"
+"- <nothing> (tanpa pencatatan)\n"
+"- none (pesan tanpa tingkatan)\n"
+"- error\n"
+"- warning\n"
+"- action\n"
+"- info\n"
+"- verbose"
#: src/settings_translation_file.cpp
msgid "Limit of emerge queues on disk"
@@ -2832,10 +2981,25 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Main menu game manager"
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Main menu game manager"
+msgstr "Pengelola permainan menu utama"
+
+#: src/settings_translation_file.cpp
msgid "Main menu mod manager"
msgstr "Pengelola mod menu utama"
@@ -2847,10 +3011,13 @@ msgstr "Skrip menu utama"
msgid ""
"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
msgstr ""
+"Buat warna kabut dan langit tergantung pada waktu (fajar/matahari "
+"tenggelam)\n"
+"dan arah melihat."
#: src/settings_translation_file.cpp
msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
-msgstr ""
+msgstr "Buat DirectX bekerja dengan LuaJIT. Nonaktifkan jika bermasalah."
#: src/settings_translation_file.cpp
msgid "Map directory"
@@ -2864,8 +3031,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2875,8 +3040,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2887,8 +3050,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2898,8 +3059,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2911,11 +3070,11 @@ msgstr "Batas generasi peta"
#: src/settings_translation_file.cpp
msgid "Map save interval"
-msgstr ""
+msgstr "Jarak menyimpan peta"
#: src/settings_translation_file.cpp
msgid "Mapblock limit"
-msgstr ""
+msgstr "Batas mapblock"
#: src/settings_translation_file.cpp
msgid "Mapblock unload timeout"
@@ -2938,24 +3097,20 @@ msgid "Mapgen biome humidity noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen debug"
-msgstr "Generator peta"
+msgstr "Debug generator peta"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flags"
-msgstr "Generator peta"
+msgstr "Flag generator peta"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat"
-msgstr "Generator peta"
+msgstr "Generator peta flat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
@@ -2970,14 +3125,12 @@ msgid "Mapgen flat filler depth noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat flags"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat ground level"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill steepness"
@@ -2988,14 +3141,12 @@ msgid "Mapgen flat hill threshold"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat lake steepness"
-msgstr "Parallax Occlusion"
+msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat lake threshold"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen flat large cave depth"
@@ -3006,14 +3157,12 @@ msgid "Mapgen flat terrain noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal"
-msgstr "Generator peta"
+msgstr "Generator peta fraktal"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal cave width"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
@@ -3028,14 +3177,12 @@ msgid "Mapgen fractal filler depth noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal fractal"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal iterations"
-msgstr "Parallax Occlusion"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia w"
@@ -3054,23 +3201,20 @@ msgid "Mapgen fractal julia z"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal offset"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal scale"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen fractal seabed noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal slice w"
-msgstr "Generator peta"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen heat blend noise parameters"
@@ -3085,9 +3229,8 @@ msgid "Mapgen v5"
msgstr "Generator peta v5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 cave width"
-msgstr "Generator peta v5"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
@@ -3119,7 +3262,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach frequency"
-msgstr ""
+msgstr "Frekuensi pantai pada generator peta v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach noise parameters"
@@ -3139,7 +3282,7 @@ msgstr "Frekuensi padang gurun pada generator peta v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 flags"
-msgstr ""
+msgstr "Flag pada generator peta v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 height select noise parameters"
@@ -3174,9 +3317,8 @@ msgid "Mapgen v7"
msgstr "Generator peta v7"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 cave width"
-msgstr "Generator peta v7"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
@@ -3228,7 +3370,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Massive cave depth"
-msgstr ""
+msgstr "Kedalaman gua raksasa"
#: src/settings_translation_file.cpp
msgid "Massive cave noise"
@@ -3275,6 +3417,14 @@ msgid "Maximum hotbar width"
msgstr "Lebar maksimal hotbar"
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr "Jumlah maksimal blok yang dapat diantrikan untuk dimuat."
@@ -3326,6 +3476,10 @@ msgid "Maximum number of statically stored objects in a block."
msgstr "Jumlah maksimal objek yang disimpan secara statis dalam satu blok."
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Jumlah objek maksimal tiap blok"
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
@@ -3334,12 +3488,12 @@ msgstr ""
"Berguna jika ada sesuatu yang akan ditampilkan di kanan atau kiri hotbar."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Jumlah maksimal blok yang dikirim serentak tiap klien"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Jumlah maksimal blok yang dikirim serentak ke tiap klien"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Jumlah maksimal total blok yang dikirim"
+msgid "Maximum simultaneous block sends total"
+msgstr "Jumlah maksimal total blok yang dikirim serentak"
#: src/settings_translation_file.cpp
msgid "Maximum time in ms a file download (e.g. a mod download) may take."
@@ -3351,10 +3505,6 @@ msgid "Maximum users"
msgstr "Jumlah pengguna maksimal"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Jumlah objek maksimal tiap blok"
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Alt"
@@ -3373,7 +3523,7 @@ msgstr "Pesan hari ini yang ditampilkan ke pemain yang terhubung."
#: src/settings_translation_file.cpp
msgid "Method used to highlight selected object."
-msgstr ""
+msgstr "Metode yang digunakan untuk memilih objek."
#: src/settings_translation_file.cpp
msgid "Minimap"
@@ -3396,10 +3546,6 @@ msgid "Mipmapping"
msgstr "Mipmapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3413,19 +3559,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Monospace font path"
-msgstr ""
+msgstr "Jalur font monospace"
#: src/settings_translation_file.cpp
msgid "Monospace font size"
-msgstr ""
+msgstr "Ukuran font monospace"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Sensitivitas mouse"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity multiplier."
-msgstr ""
+msgstr "Pengali sensitivitas mouse"
#: src/settings_translation_file.cpp
msgid ""
@@ -3451,15 +3597,18 @@ msgid ""
"When running a server, clients connecting with this name are admins.\n"
"When starting from the main menu, this is overridden."
msgstr ""
+"Nama pemain.\n"
+"Saat menjalankan server, klien yang terhubung dengan nama ini adalah admin.\n"
+"Saat menjalankan dari menu utama, nilai ini ditimpa."
#: src/settings_translation_file.cpp
msgid ""
"Name of the server, to be displayed when players join and in the serverlist."
-msgstr ""
+msgstr "Nama server, ditampilkan saat pemain bergabung dan di daftar server."
#: src/settings_translation_file.cpp
msgid "Network"
-msgstr ""
+msgstr "Jaringan"
#: src/settings_translation_file.cpp
msgid ""
@@ -3469,7 +3618,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "New users need to input this password."
-msgstr ""
+msgstr "Pengguna baru butuh memasukkan kata sandi."
#: src/settings_translation_file.cpp
msgid "Noclip"
@@ -3540,28 +3689,24 @@ msgid "Parallax occlusion"
msgstr "Parallax occlusion"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Parallax occlusion Scale"
msgstr "Skala parallax occlusion"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Parallax occlusion bias"
-msgstr "Parallax Occlusion"
+msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Parallax occlusion iterations"
-msgstr "Parallax Occlusion"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Parallax occlusion mode"
msgstr "Mode parallax occlusion"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Parallax occlusion strength"
-msgstr "Parallax Occlusion"
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Path to TrueTypeFont or bitmap."
@@ -3569,7 +3714,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Path to save screenshots at."
-msgstr ""
+msgstr "Jalur untuk menyimpan tangkapan layar."
#: src/settings_translation_file.cpp
msgid "Path to texture directory. All textures are first searched from here."
@@ -3608,11 +3753,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3620,7 +3771,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3636,29 +3787,31 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Random input"
-msgstr ""
+msgstr "Masukan acak"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Range select key"
-msgstr "Jarak pandang"
+msgstr "Tombol memilih jarak pandang"
#: src/settings_translation_file.cpp
msgid "Remote media"
-msgstr ""
+msgstr "Media jarak jauh"
#: src/settings_translation_file.cpp
msgid "Remote port"
-msgstr ""
+msgstr "Port server jarak jauh"
#: src/settings_translation_file.cpp
msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Report path"
+msgstr "Jalur laporan"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
-msgstr "Right Menu"
+msgstr "Tombol kanan"
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
@@ -3666,7 +3819,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "River Depth"
-msgstr ""
+msgstr "Kedalaman Sungai"
#: src/settings_translation_file.cpp
msgid "River Noise"
@@ -3674,7 +3827,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "River Size"
-msgstr ""
+msgstr "Ukuran sungai"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
@@ -3686,7 +3839,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Round minimap"
-msgstr ""
+msgstr "Peta mini bundar"
#: src/settings_translation_file.cpp
msgid "Save the map received by the client on disk."
@@ -3707,11 +3860,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Screen height"
-msgstr ""
+msgstr "Tinggi layar"
#: src/settings_translation_file.cpp
msgid "Screen width"
-msgstr ""
+msgstr "Lebar layar"
#: src/settings_translation_file.cpp
msgid "Screenshot"
@@ -3719,17 +3872,15 @@ msgstr "Tangkapan layar"
#: src/settings_translation_file.cpp
msgid "Screenshot folder"
-msgstr ""
+msgstr "Folder tangkapan layar"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Tangkapan layar"
+msgstr "Format tangkapan layar"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Tangkapan layar"
+msgstr "Kualitas tangkapan layar"
#: src/settings_translation_file.cpp
msgid ""
@@ -3737,14 +3888,17 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"Kualitas tangkapan layar. Hanya digunakan untuk format JPEG.\n"
+"1 berarti kualitas terburuk; 100 berarti kualitas terbaik.\n"
+"Gunakan 0 untuk kualitas bawaan."
#: src/settings_translation_file.cpp
msgid "Security"
-msgstr ""
+msgstr "Keamanan"
#: src/settings_translation_file.cpp
msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Lihat http://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
msgid "Selection box border color (R,G,B)."
@@ -3795,39 +3949,47 @@ msgid ""
"Set the language. Leave empty to use the system language.\n"
"A restart is required after changing this."
msgstr ""
+"Atur bahasa. Biarkan kosong untuk menggunakan bahasa sistem.\n"
+"Diharuskan mulai ulang setelah mengganti ini."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
+"Atur ke true untuk mengaktifkan daun melambai.\n"
+"Membutuhkan shader diaktifkan."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving plants.\n"
"Requires shaders to be enabled."
msgstr ""
+"Atur ke true untuk mengaktifkan tanaman berayun.\n"
+"Membutuhkan shader diaktifkan."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving water.\n"
"Requires shaders to be enabled."
msgstr ""
+"Atur ke true untuk mengaktifkan air berombak.\n"
+"Membutuhkan shader diaktifkan."
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Bentuk dari peta mini. Aktifkan = bundar, nonaktifkan = persegi."
#: src/settings_translation_file.cpp
msgid "Show debug info"
-msgstr ""
+msgstr "Tampilkan info debug"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
@@ -3835,7 +3997,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Shutdown message"
-msgstr ""
+msgstr "Pesan server mati"
#: src/settings_translation_file.cpp
msgid ""
@@ -3853,9 +4015,11 @@ msgstr "Pencahayaan halus"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
+"Memperhalus kamera saat melihat sekeliling. Juga disebut penghalusan mouse.\n"
+"Berguna untuk perekaman video."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
@@ -3863,16 +4027,15 @@ msgstr "Menghaluskan rotasi kamera dalam modus sinema. 0 untuk menonaktifkan."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "Penghalusan perputaran kamera. 0 untuk menonaktifkan."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Sneak key"
-msgstr "Menyelinap"
+msgstr "Tombol menyelinap"
#: src/settings_translation_file.cpp
msgid "Sound"
-msgstr ""
+msgstr "Suara"
#: src/settings_translation_file.cpp
msgid ""
@@ -3887,9 +4050,8 @@ msgid "Static spawnpoint"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Strength of generated normalmaps."
-msgstr "Gunakan Normalmaps"
+msgstr "Gunakan Normalmaps."
#: src/settings_translation_file.cpp
msgid "Strength of parallax."
@@ -3897,11 +4059,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Strict protocol checking"
-msgstr ""
+msgstr "Pengecekan protokol ketat"
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "Dukung server lawas"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
@@ -3926,16 +4088,27 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Texture path"
-msgstr "Paket Tekstur"
+msgstr "Jalur tekstur"
#: src/settings_translation_file.cpp
msgid "The altitude at which temperature drops by 20C"
+msgstr "Ketinggian saat suhu turun sebesar 20C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
msgstr ""
#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
+msgstr "Kedalaman dari tanah atau pengisi lainnya"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3954,6 +4127,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3969,6 +4148,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3989,11 +4174,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Time send interval"
-msgstr ""
+msgstr "Jarak pengiriman waktu"
#: src/settings_translation_file.cpp
msgid "Time speed"
-msgstr ""
+msgstr "Kecepatan waktu"
#: src/settings_translation_file.cpp
msgid "Timeout for client to remove unused map data from memory."
@@ -4013,7 +4198,7 @@ msgstr "Tombol beralih mode kamera"
#: src/settings_translation_file.cpp
msgid "Tooltip delay"
-msgstr ""
+msgstr "Jeda tooltip"
#: src/settings_translation_file.cpp
msgid "Trilinear filtering"
@@ -4028,7 +4213,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Trusted mods"
-msgstr ""
+msgstr "Mod terpercaya"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
@@ -4059,9 +4244,8 @@ msgid "Use bilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Use key"
-msgstr "tekan tombol"
+msgstr "Tombol gunakan"
#: src/settings_translation_file.cpp
msgid "Use mip mapping to scale textures. May slightly increase performance."
@@ -4072,10 +4256,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Berguna untuk pengembang mod."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4123,15 +4303,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "View range decrease key"
-msgstr ""
+msgstr "Tombol mengurangi jarak pandang"
#: src/settings_translation_file.cpp
msgid "View range increase key"
-msgstr ""
+msgstr "Tombol menambah jarak pandang"
#: src/settings_translation_file.cpp
msgid "Viewing range"
-msgstr ""
+msgstr "Jarak pandang"
#: src/settings_translation_file.cpp
msgid "Volume"
@@ -4150,9 +4330,8 @@ msgid "Walking speed"
msgstr "Kecepatan berjalan"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Water Features"
-msgstr "Tekstur barang..."
+msgstr "Corak air"
#: src/settings_translation_file.cpp
msgid "Water level"
@@ -4163,9 +4342,8 @@ msgid "Water surface level of the world."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving Nodes"
-msgstr "Daun Melambai"
+msgstr "Node Melambai"
#: src/settings_translation_file.cpp
msgid "Waving leaves"
@@ -4203,7 +4381,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4303,53 +4481,53 @@ msgstr "Batas cURL paralel"
msgid "cURL timeout"
msgstr "Batas waktu cURL"
-#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Memuat tekstur..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Berguna untuk pengembang mod."
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Atur ulang dunia pemain tunggal"
+#~ msgid "No of course not!"
+#~ msgstr "Tentu tidak!"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Faktor skala yang diatur untuk elemen menu: "
+#~ msgid "Public Serverlist"
+#~ msgstr "Daftar Server Publik"
-#~ msgid "Touch free target"
-#~ msgstr "Bebas sentuhan"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Hasilkan Normalmaps"
-#~ msgid "Downloading"
-#~ msgstr "Mengunduh"
+#~ msgid "No!!!"
+#~ msgstr "Tidak!!!"
-#~ msgid " KB/s"
-#~ msgstr " KB/detik"
+#~ msgid "\""
+#~ msgstr "\""
-#~ msgid " MB/s"
-#~ msgstr " MB/detik"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Nonaktifkan PM"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Mulai ulang minetest untuk beralih ke driver yang dipilih"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "diaktifkan"
#~ msgid "Rendering:"
#~ msgstr "Rendering:"
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "diaktifkan"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Mulai ulang minetest untuk beralih ke driver yang dipilih"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Nonaktifkan PM"
+#~ msgid " MB/s"
+#~ msgstr " MB/detik"
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid " KB/s"
+#~ msgstr " KB/detik"
-#~ msgid "No!!!"
-#~ msgstr "Tidak!!!"
+#~ msgid "Downloading"
+#~ msgstr "Mengunduh"
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Hasilkan Normalmaps"
+#~ msgid "Touch free target"
+#~ msgstr "Bebas sentuhan"
-#~ msgid "Public Serverlist"
-#~ msgstr "Daftar Server Publik"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Faktor skala yang diatur untuk elemen menu: "
-#~ msgid "No of course not!"
-#~ msgstr "Tentu tidak!"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Memuat tekstur..."
diff --git a/po/it/minetest.po b/po/it/minetest.po
index 83ff7c1ab..a6f49efb0 100644
--- a/po/it/minetest.po
+++ b/po/it/minetest.po
@@ -6,11 +6,11 @@ msgid ""
msgstr ""
"Project-Id-Version: Minetest 0.4.9\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-08 17:01+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-05-14 13:34+0000\n"
"Last-Translator: Emon Omen <emon@openmailbox.org>\n"
-"Language-Team: Italian "
-"<https://hosted.weblate.org/projects/minetest/minetest/it/>\n"
+"Language-Team: Italian <https://hosted.weblate.org/projects/minetest/"
+"minetest/it/>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -598,6 +598,11 @@ msgid "Particles"
msgstr "Particelle"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Siete certi di volere azzerare il vostro mondo di giocatore singolo?"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Impostazioni"
@@ -973,6 +978,10 @@ msgstr "Attivare noclip"
msgid "Use"
msgstr "Usare"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "prem. il tasto"
@@ -1289,10 +1298,6 @@ msgstr "Pulsante X 1"
msgid "X Button 2"
msgstr "Pulsante X 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1380,6 +1385,11 @@ msgid "Active Block Modifier interval"
msgstr "Intervallo del modificatore di blocco attivo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Intervallo del modificatore di blocco attivo"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr "Portata del blocco attivo"
@@ -1466,6 +1476,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "Rapporto automatico all'elenco dei server."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Tasto all'indietro"
@@ -1498,6 +1512,10 @@ msgid "Build inside player"
msgstr "Costruisci nel giocatore"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bumpmapping"
@@ -1538,6 +1556,11 @@ msgid "Chat toggle key"
msgstr "Tasto di scelta della messaggistica"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Comando"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1628,17 +1651,9 @@ msgid "Colored fog"
msgstr "Nebbia colorata"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
-msgstr ""
-"Lista separata da virgole dei mod affidabili ai quali è permesso accedere a "
-"funzioni non sicure anche quando il valore \"mod security\" è impostato su \""
-"on\" (utilizzando request_insecure_environment())."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
"allow them to upload and download data to/from the internet."
msgstr ""
"Elenco separato da virgole di mod. a cui è permesso l'accesso alle API "
@@ -1646,6 +1661,15 @@ msgstr ""
"che gli permettono di caricare e scaricare dati su/da internet."
#: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
+msgstr ""
+"Lista separata da virgole dei mod affidabili ai quali è permesso accedere a "
+"funzioni non sicure anche quando il valore \"mod security\" è impostato su "
+"\"on\" (utilizzando request_insecure_environment())."
+
+#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Tasto di comando"
@@ -1802,6 +1826,10 @@ msgid "Default privileges"
msgstr "Privilegi predefiniti"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1824,6 +1852,10 @@ msgstr ""
"blocchi (0 = illimitata)."
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "Ritardo nella comparsa dei suggerimenti, espresso in millisecondi."
@@ -1856,15 +1888,6 @@ msgid "Desynchronize block animation"
msgstr "De-sincronizza l'animazione del blocco"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Dati di profilo del mod. dettagliati. Utile per gli sviluppatori di mod."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Profilo dettagliato del mod."
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1879,6 +1902,18 @@ msgid "Disable anticheat"
msgstr "Disabilita anti-trucchi"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Rifiutare le password vuote"
@@ -1904,6 +1939,10 @@ msgid "Dump the mapgen debug infos."
msgstr "Pubblica le informazioni di debug del generatore della mappa."
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "Abilitare VBO"
@@ -1950,8 +1989,8 @@ msgid ""
"textures)\n"
"when connecting to the server."
msgstr ""
-"Abilita l'utilizzo di un server di materiale remoto (se fornito dal server)."
-"\n"
+"Abilita l'utilizzo di un server di materiale remoto (se fornito dal "
+"server).\n"
"I server remoti offrono un modo significativamente più veloce di "
"scaricamento\n"
"del materiale (ad es. le immagini) quando ci si collega al server."
@@ -2012,6 +2051,15 @@ msgstr ""
"Richiede l'attivazione degli shader."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiling data print interval"
+msgstr "Intervallo di stampa del profilamento"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2076,10 +2124,24 @@ msgid "Field of view"
msgstr "Campo visivo"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "Campo visivo"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Campo visivo in gradi."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Movimento veloce (tramite il tasto usare).\n"
+"Ciò richiede il privilegio \"fast\" sul server."
+
+#: src/settings_translation_file.cpp
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
@@ -2230,12 +2292,15 @@ msgid "Generate normalmaps"
msgstr "Generare le normalmap"
#: src/settings_translation_file.cpp
+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.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2284,6 +2349,15 @@ msgstr ""
"sviluppatori di mod.)."
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr "Componente dell'altezza della dimensione della finestra iniziale."
@@ -2315,15 +2389,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr "Quanti blocchi vengono inviati simultaneamente per l'intero server."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "Quanti blocchi volano nel cavo simultaneamente per ogni client."
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2441,6 +2506,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Colore in gioco dello sfondo della console dei messaggi (R,G,B)."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Intervallo di salvataggio dei cambiamenti importanti nel mondo, espresso in "
@@ -2479,6 +2578,16 @@ msgstr ""
"Controlla l'ammontare del dettaglio fine."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Intervallo di ripetizione del click destro"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilità del mouse"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2704,6 +2813,17 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tasto per attivare la modalità veloce.\n"
+"Si veda http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2754,8 +2874,9 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2831,7 +2952,7 @@ msgstr "Tasto \"Usare\" per arrampicarsi/scendere"
#: src/settings_translation_file.cpp
msgid "Language"
-msgstr "Linua"
+msgstr "Lingua"
#: src/settings_translation_file.cpp
msgid "Large cave depth"
@@ -2948,6 +3069,22 @@ msgid "Liquid update tick"
msgstr "Scatto di aggiornamento del liquido"
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "Intervallo del modificatore di blocco attivo"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr "Menu principale gestore giochi"
@@ -2975,6 +3112,7 @@ msgid "Map directory"
msgstr "Cartella della mappa"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen Valleys.\n"
"'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2982,14 +3120,12 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Attributi di generazione della mappa specifici per il Generatore mappa valli."
-"\n"
+"Attributi di generazione della mappa specifici per il Generatore mappa "
+"valli.\n"
"'altitude_chill' rende più fredde le altitudini più elevate, il che potrebbe "
"causare problemi di bioma.\n"
"'humid_rivers' modifica l'umidità attorno ai fiumi e in aree dove l'acqua "
@@ -3004,32 +3140,27 @@ msgstr ""
"esplicitamente."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Attributi di generazione della mappa specifici per Generatore mappa piatto.\n"
-"Laghi e colline occasionali possono essere aggiunti al mondo piatto.\n"
-"Le impostazioni predefinite impostate nel motore sono: nessuna\n"
-"La stringa delle impostazioni modifica le impostazioni predefinite del "
-"motore.\n"
+"Attributi di generazione della mappa specifici per Generatore mappa v. 7.\n"
+"'ridges' sono i fiumi.\n"
"Le impostazioni che non sono specificate nella stringa mantengono i valori "
"predefiniti.\n"
"Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
"esplicitamente."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3046,20 +3177,16 @@ msgstr ""
"esplicitamente."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Attributi di generazione della mappa specifici per Generatore mappa v. 6.\n"
-"L'impostazione 'ridges' controlla i fiumi.\n"
-"Le impostazioni predefinite impostate nel motore sono: mountains, ridges\n"
-"La stringa delle impostazioni modifica le impostazioni predefinite del "
-"motore.\n"
+"Attributi di generazione della mappa specifici per Generatore mappa v. 7.\n"
+"'ridges' sono i fiumi.\n"
"Le impostazioni che non sono specificate nella stringa mantengono i valori "
"predefiniti.\n"
"Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
@@ -3420,6 +3547,18 @@ msgid "Maximum hotbar width"
msgstr "Larghezza massima della barra oggetti"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+"Numero massimo di giocatori che possono connettersi contemporaneamente."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+"Numero massimo di blocchi che possono essere accodati per il caricamento."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
"Numero massimo di blocchi che possono essere accodati per il caricamento."
@@ -3474,6 +3613,11 @@ msgid "Maximum number of statically stored objects in a block."
msgstr "Numero massimo di oggetti immagazzinati stabilmente in un blocco."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum objects per block"
+msgstr "Oggetti massimi per blocco"
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
@@ -3482,11 +3626,13 @@ msgstr ""
"Utile se c'è qualcosa da mostrare a destra o sinistra della barra."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+#, fuzzy
+msgid "Maximum simultaneous block sends per client"
msgstr "Num. mass. di blocchi inviati contemp. per client"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+#, fuzzy
+msgid "Maximum simultaneous block sends total"
msgstr "Totale massimo di invio contemporaneo di blocchi"
#: src/settings_translation_file.cpp
@@ -3500,10 +3646,6 @@ msgid "Maximum users"
msgstr "Utenti massimi"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Oggetti massimi per blocco"
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Menu"
@@ -3544,10 +3686,6 @@ msgid "Mipmapping"
msgstr "Mipmapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Creazione del profilo dei mod."
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr "URL dei dettagli del deposito mod."
@@ -3787,22 +3925,31 @@ msgstr ""
"shell."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+"Intervallo di stampa del profilatore. 0 = disabilitato. Utile per gli "
+"sviluppatori."
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr "Privilegi che possono essere assegnati dai giocatori con basic_privs"
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
-"Intervallo di stampa del profilatore. 0 = disabilitato. Utile per gli "
-"sviluppatori."
+#, fuzzy
+msgid "Profiler"
+msgstr "Profilo valli"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
msgstr "Tasto di attivazione del profilatore"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Intervallo di stampa del profilamento"
+#, fuzzy
+msgid "Profiling"
+msgstr "Creazione del profilo dei mod."
#: src/settings_translation_file.cpp
msgid ""
@@ -3840,6 +3987,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr "Sostituisce il menu principale predefinito con uno personalizzato."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Percorso del font"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Tasto destro"
@@ -4013,8 +4165,9 @@ msgstr ""
"Necessita l'attivazione degli shader."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -4055,8 +4208,9 @@ msgid "Smooth lighting"
msgstr "Illuminazione uniforme"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
"Rende fluida la camera quando ci si muove e si guarda attorno.\n"
@@ -4150,10 +4304,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr "L'altitudine a cui le temperature crollano di 20°C"
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr "La profondità della terra o altri riempitori"
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr "L'interfaccia di rete ascoltata dal server."
@@ -4172,6 +4338,12 @@ msgstr "Il supporto di rendering per Irrlicht."
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4198,6 +4370,15 @@ msgstr ""
"funzionalità."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Il tempo in secondi richiesto tra click destri ripetuti quando si tiene il "
+"pulsante mouse destro."
+
+#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
@@ -4318,10 +4499,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Usare il filtro trilineare quando si ridimensionano le immagini."
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Utile per gli sviluppatori di mod."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr "Sincronia verticale"
@@ -4453,11 +4630,12 @@ msgstr ""
"nell'inventario)."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
"Quando gui_scaling_filter_txr2img è vero, copia quelle immagini\n"
"dall'hardware al software per il ridimensionamento. Quando è falso,\n"
@@ -4596,132 +4774,175 @@ msgstr "Limite cURL parallelo"
msgid "cURL timeout"
msgstr "Tempo di scadenza cURL"
-#~ msgid "Item textures..."
-#~ msgstr "Immagini degli oggetti..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr ""
+#~ "Dati di profilo del mod. dettagliati. Utile per gli sviluppatori di mod."
-#~ msgid "Preload inventory textures"
-#~ msgstr "Precaricamento delle textures dell'inventario"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Profilo dettagliato del mod."
-#~ msgid "Viewing range minimum"
-#~ msgstr "Distanza minima di visibilità"
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "Quanti blocchi vengono inviati simultaneamente per l'intero server."
-#~ msgid "Wanted FPS"
-#~ msgstr "FPS desiderati"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Quanti blocchi volano nel cavo simultaneamente per ogni client."
-#~ msgid "Local install"
-#~ msgstr "Installazione locale"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Utile per gli sviluppatori di mod."
-#~ msgid "Add mod:"
-#~ msgstr "Aggiungere un modulo:"
+#~ msgid "No of course not!"
+#~ msgstr "No, certo che no!"
-#~ msgid "MODS"
-#~ msgstr "MODULI"
+#~ msgid "Public Serverlist"
+#~ msgstr "Elenco dei server pubblici"
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACCH. DI IMM."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generare normalmap"
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "GIOC. SING."
+#~ msgid "No!!!"
+#~ msgstr "No!!!"
-#~ msgid "Finite Liquid"
-#~ msgstr "Liquido limitato"
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
+#~ msgstr ""
+#~ "Attributi di generazione della mappa specifici per Generatore mappa "
+#~ "valli.\n"
+#~ "Le impostazioni che non sono specificate nella stringa mantengono i "
+#~ "valori predefiniti.\n"
+#~ "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
+#~ "esplicitamente.\n"
+#~ "\"altitude_chill\" rende più fredde le elevazioni maggiori, il che "
+#~ "potrebbe causare problemi ai biomi.\n"
+#~ "\"humid_rivers\" modifica l'umidità attorno ai fiumi e nelle aree in cui "
+#~ "l'acqua tenderebbe a stagnare. Potrebbe interferire con biomi"
-#~ msgid "Preload item visuals"
-#~ msgstr "Precaricare le immagini"
+#~ msgid "If disabled "
+#~ msgstr "Disatt. pacch."
-#~ msgid "SETTINGS"
-#~ msgstr "IMPOSTAZIONI"
+#~ msgid "If enabled, "
+#~ msgstr "attivata"
-#~ msgid "Password"
-#~ msgstr "Password"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Riavviare minetest per rendere effettive le modifiche"
-#~ msgid "Name"
-#~ msgstr "Nome"
+#~ msgid "Game Name"
+#~ msgstr "Nome del gioco"
-#~ msgid "START SERVER"
-#~ msgstr "AVVIO SERVER"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gestore del gioco: impossibile il modulo \"$1\" nel gioco \"$2\""
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "GAMES"
+#~ msgstr "GIOCHI"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Aggiungere il modulo"
+#~ msgid "Mods:"
+#~ msgstr "Moduli:"
-#~ msgid "Remove selected mod"
-#~ msgstr "Rimuovere il modulo selezionato"
+#~ msgid "new game"
+#~ msgstr "nuovo gioco"
#~ msgid "EDIT GAME"
#~ msgstr "MODIFICARE IL GIOCO"
-#~ msgid "new game"
-#~ msgstr "nuovo gioco"
+#~ msgid "Remove selected mod"
+#~ msgstr "Rimuovere il modulo selezionato"
-#~ msgid "Mods:"
-#~ msgstr "Moduli:"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Aggiungere il modulo"
-#~ msgid "GAMES"
-#~ msgstr "GIOCHI"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gestore del gioco: impossibile il modulo \"$1\" nel gioco \"$2\""
+#~ msgid "START SERVER"
+#~ msgstr "AVVIO SERVER"
-#~ msgid "Game Name"
-#~ msgstr "Nome del gioco"
+#~ msgid "Name"
+#~ msgstr "Nome"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Riavviare minetest per rendere effettive le modifiche"
+#~ msgid "Password"
+#~ msgstr "Password"
-#~ msgid "If enabled, "
-#~ msgstr "attivata"
+#~ msgid "SETTINGS"
+#~ msgstr "IMPOSTAZIONI"
-#~ msgid "If disabled "
-#~ msgstr "Disatt. pacch."
+#~ msgid "Preload item visuals"
+#~ msgstr "Precaricare le immagini"
+
+#~ msgid "Finite Liquid"
+#~ msgstr "Liquido limitato"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "GIOC. SING."
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACCH. DI IMM."
+
+#~ msgid "MODS"
+#~ msgstr "MODULI"
+
+#~ msgid "Add mod:"
+#~ msgstr "Aggiungere un modulo:"
+
+#~ msgid "Local install"
+#~ msgstr "Installazione locale"
+
+#~ msgid "Wanted FPS"
+#~ msgstr "FPS desiderati"
+
+#~ msgid "Viewing range minimum"
+#~ msgstr "Distanza minima di visibilità"
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "Precaricamento delle textures dell'inventario"
+
+#~ msgid "Item textures..."
+#~ msgstr "Immagini degli oggetti..."
#~ msgid ""
#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with 'no' are used to explicitly disable them."
#~ msgstr ""
#~ "Attributi di generazione della mappa specifici per Generatore mappa v. "
-#~ "7.\n"
-#~ "'ridges' sono i fiumi.\n"
+#~ "6.\n"
+#~ "L'impostazione 'ridges' controlla i fiumi.\n"
+#~ "Le impostazioni predefinite impostate nel motore sono: mountains, ridges\n"
+#~ "La stringa delle impostazioni modifica le impostazioni predefinite del "
+#~ "motore.\n"
#~ "Le impostazioni che non sono specificate nella stringa mantengono i "
#~ "valori predefiniti.\n"
#~ "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
#~ "esplicitamente."
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
#~ msgstr ""
#~ "Attributi di generazione della mappa specifici per Generatore mappa "
-#~ "valli.\n"
+#~ "piatto.\n"
+#~ "Laghi e colline occasionali possono essere aggiunti al mondo piatto.\n"
+#~ "Le impostazioni predefinite impostate nel motore sono: nessuna\n"
+#~ "La stringa delle impostazioni modifica le impostazioni predefinite del "
+#~ "motore.\n"
#~ "Le impostazioni che non sono specificate nella stringa mantengono i "
#~ "valori predefiniti.\n"
#~ "Le impostazioni che iniziano con \"no\" sono usate per disabilitarle "
-#~ "esplicitamente.\n"
-#~ "\"altitude_chill\" rende più fredde le elevazioni maggiori, il che "
-#~ "potrebbe causare problemi ai biomi.\n"
-#~ "\"humid_rivers\" modifica l'umidità attorno ai fiumi e nelle aree in cui "
-#~ "l'acqua tenderebbe a stagnare. Potrebbe interferire con biomi"
-
-#~ msgid "No!!!"
-#~ msgstr "No!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generare normalmap"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Elenco dei server pubblici"
-
-#~ msgid "No of course not!"
-#~ msgstr "No, certo che no!"
+#~ "esplicitamente."
diff --git a/po/ja/minetest.po b/po/ja/minetest.po
index c6bc38d74..f26036749 100644
--- a/po/ja/minetest.po
+++ b/po/ja/minetest.po
@@ -2,21 +2,21 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-07 16:10+0000\n"
-"Last-Translator: BreadW <toshiharu.uno@gmail.com>\n"
-"Language-Team: Japanese "
-"<https://hosted.weblate.org/projects/minetest/minetest/ja/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-16 13:08+0000\n"
+"Last-Translator: Rui <rui.minetest@gmail.com>\n"
+"Language-Team: Japanese <https://hosted.weblate.org/projects/minetest/"
+"minetest/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr "以下ã®Modã®Luaスクリプト内ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ:"
+msgstr "以下ã®Modã®Luaスクリプトã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -44,15 +44,15 @@ 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 "Try reenabling public serverlist and check your internet connection."
@@ -60,11 +60,11 @@ msgstr "インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’確èªã—ã€å…¬é–‹ã‚µãƒ¼ãƒä¸€è¦§ã‚’å†æœ‰
#: 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_create_world.lua
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -80,11 +80,11 @@ msgstr "ä¾å­˜Mod:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable MP"
-msgstr "無効化"
+msgstr "Modパックを無効化"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable MP"
-msgstr "有効化"
+msgstr "Modパックを有効化"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
@@ -95,7 +95,7 @@ msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
msgstr ""
-"許å¯ã•ã‚Œã¦ã„ãªã„文字ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚Mod \"$1\"を有効化ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
+"許å¯ã•ã‚Œã¦ã„ãªã„文字ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€Mod「$1ã€ã‚’有効化ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚"
"文字ã¯[a-z0-9_]ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚"
#: builtin/mainmenu/dlg_config_world.lua
@@ -104,7 +104,7 @@ msgstr "ゲームをéžè¡¨ç¤º"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide mp content"
-msgstr "Modパックをéžè¡¨ç¤º"
+msgstr "Modパックã®å†…容をéžè¡¨ç¤º"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
@@ -125,7 +125,7 @@ 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 "Create"
@@ -134,7 +134,7 @@ msgstr "作æˆ"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
msgstr ""
-"minetest.netã‹ã‚‰ã€minetest_gameãªã©ã®ã‚µãƒ–ゲームをダウンロードã—ã¦ãã ã•ã„"
+"minetest.netã‹ã‚‰minetest_gameãªã©ã®ã‚µãƒ–ゲームをダウンロードã—ã¦ãã ã•ã„"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
@@ -158,7 +158,7 @@ msgstr "Seed値"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The minimal development test is meant for developers."
-msgstr "警告: Minimal development testã¯é–‹ç™ºè€…用ã§ã™ã€‚"
+msgstr "警告: minimal development testã¯é–‹ç™ºè€…用ã§ã™ã€‚"
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@@ -170,7 +170,7 @@ msgstr "サブゲームãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。"
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr "本当ã«\"$1\"を削除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
+msgstr "本当ã«ã€Œ$1ã€ã‚’削除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
@@ -180,15 +180,15 @@ msgstr "削除"
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: failed to delete \"$1\""
-msgstr "Modマãƒãƒ¼ã‚¸ãƒ£ãƒ¼: \"$1\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
+msgstr "Modマãƒãƒ¼ã‚¸ãƒ£: 「$1ã€ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: invalid modpath \"$1\""
-msgstr "Modマãƒãƒ¼ã‚¸ãƒ£ãƒ¼: Mod\"$1\"ã®å ´æ‰€ãŒä¸æ˜Žã§ã™"
+msgstr "Modマãƒãƒ¼ã‚¸ãƒ£: Mod「$1ã€ã®å ´æ‰€ãŒç„¡åŠ¹ã§ã™"
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
-msgstr "ワールド\"$1\"を削除ã—ã¾ã™ã‹ï¼Ÿ"
+msgstr "ワールド「$1ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ"
#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
msgid "Accept"
@@ -200,7 +200,7 @@ msgstr "Modパックåを変更:"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "\"$1\" is not a valid flag."
-msgstr "\"$1\"ã¯æœ‰åŠ¹ãªãƒ•ãƒ©ã‚°ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgstr "「$1ã€ã¯æœ‰åŠ¹ãªãƒ•ãƒ©ã‚°ã§ã¯ã‚ã‚Šã¾ã›ã‚“。"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
@@ -231,6 +231,7 @@ msgid "Format is 3 numbers separated by commas and inside brackets."
msgstr "括弧内ã«3ã¤ã®æ•°å­—をカンマã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã—ã¦ãã ã•ã„。"
#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
msgid ""
"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
@@ -247,12 +248,14 @@ msgid "Mods"
msgstr "Mod"
#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
msgid "Optionally the lacunarity can be appended with a leading comma."
-msgstr "空隙性ã®å€¤ã«ã¯ã€ä»»æ„ã§ã‚«ãƒ³ãƒžã‚’付ã‘ã¦èª­ã¿ã‚„ã™ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+msgstr "空隙性ã®å€¤ã¯ã€å¿…è¦ã«å¿œã˜èª­ã¿ã‚„ã™ãカンマを付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
#: builtin/mainmenu/dlg_settings_advanced.lua
+#, fuzzy
msgid "Please enter a comma seperated list of flags."
-msgstr "フラグ一覧ã¯ã‚«ãƒ³ãƒžã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã—ã¦ãã ã•ã„。"
+msgstr "フラグã¯ã‚«ãƒ³ãƒžã§åŒºåˆ‡ã£ãŸä¸€è¦§ã§å…¥åŠ›ã—ã¦ãã ã•ã„。"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
@@ -264,7 +267,7 @@ msgstr "有効ãªæ•°å­—を入力ã—ã¦ãã ã•ã„。"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Possible values are: "
-msgstr "使用å¯èƒ½ãªå€¤: "
+msgstr "å¯èƒ½ãªå€¤: "
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
@@ -272,7 +275,7 @@ msgstr "åˆæœŸè¨­å®šã«æˆ»ã™"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select path"
-msgstr "ファイルã®å ´æ‰€ã‚’é¸æŠž"
+msgstr "場所をé¸æŠž"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Show technical names"
@@ -280,11 +283,11 @@ msgstr "パラメータåを表示"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be greater than $1."
-msgstr "$1より大ãã„値ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“。"
+msgstr "値ã¯$1より大ãããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be lower than $1."
-msgstr "$1よりå°ã•ã„値ã§ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“。"
+msgstr "値ã¯$1よりå°ã•ããªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
#: builtin/mainmenu/modmgr.lua
msgid ""
@@ -292,7 +295,7 @@ msgid ""
"Install Mod: unsupported filetype \"$1\" or broken archive"
msgstr ""
"\n"
-"Modインストール: ファイル\"$1\"ã¯éžå¯¾å¿œã®å½¢å¼ã‹ã€å£Šã‚Œã¦ã„ã¾ã™"
+"Modインストール: 「$1ã€ã¯éžå¯¾å¿œã®å½¢å¼ã‹ã€å£Šã‚ŒãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã™"
#: builtin/mainmenu/modmgr.lua
msgid "Failed to install $1 to $2"
@@ -300,17 +303,15 @@ msgstr "$2ã¸$1をインストールã§ãã¾ã›ã‚“ã§ã—ãŸ"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: file: \"$1\""
-msgstr "Modインストール: ファイル: \"$1\""
+msgstr "Modインストール: ファイル: 「$1ã€"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find real modname for: $1"
-msgstr "Modインストール: $1ã®æœ¬æ¥ã®ModåãŒä¸æ˜Žã§ã™"
+msgstr "Modインストール: $1ã®æ­£ã—ã„ModåãŒä¸æ˜Žã§ã™"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find suitable foldername for modpack $1"
-msgstr ""
-"Modインストール: Modパック$1ã«é©ã—ãŸãƒ•ã‚©ãƒ«ãƒ€åを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—"
-"ãŸ"
+msgstr "Modインストール: Modパック$1ã«é©ã—ãŸãƒ•ã‚©ãƒ«ãƒ€åãŒä¸æ˜Žã§ã™"
#: builtin/mainmenu/store.lua
msgid "Close store"
@@ -318,7 +319,7 @@ msgstr "ストアを閉ã˜ã‚‹"
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
-msgstr "$1をダウンロードã—ã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„..."
+msgstr "$1をダウンロードã—ã¦ã„ã¾ã™ã€ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„..."
#: builtin/mainmenu/store.lua
msgid "Install"
@@ -354,7 +355,7 @@ msgstr "å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«"
#: builtin/mainmenu/tab_credits.lua
msgid "Active Contributors"
-msgstr "活動中ã®é–‹ç™ºå”力者"
+msgstr "活動中ã®è²¢çŒ®è€…"
#: builtin/mainmenu/tab_credits.lua
msgid "Core Developers"
@@ -366,7 +367,7 @@ msgstr "クレジット"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Contributors"
-msgstr "以å‰ã®é–‹ç™ºå”力者"
+msgstr "以å‰ã®è²¢çŒ®è€…"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Core Developers"
@@ -528,7 +529,7 @@ msgstr "ãƒãƒ³ãƒ—マッピング"
#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
-msgstr "æ“作変更"
+msgstr "キー変更"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
@@ -544,7 +545,7 @@ msgstr "ミップマップ"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
-msgstr "異方性フィルタ"
+msgstr "ミップマップã¨ç•°æ–¹æ€§ãƒ•ã‚£ãƒ«ã‚¿"
#: builtin/mainmenu/tab_settings.lua
msgid "No"
@@ -560,11 +561,11 @@ 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 builtin/mainmenu/tab_texturepacks.lua
msgid "None"
@@ -588,7 +589,11 @@ msgstr "視差é®è”½ãƒžãƒƒãƒ”ング"
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
-msgstr "パーティクル有効化"
+msgstr "パーティクル"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "シングルプレイヤーã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’リセット"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -612,15 +617,15 @@ msgstr "テクスãƒãƒ£ãƒªãƒ³ã‚°:"
#: builtin/mainmenu/tab_settings.lua
msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "シェーダーを有効ã«ã™ã‚‹ã«ã¯OpenGLを使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+msgstr "シェーダーを有効ã«ã™ã‚‹ã«ã¯OpenGLã®ãƒ‰ãƒ©ã‚¤ãƒã‚’使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr "ミップマッピング"
+msgstr "トーンマッピング"
#: builtin/mainmenu/tab_settings.lua
msgid "Touchthreshold (px)"
-msgstr "タッãƒã®ã—ãã„値(ピクセル)"
+msgstr "タッãƒã®ã—ãã„値(ピクセルå˜ä½ï¼‰"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
@@ -672,7 +677,7 @@ msgstr "テクスãƒãƒ£ãƒ‘ックをé¸æŠž:"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Texturepacks"
-msgstr "テクスãƒãƒ£"
+msgstr "テクスãƒãƒ£ãƒ‘ック"
#: src/client.cpp
msgid "Connection timed out."
@@ -740,7 +745,7 @@ msgstr ""
#: src/game.cpp
msgid "Change Keys"
-msgstr "æ“作変更"
+msgstr "キー変更"
#: src/game.cpp
msgid "Change Password"
@@ -756,11 +761,11 @@ msgstr "å†é–‹"
#: src/game.cpp
msgid "Creating client..."
-msgstr "クライアントを起動中..."
+msgstr "クライアントを作æˆä¸­..."
#: src/game.cpp
msgid "Creating server..."
-msgstr "サーãƒã‚’起動中..."
+msgstr "サーãƒã‚’作æˆä¸­..."
#: src/game.cpp
msgid ""
@@ -818,7 +823,7 @@ msgstr ""
#: src/game.cpp
msgid "Exit to Menu"
-msgstr "タイトル"
+msgstr "タイトルã«æˆ»ã‚‹"
#: src/game.cpp
msgid "Exit to OS"
@@ -830,15 +835,15 @@ msgstr "アイテムを定義中..."
#: src/game.cpp
msgid "KiB/s"
-msgstr "KB/秒"
+msgstr "KiB/秒"
#: src/game.cpp
msgid "Media..."
-msgstr "通信中..."
+msgstr "メディアをå—信中..."
#: src/game.cpp
msgid "MiB/s"
-msgstr "MB/秒"
+msgstr "MiB/秒"
#: src/game.cpp
msgid "Node definitions..."
@@ -862,7 +867,7 @@ msgstr "音é‡"
#: src/game.cpp
msgid "You died."
-msgstr "æ­»ã«ã¾ã—ãŸã€‚"
+msgstr "ã‚ãªãŸã¯æ­»ã«ã¾ã—ãŸã€‚"
#: src/game.cpp src/guiFormSpecMenu.cpp
msgid "ok"
@@ -878,7 +883,7 @@ msgstr "決定"
#: src/guiKeyChangeMenu.cpp
msgid "\"Use\" = climb down"
-msgstr "「使用ã€ã‚­ãƒ¼ã§é™ã‚Šã‚‹"
+msgstr "「使用ã€ã§é™ã‚Šã‚‹"
#: src/guiKeyChangeMenu.cpp
msgid "Backward"
@@ -898,7 +903,7 @@ msgstr "コンソール"
#: src/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
-msgstr "「ジャンプã€ã‚­ãƒ¼äºŒå›žæŠ¼ã—ã§é£›è¡Œãƒ¢ãƒ¼ãƒ‰"
+msgstr "「ジャンプã€ã®äºŒåº¦æŠ¼ã—ã§é£›è¡Œãƒ¢ãƒ¼ãƒ‰ã‚’切り替ãˆ"
#: src/guiKeyChangeMenu.cpp
msgid "Drop"
@@ -923,8 +928,8 @@ msgstr "キーãŒé‡è¤‡ã—ã¦ã„ã¾ã™"
#: src/guiKeyChangeMenu.cpp
msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
msgstr ""
-"æ“作設定ã§ã™ã€‚ (変更ã«å¤±æ•—ã—ãŸå ´åˆã€minetest.confã‹ã‚‰è©²å½“ã™ã‚‹è¨­å®šã‚’削除ã—ã¦ã"
-"ã ã•ã„)"
+"キー設定ã§ã™ã€‚ (ã“ã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§å¤±æ•—ã™ã‚‹å ´åˆã¯ã€minetest.confã‹ã‚‰è©²å½“ã™ã‚‹è¨­å®šã‚’"
+"削除ã—ã¦ãã ã•ã„)"
#: src/guiKeyChangeMenu.cpp src/keycode.cpp
msgid "Left"
@@ -932,11 +937,11 @@ msgstr "å·¦"
#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Print stacks"
-msgstr "スタックã®è¡¨ç¤º"
+msgstr "スタックã®å‡ºåŠ›"
#: src/guiKeyChangeMenu.cpp
msgid "Range select"
-msgstr "視野範囲変更"
+msgstr "視野ã®ç¯„囲を変更"
#: src/guiKeyChangeMenu.cpp src/keycode.cpp
msgid "Right"
@@ -947,18 +952,22 @@ msgid "Sneak"
msgstr "スニーク"
#: src/guiKeyChangeMenu.cpp
+#, fuzzy
msgid "Toggle Cinematic"
msgstr "映画風カメラ"
#: src/guiKeyChangeMenu.cpp
+#, fuzzy
msgid "Toggle fast"
msgstr "高速移動モード"
#: src/guiKeyChangeMenu.cpp
+#, fuzzy
msgid "Toggle fly"
msgstr "飛行モード"
#: src/guiKeyChangeMenu.cpp
+#, fuzzy
msgid "Toggle noclip"
msgstr "ã™ã‚ŠæŠœã‘モード"
@@ -966,7 +975,12 @@ msgstr "ã™ã‚ŠæŠœã‘モード"
msgid "Use"
msgstr "使用"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "ズーム"
+
#: src/guiKeyChangeMenu.cpp
+#, fuzzy
msgid "press key"
msgstr "キー入力待ã¡"
@@ -1000,27 +1014,27 @@ msgstr "音é‡: "
#: src/keycode.cpp
msgid "Apps"
-msgstr "アプリ"
+msgstr "アプリケーション"
#: src/keycode.cpp
msgid "Attn"
-msgstr ":"
+msgstr "Attn"
#: src/keycode.cpp
msgid "Back"
-msgstr "戻るキー"
+msgstr "Back"
#: src/keycode.cpp
msgid "Capital"
-msgstr "Caps Lock"
+msgstr "Capital"
#: src/keycode.cpp
msgid "Clear"
-msgstr "クリア"
+msgstr "Clear"
#: src/keycode.cpp
msgid "Comma"
-msgstr ","
+msgstr "カンマ"
#: src/keycode.cpp
msgid "Control"
@@ -1036,11 +1050,11 @@ msgstr "CrSel"
#: src/keycode.cpp
msgid "Down"
-msgstr "下"
+msgstr "Down"
#: src/keycode.cpp
msgid "End"
-msgstr "エンド"
+msgstr "End"
#: src/keycode.cpp
msgid "Erase OEF"
@@ -1048,7 +1062,7 @@ msgstr "Erase OEF"
#: src/keycode.cpp
msgid "Escape"
-msgstr "Esc"
+msgstr "Escape"
#: src/keycode.cpp
msgid "ExSel"
@@ -1056,15 +1070,15 @@ msgstr "ExSel"
#: src/keycode.cpp
msgid "Execute"
-msgstr "実行キー"
+msgstr "Execute"
#: src/keycode.cpp
msgid "Final"
-msgstr "Finalキー"
+msgstr "Final"
#: src/keycode.cpp
msgid "Help"
-msgstr "ヘルプ"
+msgstr "Help"
#: src/keycode.cpp
msgid "Home"
@@ -1076,7 +1090,7 @@ msgstr "Insert"
#: src/keycode.cpp
msgid "Junja"
-msgstr "Junjaキー"
+msgstr "Junja"
#: src/keycode.cpp
msgid "Kana"
@@ -1084,7 +1098,7 @@ msgstr "ã‹ãª"
#: src/keycode.cpp
msgid "Kanji"
-msgstr "åŠè§’/全角"
+msgstr "漢字"
#: src/keycode.cpp
msgid "Left Button"
@@ -1096,7 +1110,7 @@ msgstr "å·¦Ctrl"
#: src/keycode.cpp
msgid "Left Menu"
-msgstr "左メニュー"
+msgstr "å·¦Alt"
#: src/keycode.cpp
msgid "Left Shift"
@@ -1108,7 +1122,7 @@ msgstr "å·¦Windows"
#: src/keycode.cpp
msgid "Menu"
-msgstr "メニュー"
+msgstr "Alt"
#: src/keycode.cpp
msgid "Middle Button"
@@ -1116,7 +1130,7 @@ msgstr "中ボタン"
#: src/keycode.cpp
msgid "Minus"
-msgstr "-"
+msgstr "マイナス"
#: src/keycode.cpp
msgid "Mode Change"
@@ -1124,7 +1138,7 @@ msgstr "モード変更"
#: src/keycode.cpp
msgid "Next"
-msgstr "Page Down"
+msgstr "PageDown"
#: src/keycode.cpp
msgid "Nonconvert"
@@ -1132,67 +1146,67 @@ msgstr "無変æ›"
#: src/keycode.cpp
msgid "Num Lock"
-msgstr "Num Lock"
+msgstr "NumLock"
#: src/keycode.cpp
msgid "Numpad *"
-msgstr "テンキー *"
+msgstr "数値キーパッド *"
#: src/keycode.cpp
msgid "Numpad +"
-msgstr "テンキー +"
+msgstr "数値キーパッド +"
#: src/keycode.cpp
msgid "Numpad -"
-msgstr "テンキー -"
+msgstr "数値キーパッド -"
#: src/keycode.cpp
msgid "Numpad /"
-msgstr "テンキー /"
+msgstr "数値キーパッド /"
#: src/keycode.cpp
msgid "Numpad 0"
-msgstr "テンキー 0"
+msgstr "数値キーパッド 0"
#: src/keycode.cpp
msgid "Numpad 1"
-msgstr "テンキー 1"
+msgstr "数値キーパッド 1"
#: src/keycode.cpp
msgid "Numpad 2"
-msgstr "テンキー 2"
+msgstr "数値キーパッド 2"
#: src/keycode.cpp
msgid "Numpad 3"
-msgstr "テンキー 3"
+msgstr "数値キーパッド 3"
#: src/keycode.cpp
msgid "Numpad 4"
-msgstr "テンキー 4"
+msgstr "数値キーパッド 4"
#: src/keycode.cpp
msgid "Numpad 5"
-msgstr "テンキー 5"
+msgstr "数値キーパッド 5"
#: src/keycode.cpp
msgid "Numpad 6"
-msgstr "テンキー 6"
+msgstr "数値キーパッド 6"
#: src/keycode.cpp
msgid "Numpad 7"
-msgstr "テンキー 7"
+msgstr "数値キーパッド 7"
#: src/keycode.cpp
msgid "Numpad 8"
-msgstr "テンキー 8"
+msgstr "数値キーパッド 8"
#: src/keycode.cpp
msgid "Numpad 9"
-msgstr "テンキー 9"
+msgstr "数値キーパッド 9"
#: src/keycode.cpp
msgid "OEM Clear"
-msgstr "OEMクリア"
+msgstr "OEM Clear"
#: src/keycode.cpp
msgid "PA1"
@@ -1200,11 +1214,11 @@ msgstr "PA1"
#: src/keycode.cpp
msgid "Pause"
-msgstr "ãƒãƒ¼ã‚º"
+msgstr "Pause"
#: src/keycode.cpp
msgid "Period"
-msgstr "."
+msgstr "ピリオド"
#: src/keycode.cpp
msgid "Plus"
@@ -1212,7 +1226,7 @@ msgstr "プラス"
#: src/keycode.cpp
msgid "Print"
-msgstr "å°åˆ·ã‚­ãƒ¼"
+msgstr "Print"
#: src/keycode.cpp
msgid "Prior"
@@ -1282,10 +1296,6 @@ msgstr "Xボタン1"
msgid "X Button 2"
msgstr "Xボタン2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "ズーム"
-
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
@@ -1374,6 +1384,11 @@ msgid "Active Block Modifier interval"
msgstr "アクティブãªãƒ–ロックã®ç¯„囲"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "アクティブãªãƒ–ロックã®ç¯„囲"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr "アクティブãªãƒ–ロックã®ç¯„囲"
@@ -1464,6 +1479,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "自動的ã«ã‚µãƒ¼ãƒä¸€è¦§ã«å ±å‘Šã—ã¾ã™ã€‚"
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "オートランキー"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "後キー"
@@ -1499,6 +1518,10 @@ msgid "Build inside player"
msgstr "プレイヤーã®ä½ç½®ã«è¨­ç½®"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "ビルトイン"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "ãƒãƒ³ãƒ—マッピング"
@@ -1529,7 +1552,7 @@ msgstr "洞窟ノイズ#2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "洞窟ã®å¹…"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -1546,6 +1569,11 @@ msgstr "ãƒãƒ£ãƒƒãƒˆãƒˆã‚°ãƒ«ã‚­ãƒ¼"
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Chatcommands"
+msgstr "コマンド"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1638,22 +1666,22 @@ msgstr "色ã¤ãã®éœ§"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
-"æµè¡Œã®æœ€å…ˆç«¯ã®å®‰å…¨å¯¾ç­–ãŒã‚ªãƒ³ã®ï¼ˆrequest_insecure_environment()を通ã—ã¦ï¼‰ã¨"
-"ãã§ã‚‚ã€ä¸å®‰å®šãªæ©Ÿèƒ½ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚‚よã„信用ã•ã‚ŒãŸãƒ¢ãƒƒã‚ºã®ã‚³ãƒ³ãƒžã§åŒºåˆ‡ã‚‰ã‚ŒãŸ"
-"リスト。"
+"HTTP API(彼らãŒã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«å‡ºå…¥ã‚Šã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’アップロードã—ã¦ã€ãƒ€ã‚¦ãƒ³"
+"ロードã™ã‚‹ã®ã‚’許ã—ã¾ã™ï¼‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚‚よã„モッズã®ã‚³ãƒ³ãƒžseperatedã•ã‚ŒãŸãƒªã‚¹"
+"ト。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
-"HTTP API(彼らãŒã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«å‡ºå…¥ã‚Šã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’アップロードã—ã¦ã€ãƒ€ã‚¦ãƒ³"
-"ロードã™ã‚‹ã®ã‚’許ã—ã¾ã™ï¼‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚‚よã„モッズã®ã‚³ãƒ³ãƒžseperatedã•ã‚ŒãŸãƒªã‚¹"
-"ト。"
+"æµè¡Œã®æœ€å…ˆç«¯ã®å®‰å…¨å¯¾ç­–ãŒã‚ªãƒ³ã®ï¼ˆrequest_insecure_environment()を通ã—ã¦ï¼‰ã¨"
+"ãã§ã‚‚ã€ä¸å®‰å®šãªæ©Ÿèƒ½ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã‚‚よã„信用ã•ã‚ŒãŸãƒ¢ãƒƒã‚ºã®ã‚³ãƒ³ãƒžã§åŒºåˆ‡ã‚‰ã‚ŒãŸ"
+"リスト。"
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -1824,6 +1852,10 @@ msgid "Default privileges"
msgstr "標準権é™"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
@@ -1847,6 +1879,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr "ブロック(0無制é™ã®=)ã§ã€æœ€å¤§é™ã®ãƒ—レーヤー移転è·é›¢ã‚’定ã‚ã¾ã™ã€‚"
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "ツールãƒãƒƒãƒ—を表示ã™ã‚‹ã¾ã§ã®é…延ã§ã™ã€‚ミリ秒ã§æŒ‡å®šã—ã¦ãã ã•ã„。"
@@ -1885,16 +1921,6 @@ msgstr "ブロックã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®éžåŒæœŸåŒ–"
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "詳細ãªModã®ãƒ—ロファイルデータã§ã™ã€‚Mod開発者ã«ä¾¿åˆ©ã§ã™ã€‚"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Detailed mod profiling"
-msgstr "詳細ãªModã®ãƒ—ロファイル化"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1909,6 +1935,18 @@ msgid "Disable anticheat"
msgstr "対ãƒãƒ¼ãƒˆæ©Ÿé–¢ç„¡åŠ¹åŒ–"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Disallow empty passwords"
msgstr "空ã®ãƒ‘スワードを無効化"
@@ -1938,6 +1976,10 @@ msgid "Dump the mapgen debug infos."
msgstr "マップ生æˆã®ãƒ‡ãƒãƒƒã‚°æƒ…報を出力ã—ã¾ã™ã€‚"
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "有効化"
@@ -2053,6 +2095,14 @@ msgstr ""
"シェーダーãŒæœ‰åŠ¹ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
@@ -2131,12 +2181,26 @@ msgstr "視野"
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Field of view for zoom"
+msgstr "視野"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Field of view in degrees."
msgstr "視野角。"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"高速移動 (使用キー)。\n"
+"サーãƒã«ã‚ˆã‚‹ã€Œfastã€æ¨©é™ãŒå¿…è¦ã§ã™ã€‚"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2286,12 +2350,14 @@ msgid "Generate normalmaps"
msgstr "ノーマルマップã®ç”Ÿæˆ"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2322,6 +2388,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2351,15 +2426,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2453,6 +2519,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2487,6 +2587,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2646,6 +2754,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2681,7 +2796,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2832,6 +2947,22 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "アクティブãªãƒ–ロックã®ç¯„囲"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2864,8 +2995,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2875,8 +3004,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2887,8 +3014,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2898,8 +3023,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3262,6 +3385,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3303,17 +3434,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3325,10 +3460,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "メニュー"
@@ -3369,10 +3500,6 @@ msgid "Mipmapping"
msgstr "ミップマッピング"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3577,11 +3704,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3589,7 +3722,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3624,6 +3757,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "フォントパス"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "å³ã‚­ãƒ¼"
@@ -3783,7 +3921,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3820,7 +3958,7 @@ msgstr "滑らã‹ãªç…§æ˜Ž"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3899,10 +4037,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3918,6 +4068,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3933,6 +4089,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -4035,16 +4197,12 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Mod開発ã«ä¾¿åˆ©ã€‚"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
#: src/settings_translation_file.cpp
msgid "VBO"
-msgstr ""
+msgstr "VBO"
#: src/settings_translation_file.cpp
msgid "Valley Depth"
@@ -4164,7 +4322,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4269,9 +4427,8 @@ msgid "Y of flat ground."
msgstr "フラットマップã®åœ°é¢ã®é«˜ã•"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Y of upper limit of large pseudorandom caves."
-msgstr "大ãã„擬似ランダム洞窟ã®é«˜ã•(Y)ã®ä¸Šé™ã€‚"
+msgstr "擬似乱数ã«ã‚ˆã‚‹å¤§ãã„洞窟ã®é«˜ã•(Y)ã®ä¸Šé™ã€‚"
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
@@ -4279,51 +4436,59 @@ msgstr "cURLファイルダウンロードタイムアウト"
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
-msgstr "cURLパラレル制é™"
+msgstr "cURL並行処ç†åˆ¶é™"
#: src/settings_translation_file.cpp
msgid "cURL timeout"
msgstr "cURLタイムアウト"
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "テクスãƒãƒ£èª­ã¿è¾¼ã¿ä¸­..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "詳細ãªModã®ãƒ—ロファイルデータã§ã™ã€‚Mod開発者ã«ä¾¿åˆ©ã§ã™ã€‚"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "シングルプレイヤーã®ãƒ¯ãƒ¼ãƒ«ãƒ‰ã‚’リセット"
+#, fuzzy
+#~ msgid "Detailed mod profiling"
+#~ msgstr "詳細ãªModã®ãƒ—ロファイル化"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "メニューã®å¤§ãã•ã¨ã—ã¦è¨­å®šã•ã‚Œã¦ã„る数値: "
+#~ msgid "Useful for mod developers."
+#~ msgstr "Mod開発ã«ä¾¿åˆ©ã€‚"
-#~ msgid "Touch free target"
-#~ msgstr "タッãƒä½ç½®ã‚’自由ã«ã™ã‚‹"
+#~ msgid "No of course not!"
+#~ msgstr "ã„ã„ãˆï¼"
-#~ msgid " KB/s"
-#~ msgstr " KB/秒"
+#~ msgid "Public Serverlist"
+#~ msgstr "公開サーãƒä¸€è¦§"
-#~ msgid " MB/s"
-#~ msgstr " MB/秒"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "ノーマルマップã®ç”Ÿæˆ"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "ドライãƒãƒ¼ã‚’変更ã™ã‚‹ãŸã‚Minetestã‚’å†èµ·å‹•ã—ã¾ã™"
+#~ msgid "No!!!"
+#~ msgstr "ã„ã„ãˆï¼ï¼ï¼"
-#~ msgid "Rendering:"
-#~ msgstr "レンダリング:"
+#~ msgid "If disabled "
+#~ msgstr "無効化ã®å ´åˆ "
#~ msgid "If enabled, "
#~ msgstr "有効化ã®å ´åˆ "
-#~ msgid "If disabled "
-#~ msgstr "無効化ã®å ´åˆ "
+#~ msgid "Rendering:"
+#~ msgstr "レンダリング:"
-#~ msgid "No!!!"
-#~ msgstr "ã„ã„ãˆï¼ï¼ï¼"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "ドライãƒãƒ¼ã‚’変更ã™ã‚‹ãŸã‚Minetestã‚’å†èµ·å‹•ã—ã¾ã™"
-#~ msgid "Generate Normalmaps"
-#~ msgstr "ノーマルマップã®ç”Ÿæˆ"
+#~ msgid " MB/s"
+#~ msgstr " MB/秒"
-#~ msgid "Public Serverlist"
-#~ msgstr "公開サーãƒä¸€è¦§"
+#~ msgid " KB/s"
+#~ msgstr " KB/秒"
-#~ msgid "No of course not!"
-#~ msgstr "ã„ã„ãˆï¼"
+#~ msgid "Touch free target"
+#~ msgstr "タッãƒä½ç½®ã‚’自由ã«ã™ã‚‹"
+
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "メニューã®å¤§ãã•ã¨ã—ã¦è¨­å®šã•ã‚Œã¦ã„る数値: "
+
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "テクスãƒãƒ£èª­ã¿è¾¼ã¿ä¸­..."
diff --git a/po/jbo/minetest.po b/po/jbo/minetest.po
index 522433c1a..12ac80a39 100644
--- a/po/jbo/minetest.po
+++ b/po/jbo/minetest.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: 2016-05-08 17:39+0000\n"
"Last-Translator: senpi <saikos@openmailbox.org>\n"
-"Language-Team: Lojban "
-"<https://hosted.weblate.org/projects/minetest/minetest/jbo/>\n"
+"Language-Team: Lojban <https://hosted.weblate.org/projects/minetest/minetest/"
+"jbo/>\n"
"Language: jbo\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -607,6 +607,10 @@ msgid "Particles"
msgstr "lo kantu"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "kraga'igau le za'e pavykelci munje"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr ""
@@ -964,6 +968,10 @@ msgstr ""
msgid "Use"
msgstr "mu'e pilno"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "ko da'ergau le batke"
@@ -1280,10 +1288,6 @@ msgstr "la'o gy.X Button 1.gy."
msgid "X Button 2"
msgstr "la'o gy.X Button 2.gy."
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1351,6 +1355,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1425,6 +1433,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "za'i ti'a muvdu"
@@ -1460,6 +1472,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr ""
@@ -1501,6 +1517,11 @@ msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "minde"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1577,14 +1598,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1735,6 +1756,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1751,6 +1776,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1781,14 +1810,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1801,6 +1822,18 @@ msgid "Disable anticheat"
msgstr "lo kantu"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
@@ -1825,6 +1858,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "selpli"
@@ -1908,6 +1945,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1969,11 +2014,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2108,12 +2163,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2144,6 +2201,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2172,15 +2238,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2274,6 +2331,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2309,6 +2400,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2469,6 +2568,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2504,7 +2610,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2656,6 +2762,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2690,8 +2811,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2701,8 +2820,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2713,8 +2830,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2724,8 +2839,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3084,6 +3197,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3125,17 +3246,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3147,10 +3272,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr ""
@@ -3192,10 +3313,6 @@ msgid "Mipmapping"
msgstr "lo puvrmipmepi"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3400,11 +3517,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3412,7 +3535,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3448,6 +3571,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Right key"
msgstr "za'i ri'u muvdu"
@@ -3613,7 +3740,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3651,7 +3778,7 @@ msgstr "lo xutla se gusni"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3731,10 +3858,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3750,6 +3889,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3765,6 +3910,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3869,10 +4020,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4002,7 +4149,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4102,19 +4249,16 @@ msgstr ""
msgid "cURL timeout"
msgstr ""
-#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr ".i ca'o samymo'i le tengu datnyvei"
+#~ msgid "No of course not!"
+#~ msgstr "nasai go'i"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "kraga'igau le za'e pavykelci munje"
+#~ msgid "No!!!"
+#~ msgstr "nasai go'i"
#, fuzzy
#~ msgid "If enabled, "
#~ msgstr "selpli"
-#~ msgid "No!!!"
-#~ msgstr "nasai go'i"
-
-#~ msgid "No of course not!"
-#~ msgstr "nasai go'i"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr ".i ca'o samymo'i le tengu datnyvei"
diff --git a/po/ko/minetest.po b/po/ko/minetest.po
index bf5ba3da9..9f1219d6e 100644
--- a/po/ko/minetest.po
+++ b/po/ko/minetest.po
@@ -2,34 +2,33 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-07-08 23:30+0200\n"
-"Last-Translator: Tae Lim Kook <tkook11@gmail.com>\n"
-"Language-Team: Korean <https://hosted.weblate.org/projects/minetest/minetest/"
-"ko/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-31 05:41+0000\n"
+"Last-Translator: Han So Ri <2_0_2_0_@naver.com>\n"
+"Language-Team: Korean "
+"<https://hosted.weblate.org/projects/minetest/minetest/ko/>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.4-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
+msgstr "Lua 스í¬ë¦½íŠ¸ì—ì„œ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤. 해당 모드:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
-msgstr ""
+msgstr "오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤:"
#: builtin/fstk/ui.lua
msgid "Main menu"
-msgstr ""
+msgstr "주 메뉴"
#: builtin/fstk/ui.lua builtin/mainmenu/store.lua
msgid "Ok"
@@ -37,39 +36,39 @@ msgstr "확ì¸"
#: builtin/fstk/ui.lua
msgid "Reconnect"
-msgstr ""
+msgstr "재접ì†"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr ""
+msgstr "ìž¬ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
-msgstr ""
+msgstr "로딩중..."
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
-msgstr ""
+msgstr "프로토콜 ë²„ì „ì´ ë§žì§€ 않습니다. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr ""
+msgstr "서버는 프로토콜 버전 $1 ì„(를) 사용합니다. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr ""
+msgstr "서버는 프로토콜 버전 $1ê³¼(와) $2 사ì´ë¥¼ 제공합니다. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
-msgstr ""
+msgstr "ì¸í„°ë„· ì—°ê²°ì„ í™•ì¸í•œ 후 서버 리스트를 확ì¸í•˜ì„¸ìš”."
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr ""
+msgstr "프로토콜 버전 $1만 제공합니다."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
-msgstr ""
+msgstr "프로토콜 버전 $1ê³¼(와) $2 사ì´ë¥¼ 제공합니다."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -85,33 +84,33 @@ msgstr ""
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable MP"
-msgstr ""
+msgstr "MP 미ì ìš©"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable MP"
-msgstr ""
+msgstr "MP ì ìš©"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
-msgstr ""
+msgstr "ëª¨ë‘ ì ìš©"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
-msgstr ""
+msgstr "\"$1\"는(ì€) í—ˆë½ë˜ì§€ ì•Šì€ ìºë¦­í„°ë¡œ 사용할 수 없습니다. [a-z0-9_]만 사용할 수 있습니다."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
-msgstr ""
+msgstr "숨겨진 게임"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide mp content"
-msgstr ""
+msgstr "숨겨진 맵 콘í…츠"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr ""
+msgstr "모드:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -120,131 +119,133 @@ msgstr "저장"
#: builtin/mainmenu/dlg_config_world.lua
msgid "World:"
-msgstr ""
+msgstr "월드:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "enabled"
-msgstr ""
+msgstr "ì ìš©"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "\"$1\" 는(ì€) ì´ë¯¸ 존재합니다"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
-msgstr ""
+msgstr "만들기"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr ""
+msgstr "minetest.net ì—ì„œ minetest_gameê°™ì€ ì„œë¸Œê²Œìž„ì„ ë‹¤ìš´ë¡œë“œ 하세요"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
-msgstr ""
+msgstr "minetest.net ì—ì„œ 다운로드 하세요"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
-msgstr ""
+msgstr "게임"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Mapgen"
-msgstr ""
+msgstr "맵젠"
#: builtin/mainmenu/dlg_create_world.lua
msgid "No worldname given or no game selected"
-msgstr ""
+msgstr "ê²Œìž„ì„ ì„ íƒí•˜ì§€ 않았거나 게임 ì´ë¦„ì´ ì—†ìŠµë‹ˆë‹¤"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Seed"
-msgstr ""
+msgstr "시드"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
+msgstr "경고: ìµœì†Œí•œì˜ ê°œë°œ 테스트는 개발ìžë¥¼ 위한 것입니다."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
-msgstr ""
+msgstr "월드 ì´ë¦„"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
-msgstr ""
+msgstr "ì„œë¸Œê²Œìž„ì„ ì„¤ì¹˜í•˜ì§€ 않았습니다."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr ""
+msgstr "$1 를(ì„) 삭제하겠습니까?"
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
#: src/keycode.cpp
msgid "Delete"
-msgstr ""
+msgstr "삭제"
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: failed to delete \"$1\""
-msgstr ""
+msgstr "Modmgr: \"$1\"를(ì„) 삭제할 수 없습니다"
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: invalid modpath \"$1\""
-msgstr ""
+msgstr "Modmgr: \"$1\" 를(ì„) ì¸ì‹í•  수 없습니다"
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
-msgstr ""
+msgstr "\"$1\"를(ì„) 삭제하겠습니까?"
#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
msgid "Accept"
-msgstr ""
+msgstr "확ì¸"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
-msgstr ""
+msgstr "모드팩 ì´ë¦„바꾸기:"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "\"$1\" is not a valid flag."
-msgstr ""
+msgstr "\"$1\" 는(ì€) 유효한 플래그가 아닙니다."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr ""
+msgstr "(ì„¤ì •ì˜ ì„¤ëª…ì´ ì—†ìŠµë‹ˆë‹¤)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr ""
+msgstr "설정 페ì´ì§€ë¡œ ëŒì•„가기"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
-msgstr ""
+msgstr "열기"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Disabled"
-msgstr ""
+msgstr "ì ìš© 안함"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Edit"
-msgstr ""
+msgstr "수정"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Enabled"
-msgstr ""
+msgstr "ì ìš©"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
-msgstr ""
+msgstr "3ê°œì˜ ìˆ˜ê°€ 쉼표와 괄호로 구분ë˜ëŠ” 형ì‹ìž…니다."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid ""
"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
msgstr ""
+"형ì‹: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, <octaves>, "
+"<persistence>"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
-msgstr ""
+msgstr "게임"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
msgid "Mods"
-msgstr ""
+msgstr "모드"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
@@ -252,61 +253,63 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a comma seperated list of flags."
-msgstr ""
+msgstr "í”Œëž˜ê·¸ì˜ ë¦¬ìŠ¤íŠ¸ë¥¼ 쉼표로 구분하여 ìž…ë ¥ 하십시오."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
-msgstr ""
+msgstr "유효한 정수를 입력해주세요."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid number."
-msgstr ""
+msgstr "유효한 숫ìžë¥¼ 입력해주세요."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Possible values are: "
-msgstr ""
+msgstr "가능한 값: "
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
-msgstr ""
+msgstr "기본값 ë³µì›"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select path"
-msgstr ""
+msgstr "경로 ì„ íƒ"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Show technical names"
-msgstr ""
+msgstr "ê¸°ìˆ ì  ì´ë¦„ 보기"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be greater than $1."
-msgstr ""
+msgstr "ê°’ì€ $1 (ì´)보다 커야 합니다."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be lower than $1."
-msgstr ""
+msgstr "ê°’ì€ $1 (ì´)보다 ë” ë‚®ì•„ì•¼í•©ë‹ˆë‹¤."
#: builtin/mainmenu/modmgr.lua
msgid ""
"\n"
"Install Mod: unsupported filetype \"$1\" or broken archive"
msgstr ""
+"\n"
+"설치 모드: \"$1\"는(ì€) ì§€ì› ë˜ì§€ 않는 íŒŒì¼ í˜•ì‹ ì´ê±°ë‚˜ 깨진 압축 파ì¼ìž…니다"
#: builtin/mainmenu/modmgr.lua
msgid "Failed to install $1 to $2"
-msgstr ""
+msgstr "$1ì—ì„œ $2는(ì€) 설치 í•  수 없습니다"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: file: \"$1\""
-msgstr ""
+msgstr "설치 모드: 파ì¼: \"$1\""
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find real modname for: $1"
-msgstr ""
+msgstr "설치 모드: $1를(ì„) ì°¾ì„ ìˆ˜ 없습니다"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find suitable foldername for modpack $1"
-msgstr ""
+msgstr "설치 모드: 모드 팩 $1 (ì´)ì˜ ì˜¬ë°”ë¥¸ í´ë”를 ì°¾ì„ ìˆ˜ 없습니다"
#: builtin/mainmenu/store.lua
msgid "Close store"
@@ -314,123 +317,123 @@ msgstr ""
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
-msgstr ""
+msgstr "$1 를(ì„) 다운로드중입니다. 기다려주세요..."
#: builtin/mainmenu/store.lua
msgid "Install"
-msgstr ""
+msgstr "설치"
#: builtin/mainmenu/store.lua
msgid "Page $1 of $2"
-msgstr ""
+msgstr "$2페ì´ì§€ 중 $1"
#: builtin/mainmenu/store.lua
msgid "Rating"
-msgstr ""
+msgstr "순위"
#: builtin/mainmenu/store.lua
msgid "Search"
-msgstr ""
+msgstr "검색"
#: builtin/mainmenu/store.lua
msgid "Shortname:"
-msgstr ""
+msgstr "ì§§ì€ ì´ë¦„:"
#: builtin/mainmenu/store.lua
msgid "Successfully installed:"
-msgstr ""
+msgstr "설치 완료:"
#: builtin/mainmenu/store.lua
msgid "Unsorted"
-msgstr ""
+msgstr "기타"
#: builtin/mainmenu/store.lua
msgid "re-Install"
-msgstr ""
+msgstr "재설치"
#: builtin/mainmenu/tab_credits.lua
msgid "Active Contributors"
-msgstr ""
+msgstr "활ë™ì ì¸ 공헌ìž"
#: builtin/mainmenu/tab_credits.lua
msgid "Core Developers"
-msgstr ""
+msgstr "코어 개발ìž"
#: builtin/mainmenu/tab_credits.lua
msgid "Credits"
-msgstr ""
+msgstr "만든ì´"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Contributors"
-msgstr ""
+msgstr "ì´ì „ 공헌ìžë“¤"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Core Developers"
-msgstr ""
+msgstr "ì´ì „ 코어 개발ìžë“¤"
#: builtin/mainmenu/tab_mods.lua
msgid "Installed Mods:"
-msgstr ""
+msgstr "설치한 모드:"
#: builtin/mainmenu/tab_mods.lua
msgid "Mod information:"
-msgstr ""
+msgstr "모드 정보:"
#: builtin/mainmenu/tab_mods.lua
msgid "No mod description available"
-msgstr ""
+msgstr "모드 ì„¤ëª…ì´ ì—†ìŠµë‹ˆë‹¤"
#: builtin/mainmenu/tab_mods.lua
msgid "Rename"
-msgstr ""
+msgstr "ì´ë¦„ 바꾸기"
#: builtin/mainmenu/tab_mods.lua
msgid "Select Mod File:"
-msgstr ""
+msgstr "ì„ íƒí•œ 모드 파ì¼:"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected mod"
-msgstr ""
+msgstr "ì„ íƒí•œ 모드 ì‚­ì œ"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected modpack"
-msgstr ""
+msgstr "ì„ íƒí•œ 모드팩 ì‚­ì œ"
#: builtin/mainmenu/tab_multiplayer.lua
msgid "Address / Port"
-msgstr ""
+msgstr "주소/í¬íŠ¸"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
-msgstr ""
+msgstr "í´ë¼ì´ì–¸íŠ¸"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Connect"
-msgstr ""
+msgstr "ì—°ê²°"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Creative mode"
-msgstr ""
+msgstr "í¬ë¦¬ì—ì´í‹°ë¸Œ 모드"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Damage enabled"
-msgstr ""
+msgstr "ë°ë¯¸ì§€ë¥¼ ìž…ì„ ìˆ˜ 있습니다"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Del. Favorite"
-msgstr ""
+msgstr "ì¦ê²¨ì°¾ê¸° ì‚­ì œ"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Favorite"
-msgstr ""
+msgstr "ì¦ê²¨ì°¾ê¸°"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Name / Password"
-msgstr ""
+msgstr "ì´ë¦„/비밀번호"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
-msgstr ""
+msgstr "PvP 가능"
#: builtin/mainmenu/tab_server.lua
msgid "Bind Address"
@@ -438,93 +441,93 @@ msgstr ""
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Configure"
-msgstr ""
+msgstr "환경설정"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_singleplayer.lua
msgid "Creative Mode"
-msgstr ""
+msgstr "í¬ë¦¬ì—ì´í‹°ë¸Œ 모드"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_singleplayer.lua
msgid "Enable Damage"
-msgstr ""
+msgstr "ë°ë¯¸ì§€ë¥¼ ë°›ì„ ìˆ˜ 있습니다"
#: builtin/mainmenu/tab_server.lua
msgid "Name/Password"
-msgstr ""
+msgstr "ì´ë¦„/비밀번호"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "New"
-msgstr ""
+msgstr "새로 만들기"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "No world created or selected!"
-msgstr ""
+msgstr "월드를 만들거나 ì„ íƒí•˜ì§€ 않았습니다!"
#: builtin/mainmenu/tab_server.lua
msgid "Port"
-msgstr ""
+msgstr "í¬íŠ¸"
#: builtin/mainmenu/tab_server.lua
msgid "Public"
-msgstr ""
+msgstr "ì¼ë°˜"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Select World:"
-msgstr ""
+msgstr "비밀 월드:"
#: builtin/mainmenu/tab_server.lua
msgid "Server"
-msgstr ""
+msgstr "서버"
#: builtin/mainmenu/tab_server.lua
msgid "Server Port"
-msgstr ""
+msgstr "서버 í¬íŠ¸"
#: builtin/mainmenu/tab_server.lua
msgid "Start Game"
-msgstr ""
+msgstr "게임 시작"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
-msgstr ""
+msgstr "2 x"
#: builtin/mainmenu/tab_settings.lua
msgid "3D Clouds"
-msgstr ""
+msgstr "3D 구름 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "4x"
-msgstr ""
+msgstr "4 x"
#: builtin/mainmenu/tab_settings.lua
msgid "8x"
-msgstr ""
+msgstr "8 ë°°ì†"
#: builtin/mainmenu/tab_settings.lua
msgid "Advanced Settings"
-msgstr ""
+msgstr "고급 설정"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr ""
+msgstr "매ë„럽게 표현하기:"
#: builtin/mainmenu/tab_settings.lua
msgid "Are you sure to reset your singleplayer world?"
-msgstr ""
+msgstr "싱글 플레ì´ì–´ 월드를 다시 시작하겠습니까?"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
-msgstr ""
+msgstr "ì´ì¤‘ 선형 í•„í„°"
#: builtin/mainmenu/tab_settings.lua
msgid "Bump Mapping"
-msgstr ""
+msgstr "범프 매핑"
#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
-msgstr ""
+msgstr "키 변경"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
@@ -532,11 +535,11 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
-msgstr ""
+msgstr "아름다운 나무 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr ""
+msgstr "밉 맵"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
@@ -544,39 +547,39 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "No"
-msgstr ""
+msgstr "아니오"
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr ""
+msgstr "í•„í„° ì—†ìŒ"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
-msgstr ""
+msgstr "ë°‰ 맵 ì—†ìŒ"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr ""
+msgstr "Node ê°•ì¡°"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr ""
+msgstr "Node 설명"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
-msgstr ""
+msgstr "ì—†ìŒ"
#: builtin/mainmenu/tab_settings.lua
msgid "Normal Mapping"
-msgstr ""
+msgstr "노멀 매핑"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
-msgstr ""
+msgstr "불투명한 나뭇잎 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Water"
-msgstr ""
+msgstr "불투명한 물 효과"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Parallax Occlusion"
@@ -584,143 +587,147 @@ msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Particles"
-msgstr ""
+msgstr "ìž…ìž íš¨ê³¼"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "싱글 플레ì´ì–´ 월드 다시 시작"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
-msgstr ""
+msgstr "설정"
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Shaders"
-msgstr ""
+msgstr "ì‰ì´ë”"
#: builtin/mainmenu/tab_settings.lua
msgid "Simple Leaves"
-msgstr ""
+msgstr "단순한 나뭇잎 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
-msgstr ""
+msgstr "부드러운 조명 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "Texturing:"
-msgstr ""
+msgstr "질ê°:"
#: builtin/mainmenu/tab_settings.lua
msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "ì‰ì´ë”를 사용하려면 OpenGL ë“œë¼ì´ë²„를 사용할 필요가 있습니다."
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr ""
+msgstr "톤 매핑"
#: builtin/mainmenu/tab_settings.lua
msgid "Touchthreshold (px)"
-msgstr ""
+msgstr "터치임계값 (픽셀)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
-msgstr ""
+msgstr "선형 필터"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
-msgstr ""
+msgstr "움ì§ì´ëŠ” 나뭇잎 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Plants"
-msgstr ""
+msgstr "움ì§ì´ëŠ” ì‹ë¬¼ 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Water"
-msgstr ""
+msgstr "물결 효과"
#: builtin/mainmenu/tab_settings.lua
msgid "Yes"
-msgstr ""
+msgstr "예"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Config mods"
-msgstr ""
+msgstr "모드 설정"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Main"
-msgstr ""
+msgstr "ë©”ì¸"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Start Singleplayer"
-msgstr ""
+msgstr "싱글 플레ì´ì–´ 시작"
#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
msgid "Play"
-msgstr ""
+msgstr "시작"
#: builtin/mainmenu/tab_singleplayer.lua
msgid "Singleplayer"
-msgstr ""
+msgstr "싱글 플레ì´ì–´"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "No information available"
-msgstr ""
+msgstr "정보가 없습니다"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Select texture pack:"
-msgstr ""
+msgstr "ì„ íƒí•œ í…ìŠ¤ì³ íŒ©:"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Texturepacks"
-msgstr ""
+msgstr "í…ìŠ¤ì³ íŒ©"
#: src/client.cpp
msgid "Connection timed out."
-msgstr ""
+msgstr "ì—°ê²° ì‹œê°„ì´ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤."
#: src/client.cpp
msgid "Done!"
-msgstr ""
+msgstr "실행 중입니다!"
#: src/client.cpp
msgid "Initializing nodes"
-msgstr ""
+msgstr "node 초기값 설정중"
#: src/client.cpp
msgid "Initializing nodes..."
-msgstr ""
+msgstr "node 초기값 설정중..."
#: src/client.cpp
msgid "Loading textures..."
-msgstr ""
+msgstr "í…ìŠ¤ì³ ë¡œë”©ì¤‘..."
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr ""
+msgstr "ì‰ì´ë” 개축중..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
-msgstr ""
+msgstr "연결 오류 (시간초과)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game \""
-msgstr ""
+msgstr "ê²Œìž„ì„ ì°¾ì§€ 못했거나 로딩할 수 없습니다\""
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
-msgstr ""
+msgstr "ì¸ì‹í•  수 없는 게임 사양입니다."
#: src/client/clientlauncher.cpp
msgid "Main Menu"
-msgstr ""
+msgstr "주 메뉴"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
+msgstr "월드를 ì„ íƒí•˜ì§€ ì•Šì•„ 주소를 ë°›ì„ ìˆ˜ 없습니다."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr ""
+msgstr "ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤."
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr ""
+msgstr "월드가 존재하지 않습니다: "
#: src/fontengine.cpp
msgid "needs_fallback_font"
@@ -731,30 +738,32 @@ msgid ""
"\n"
"Check debug.txt for details."
msgstr ""
+"\n"
+"ìžì„¸í•œ ë‚´ìš©ì€ debug.txtì„ í™•ì¸ í•©ë‹ˆë‹¤."
#: src/game.cpp
msgid "Change Keys"
-msgstr ""
+msgstr "키 변경"
#: src/game.cpp
msgid "Change Password"
-msgstr ""
+msgstr "비밀번호 변경"
#: src/game.cpp
msgid "Connecting to server..."
-msgstr ""
+msgstr "서버 연결중..."
#: src/game.cpp
msgid "Continue"
-msgstr ""
+msgstr "계ì†"
#: src/game.cpp
msgid "Creating client..."
-msgstr ""
+msgstr "í´ë¼ì´ì–¸íŠ¸ 만드는 중..."
#: src/game.cpp
msgid "Creating server..."
-msgstr ""
+msgstr "서버 만드는 중..."
#: src/game.cpp
msgid ""
@@ -770,6 +779,16 @@ msgid ""
"- Mouse wheel: select item\n"
"- T: chat\n"
msgstr ""
+"기본 컨트롤:-WASD: ì´ë™\n"
+"-스페ì´ìŠ¤: ì í”„/오르기\n"
+"-쉬프트:살금살금/내려가기\n"
+"-Q: ì•„ì´í…œ 드롭\n"
+"-I: ì¸ë²¤í† ë¦¬\n"
+"-마우스: ëŒì•„보기/보기\n"
+"-마우스 왼쪽: 파내기/공격\n"
+"-마우스 오른쪽: 배치/사용\n"
+"-마우스 휠: ì•„ì´í…œ ì„ íƒ\n"
+"-T: 채팅\n"
#: src/game.cpp
msgid ""
@@ -786,86 +805,98 @@ msgid ""
"- touch&drag, tap 2nd finger\n"
" --> place single item to slot\n"
msgstr ""
+"기본 컨트롤: \n"
+"표시가 없는 메뉴:\n"
+"- ë‹¨ì¼ íƒ­: 버튼 활성화\n"
+"- ë”블 탭: 배치/사용\n"
+"- 드래그: 둘러보기\n"
+" 메뉴/ì¸ë²¤í† ë¦¬:\n"
+"- ë”블 탭 (외부):\n"
+" -->닫기\n"
+"- 무ë”기(stack) 터치, 슬롯 터치: \n"
+" --> 무ë”기(stack) ì´ë™ \n"
+"- 터치 ë° ë“œëž˜ê·¸, 검지로 탭\n"
+" --> ìŠ¬ë¡¯ì— í•œê°œì˜ ì•„ì´í…œ 배치\n"
#: src/game.cpp
msgid "Exit to Menu"
-msgstr ""
+msgstr "메뉴 나가기"
#: src/game.cpp
msgid "Exit to OS"
-msgstr ""
+msgstr "게임 종료"
#: src/game.cpp
msgid "Item definitions..."
-msgstr ""
+msgstr "ì•„ì´í…œ ì •ì˜ì¤‘..."
#: src/game.cpp
msgid "KiB/s"
-msgstr ""
+msgstr "KiB/s"
#: src/game.cpp
msgid "Media..."
-msgstr ""
+msgstr "미디어..."
#: src/game.cpp
msgid "MiB/s"
-msgstr ""
+msgstr "MiB/s"
#: src/game.cpp
msgid "Node definitions..."
-msgstr ""
+msgstr "Node ì •ì˜ì¤‘..."
#: src/game.cpp
msgid "Resolving address..."
-msgstr ""
+msgstr "주소 분ì„중..."
#: src/game.cpp
msgid "Respawn"
-msgstr ""
+msgstr "리스í°"
#: src/game.cpp
msgid "Shutting down..."
-msgstr ""
+msgstr "서버가 닫혔습니다..."
#: src/game.cpp
msgid "Sound Volume"
-msgstr ""
+msgstr "볼륨 조절"
#: src/game.cpp
msgid "You died."
-msgstr ""
+msgstr "ë‹¹ì‹ ì€ ì£½ì—ˆìŠµë‹ˆë‹¤."
#: src/game.cpp src/guiFormSpecMenu.cpp
msgid "ok"
-msgstr ""
+msgstr "확ì¸"
#: src/guiFormSpecMenu.cpp
msgid "Enter "
-msgstr ""
+msgstr "들어가기 "
#: src/guiFormSpecMenu.cpp
msgid "Proceed"
-msgstr ""
+msgstr "계ì†í•˜ê¸°"
#: src/guiKeyChangeMenu.cpp
msgid "\"Use\" = climb down"
-msgstr ""
+msgstr "\"Use\" = 내려가기"
#: src/guiKeyChangeMenu.cpp
msgid "Backward"
-msgstr ""
+msgstr "뒤로"
#: src/guiKeyChangeMenu.cpp
msgid "Chat"
-msgstr ""
+msgstr "채팅"
#: src/guiKeyChangeMenu.cpp
msgid "Command"
-msgstr ""
+msgstr "명령어"
#: src/guiKeyChangeMenu.cpp
msgid "Console"
-msgstr ""
+msgstr "콘솔"
#: src/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
@@ -873,31 +904,31 @@ msgstr ""
#: src/guiKeyChangeMenu.cpp
msgid "Drop"
-msgstr ""
+msgstr "떨어뜨리기"
#: src/guiKeyChangeMenu.cpp
msgid "Forward"
-msgstr ""
+msgstr "앞으로"
#: src/guiKeyChangeMenu.cpp
msgid "Inventory"
-msgstr ""
+msgstr "ì¸ë²¤í† ë¦¬"
#: src/guiKeyChangeMenu.cpp
msgid "Jump"
-msgstr ""
+msgstr "ì í”„"
#: src/guiKeyChangeMenu.cpp
msgid "Key already in use"
-msgstr ""
+msgstr "ì´ë¯¸ 사용하고 있는 키입니다"
#: src/guiKeyChangeMenu.cpp
msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
-msgstr ""
+msgstr "Keybindings. (ì´ ë©”ë‰´ë¥¼ 고정하려면 minetest.cofì—ì„œ stuff를 제거해야합니다.)"
#: src/guiKeyChangeMenu.cpp src/keycode.cpp
msgid "Left"
-msgstr ""
+msgstr "왼쪽"
#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
msgid "Print stacks"
@@ -905,83 +936,87 @@ msgstr ""
#: src/guiKeyChangeMenu.cpp
msgid "Range select"
-msgstr ""
+msgstr "범위 ì„ íƒ"
#: src/guiKeyChangeMenu.cpp src/keycode.cpp
msgid "Right"
-msgstr ""
+msgstr "오른쪽"
#: src/guiKeyChangeMenu.cpp
msgid "Sneak"
-msgstr ""
+msgstr "살금살금"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle Cinematic"
-msgstr ""
+msgstr "시네마틱 스위치"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle fast"
-msgstr ""
+msgstr "ê³ ì† ìŠ¤ìœ„ì¹˜"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle fly"
-msgstr ""
+msgstr "비행 스위치"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle noclip"
-msgstr ""
+msgstr "ìžìœ ì‹œì  스위치"
#: src/guiKeyChangeMenu.cpp
msgid "Use"
-msgstr ""
+msgstr "사용"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "확대/축소"
#: src/guiKeyChangeMenu.cpp
msgid "press key"
-msgstr ""
+msgstr "키를 누르세요"
#: src/guiPasswordChange.cpp
msgid "Change"
-msgstr ""
+msgstr "변경"
#: src/guiPasswordChange.cpp
msgid "Confirm Password"
-msgstr ""
+msgstr "비밀번호 확ì¸"
#: src/guiPasswordChange.cpp
msgid "New Password"
-msgstr ""
+msgstr "새로운 비밀번호"
#: src/guiPasswordChange.cpp
msgid "Old Password"
-msgstr ""
+msgstr "현재 비밀번호"
#: src/guiPasswordChange.cpp
msgid "Passwords do not match!"
-msgstr ""
+msgstr "비밀번호가 맞지 않습니다!"
#: src/guiVolumeChange.cpp
msgid "Exit"
-msgstr ""
+msgstr "나가기"
#: src/guiVolumeChange.cpp
msgid "Sound Volume: "
-msgstr ""
+msgstr "볼륨 조절: "
#: src/keycode.cpp
msgid "Apps"
-msgstr ""
+msgstr "애플 리 ì¼€ì´ ì…˜"
#: src/keycode.cpp
msgid "Attn"
-msgstr ""
+msgstr "담당ìž"
#: src/keycode.cpp
msgid "Back"
-msgstr ""
+msgstr "뒤로"
#: src/keycode.cpp
msgid "Capital"
-msgstr ""
+msgstr "ìžë³¸"
#: src/keycode.cpp
msgid "Clear"
@@ -989,7 +1024,7 @@ msgstr ""
#: src/keycode.cpp
msgid "Comma"
-msgstr ""
+msgstr "쉼표"
#: src/keycode.cpp
msgid "Control"
@@ -997,7 +1032,7 @@ msgstr ""
#: src/keycode.cpp
msgid "Convert"
-msgstr ""
+msgstr "변환"
#: src/keycode.cpp
msgid "CrSel"
@@ -1009,7 +1044,7 @@ msgstr ""
#: src/keycode.cpp
msgid "End"
-msgstr ""
+msgstr "ë"
#: src/keycode.cpp
msgid "Erase OEF"
@@ -1025,23 +1060,23 @@ msgstr ""
#: src/keycode.cpp
msgid "Execute"
-msgstr ""
+msgstr "실행"
#: src/keycode.cpp
msgid "Final"
-msgstr ""
+msgstr "최종"
#: src/keycode.cpp
msgid "Help"
-msgstr ""
+msgstr "ë„움ë§"
#: src/keycode.cpp
msgid "Home"
-msgstr ""
+msgstr "Home"
#: src/keycode.cpp
msgid "Insert"
-msgstr ""
+msgstr "Insert"
#: src/keycode.cpp
msgid "Junja"
@@ -1057,107 +1092,109 @@ msgstr ""
#: src/keycode.cpp
msgid "Left Button"
-msgstr ""
+msgstr "ì™¼ìª½ëœ ë²„íŠ¼"
#: src/keycode.cpp
msgid "Left Control"
-msgstr ""
+msgstr "왼쪽 컨트롤"
#: src/keycode.cpp
msgid "Left Menu"
-msgstr ""
+msgstr "왼쪽 메뉴"
#: src/keycode.cpp
msgid "Left Shift"
-msgstr ""
+msgstr "왼쪽 쉬프트"
#: src/keycode.cpp
msgid "Left Windows"
-msgstr ""
+msgstr "왼쪽 창"
#: src/keycode.cpp
msgid "Menu"
-msgstr ""
+msgstr "메뉴"
#: src/keycode.cpp
msgid "Middle Button"
-msgstr ""
+msgstr "ê°€ìš´ë° ë²„íŠ¼"
#: src/keycode.cpp
msgid "Minus"
-msgstr ""
+msgstr "마ì´ë„ˆìŠ¤"
#: src/keycode.cpp
msgid "Mode Change"
-msgstr ""
+msgstr "모드 변경"
#: src/keycode.cpp
msgid "Next"
-msgstr ""
+msgstr "다ìŒ"
#: src/keycode.cpp
+#, fuzzy
msgid "Nonconvert"
-msgstr ""
+msgstr "변환 안함"
#: src/keycode.cpp
+#, fuzzy
msgid "Num Lock"
-msgstr ""
+msgstr "Num Lock"
#: src/keycode.cpp
msgid "Numpad *"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ *"
#: src/keycode.cpp
msgid "Numpad +"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ +"
#: src/keycode.cpp
msgid "Numpad -"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ -"
#: src/keycode.cpp
msgid "Numpad /"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ /"
#: src/keycode.cpp
msgid "Numpad 0"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 0"
#: src/keycode.cpp
msgid "Numpad 1"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 1"
#: src/keycode.cpp
msgid "Numpad 2"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 2"
#: src/keycode.cpp
msgid "Numpad 3"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 3"
#: src/keycode.cpp
msgid "Numpad 4"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 4"
#: src/keycode.cpp
msgid "Numpad 5"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 5"
#: src/keycode.cpp
msgid "Numpad 6"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 6"
#: src/keycode.cpp
msgid "Numpad 7"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 7"
#: src/keycode.cpp
msgid "Numpad 8"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 8"
#: src/keycode.cpp
msgid "Numpad 9"
-msgstr ""
+msgstr "ìˆ«ìž í‚¤íŒ¨ë“œ 9"
#: src/keycode.cpp
msgid "OEM Clear"
@@ -1168,76 +1205,81 @@ msgid "PA1"
msgstr ""
#: src/keycode.cpp
+#, fuzzy
msgid "Pause"
-msgstr ""
+msgstr "ì¼ì‹œ 중지"
#: src/keycode.cpp
msgid "Period"
-msgstr ""
+msgstr "기간"
#: src/keycode.cpp
msgid "Plus"
-msgstr ""
+msgstr "플러스"
#: src/keycode.cpp
+#, fuzzy
msgid "Print"
-msgstr ""
+msgstr "ì¸ì‡„"
#: src/keycode.cpp
msgid "Prior"
-msgstr ""
+msgstr "ì´ì „"
#: src/keycode.cpp
msgid "Return"
-msgstr ""
+msgstr "ë˜ëŒë¦¬ê¸°"
#: src/keycode.cpp
msgid "Right Button"
-msgstr ""
+msgstr "오른쪽 버튼"
#: src/keycode.cpp
msgid "Right Control"
-msgstr ""
+msgstr "오른쪽 컨트롤"
#: src/keycode.cpp
msgid "Right Menu"
-msgstr ""
+msgstr "오른쪽 메뉴"
#: src/keycode.cpp
msgid "Right Shift"
-msgstr ""
+msgstr "오른쪽 쉬프트"
#: src/keycode.cpp
msgid "Right Windows"
-msgstr ""
+msgstr "오른쪽 창"
#: src/keycode.cpp
+#, fuzzy
msgid "Scroll Lock"
-msgstr ""
+msgstr "스í¬ë¡¤ ë½"
#: src/keycode.cpp
msgid "Select"
-msgstr ""
+msgstr "ì„ íƒ"
#: src/keycode.cpp
msgid "Shift"
-msgstr ""
+msgstr "쉬프트"
#: src/keycode.cpp
msgid "Sleep"
-msgstr ""
+msgstr "ìž ìžê¸°"
#: src/keycode.cpp
+#, fuzzy
msgid "Snapshot"
-msgstr ""
+msgstr "스냅ìˆ"
#: src/keycode.cpp
+#, fuzzy
msgid "Space"
-msgstr ""
+msgstr "스페ì´ìŠ¤"
#: src/keycode.cpp
msgid "Tab"
-msgstr ""
+msgstr "탭"
#: src/keycode.cpp
msgid "Up"
@@ -1251,10 +1293,6 @@ msgstr ""
msgid "X Button 2"
msgstr ""
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1272,13 +1310,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "3D clouds"
-msgstr ""
+msgstr "3D 구름 효과"
#: src/settings_translation_file.cpp
msgid "3D mode"
-msgstr ""
+msgstr "3D 모드"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"3D support.\n"
"Currently supported:\n"
@@ -1289,20 +1328,30 @@ msgid ""
"- sidebyside: split screen side by side.\n"
"- pageflip: quadbuffer based 3d."
msgstr ""
+"3D 지ì›.\n"
+"현재 지ì›ë˜ëŠ” 것:\n"
+"- ì—†ìŒ: 3d 출력 ì—†ìŒ.\n"
+"- ìž…ì²´ 사진: ì²­ë¡ìƒ‰/ìží™ìƒ‰ 3d.\n"
+"- interlaced: odd/even line based polarisation screen support.↵\n"
+"- topbottom: split screen top/bottom.↵\n"
+"- sidebyside: split screen side by side.↵\n"
+"- pageflip: quadbuffer based 3d."
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
+"새로운 ë§µì„ ìœ„í•´ ì„ íƒí•œ 맵 시드가 무작위로 비워져있다면\n"
+"ë©”ì¸ë©”뉴ì—ì„œ 새로운 월드를 만들때 ìž¬ì •ì˜ ë  ê²ƒìž…ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
-msgstr ""
+msgstr "서버 ì¶©ëŒ í•˜ëŠ” 경우 모든 사용ìžë“¤ì—게 표시 ë  ë©”ì‹œì§€ìž…ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
-msgstr ""
+msgstr "서버가 ë‹«íž ë•Œ 모든 사용ìžë“¤ì—게 표시 ë  ë©”ì‹œì§€ìž…ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "Absolute limit of emerge queues"
@@ -1321,8 +1370,12 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "ë¸”ë¡ ìˆ˜ì‹ì–´ 활성"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr ""
+msgstr "ë¸”ë¡ ë²”ìœ„ 활성"
#: src/settings_translation_file.cpp
msgid "Active object send range"
@@ -1364,23 +1417,28 @@ msgid "Ambient occlusion gamma"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Amplifies the valleys"
-msgstr ""
+msgstr "계곡 ì¦í­"
#: src/settings_translation_file.cpp
msgid "Anisotropic filtering"
-msgstr ""
+msgstr "ì´ë°©ì„± í•„í„°ë§"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Announce server"
-msgstr ""
+msgstr "서버 발표"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Announce to this serverlist.\n"
"If you want to announce your ipv6 address, use serverlist_url = v6.servers."
"minetest.net."
msgstr ""
+"ì„œë²„ë¦¬ìŠ¤íŠ¸ì— ë°œí‘œí•©ë‹ˆë‹¤.\n"
+"만약 ë‹¹ì‹ ì˜ Ipv6 주소를 알리기 ì›í•œë‹¤ë©´ serverlist_url = v6.servers.minetest.net ì„ ì‚¬ìš©í•˜ì„¸ìš”."
#: src/settings_translation_file.cpp
msgid "Approximate (X,Y,Z) scale of fractal in nodes."
@@ -1388,31 +1446,35 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
-msgstr ""
+msgstr "ì¶©ëŒ í›„ 재연결 요청"
#: src/settings_translation_file.cpp
msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Backward key"
+msgid "Autorun key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Backward key"
+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 "Bilinear filtering"
-msgstr ""
+msgstr "ì´ì¤‘ 선형 í•„í„°ë§"
#: src/settings_translation_file.cpp
msgid "Bind address"
@@ -1427,6 +1489,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr ""
@@ -1444,15 +1510,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
-msgstr ""
+msgstr "ë™êµ´ ìž¡ìŒ #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
-msgstr ""
+msgstr "ë™êµ´ ìž¡ìŒ #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "ë™êµ´ 너비"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1460,11 +1526,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Chat key"
-msgstr ""
+msgstr "채팅"
#: src/settings_translation_file.cpp
msgid "Chat toggle key"
-msgstr ""
+msgstr "채팅 스위치"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "채팅 명ë ì–´"
#: src/settings_translation_file.cpp
msgid ""
@@ -1490,40 +1560,42 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Chunk size"
-msgstr ""
+msgstr "ë©ì–´ë¦¬ í¬ê¸°"
#: src/settings_translation_file.cpp
msgid "Cinematic mode"
-msgstr ""
+msgstr "시네마틱 모드"
#: src/settings_translation_file.cpp
msgid "Cinematic mode key"
-msgstr ""
+msgstr "시네마틱 모드 스위치"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Clean transparent textures"
-msgstr ""
+msgstr "깨ë—하고 투명한 í…스처"
#: src/settings_translation_file.cpp
msgid "Client and Server"
-msgstr ""
+msgstr "í´ë¼ì´ì–¸íŠ¸ì™€ 서버"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
-msgstr ""
+msgstr "오르기 ì†ë„"
#: src/settings_translation_file.cpp
msgid "Cloud height"
-msgstr ""
+msgstr "구름 높ì´"
#: src/settings_translation_file.cpp
msgid "Cloud radius"
-msgstr ""
+msgstr "구름 반지름"
#: src/settings_translation_file.cpp
msgid "Clouds"
-msgstr ""
+msgstr "구름"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
@@ -1535,23 +1607,26 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Colored fog"
-msgstr ""
+msgstr "색깔있는 안개"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
+"쉼표로 êµ¬ë¶„ëœ ëª¨ë“œì˜ ë¦¬ìŠ¤íŠ¸ëŠ” HTTP APIì— ì ‘ê·¼ í•  수 있습니다.\n"
+"ì¸í„°ë„·ì—ì„œ ë°ì´í„°ë¥¼ 다운로드 하거나 업로드 í•  수 있습니다."
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Command key"
-msgstr ""
+msgstr "명령 키"
#: src/settings_translation_file.cpp
msgid "Connect glass"
@@ -1616,7 +1691,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Crash message"
-msgstr ""
+msgstr "ì¶©ëŒ ë©”ì‹œì§€"
#: src/settings_translation_file.cpp
msgid ""
@@ -1652,11 +1727,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "DPI"
-msgstr ""
+msgstr "ê°ë„(DPI)"
#: src/settings_translation_file.cpp
msgid "Damage"
-msgstr ""
+msgstr "ë°ë¯¸ì§€"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
@@ -1676,20 +1751,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Default game"
-msgstr ""
+msgstr "기본 게임"
#: src/settings_translation_file.cpp
+#, fuzzy
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 "기본 권한"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
msgstr ""
#: src/settings_translation_file.cpp
@@ -1699,14 +1781,22 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Defines sampling step of texture.\n"
"A higher value results in smoother normal maps."
msgstr ""
+"í…ìŠ¤ì²˜ì˜ ìƒ˜í”Œë§ ë‹¨ê³„ë¥¼ ì •ì˜í•©ë‹ˆë‹¤.\n"
+"ì¼ë°˜ ë§µì— ë¶€ë“œëŸ½ê²Œ ë†’ì€ ê°’ì„ ë‚˜íƒ€ëƒ…ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
-msgstr ""
+msgstr "블ë¡ì— 최대 플레ì´ì–´ 전송 거리를 ì •ì˜ í•©ë‹ˆë‹¤ (0 = 무제한)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "건축 후 ë¸”ë¡ ì „ì†¡ 지연"
#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
@@ -1739,31 +1829,35 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
-msgstr ""
+msgstr "비밀번호 없으면 불가"
#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "ë„ë©”ì¸ ì„œë²„ì˜ ì´ë¦„ì€ ì„œë²„ë¦¬ìŠ¤íŠ¸ì— í‘œì‹œ ë©ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "Double tap jump for fly"
@@ -1775,23 +1869,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Drop item key"
-msgstr ""
+msgstr "ì•„ì´í…œ ë“œëž í‚¤"
#: src/settings_translation_file.cpp
msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "ì¡°ì´ìŠ¤í‹± ì ìš©"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
-msgstr ""
+msgstr "VBO ì ìš©"
#: src/settings_translation_file.cpp
msgid "Enable mod security"
-msgstr ""
+msgstr "보안 모드 ì ìš©"
#: src/settings_translation_file.cpp
msgid "Enable players getting damage and dying."
-msgstr ""
+msgstr "플레ì´ì–´ëŠ” ë°ë¯¸ì§€ë¥¼ 받거나 ì£½ì„ ìˆ˜ 있습니다."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
@@ -1829,7 +1927,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "ì¸ë²¤í† ë¦¬ ì•„ì´í…œì˜ 애니메ì´ì…˜ ì ìš©."
#: src/settings_translation_file.cpp
msgid ""
@@ -1838,6 +1936,8 @@ msgid ""
"or need to be auto-generated.\n"
"Requires shaders to be enabled."
msgstr ""
+"í…ìŠ¤ì²˜ì— bumpmappingì„ í•  수 있습니다. Normalmaps는 í…ìŠ¤ì³ íŒ©ì—ì„œ 받거나 ìžë™ ìƒì„±ë  필요가 있습니다.\n"
+"ì‰ì´ë”를 활성화 해야 합니다."
#: src/settings_translation_file.cpp
msgid "Enables caching of facedir rotated meshes."
@@ -1849,13 +1949,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Enables minimap."
-msgstr ""
+msgstr "미니맵 ì ìš©."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Enables on the fly normalmap generation (Emboss effect).\n"
"Requires bumpmapping to be enabled."
msgstr ""
+"비행 노멀맵 ìƒì„± ì ìš© (엠보스 효과).\n"
+"Bumpmapping를 활성화 해야 합니다."
#: src/settings_translation_file.cpp
msgid ""
@@ -1864,6 +1967,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1925,11 +2036,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -1952,35 +2073,35 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Filtering"
-msgstr ""
+msgstr "í•„í„°ë§"
#: src/settings_translation_file.cpp
msgid "Fixed map seed"
-msgstr ""
+msgstr "ìˆ˜ì •ëœ ë§µ 시드"
#: src/settings_translation_file.cpp
msgid "Fly key"
-msgstr ""
+msgstr "비행 키"
#: src/settings_translation_file.cpp
msgid "Flying"
-msgstr ""
+msgstr "비행"
#: src/settings_translation_file.cpp
msgid "Fog"
-msgstr ""
+msgstr "안개"
#: src/settings_translation_file.cpp
msgid "Fog toggle key"
-msgstr ""
+msgstr "안개 스위치"
#: src/settings_translation_file.cpp
msgid "Font path"
-msgstr ""
+msgstr "글꼴 경로"
#: src/settings_translation_file.cpp
msgid "Font shadow"
-msgstr ""
+msgstr "글꼴 그림ìž"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha"
@@ -1996,7 +2117,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Font size"
-msgstr ""
+msgstr "글꼴 í¬ê¸°"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
@@ -2028,7 +2149,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Full screen"
-msgstr ""
+msgstr "전체 화면"
#: src/settings_translation_file.cpp
msgid "Full screen BPP"
@@ -2036,7 +2157,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
-msgstr ""
+msgstr "전체 화면 모드."
#: src/settings_translation_file.cpp
msgid "GUI scaling"
@@ -2052,14 +2173,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Gamma"
-msgstr ""
+msgstr "ê°ë§ˆ"
#: src/settings_translation_file.cpp
msgid "General"
-msgstr ""
+msgstr "ì¼ë°˜"
#: src/settings_translation_file.cpp
msgid "Generate normalmaps"
+msgstr "Normalmaps ìƒì„±"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2067,8 +2192,6 @@ msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2076,7 +2199,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Graphics"
-msgstr ""
+msgstr "그래픽"
#: src/settings_translation_file.cpp
msgid "Gravity"
@@ -2084,7 +2207,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "HTTP Mods"
-msgstr ""
+msgstr "HTTP 모드"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -2099,6 +2222,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2112,11 +2244,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "ì„œë²„ì˜ í™ˆíŽ˜ì´ì§€ëŠ” 서버 ë¦¬ìŠ¤íŠ¸ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr ""
+msgstr "얼마나 ê°•ì„ ê¹Šê²Œ 만들건가요"
#: src/settings_translation_file.cpp
msgid ""
@@ -2127,15 +2259,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2146,11 +2269,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "IPv6"
-msgstr ""
+msgstr "IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 server"
-msgstr ""
+msgstr "IPv6 서버"
#: src/settings_translation_file.cpp
msgid "IPv6 support."
@@ -2218,14 +2341,49 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "In-Game"
-msgstr ""
+msgstr "ì¸ê²Œìž„"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "게임 ë‚´ì—ì„œ 채팅 콘솔 ë°°ê²½ 알파 (불투명 함, 0와 255 사ì´)."
#: src/settings_translation_file.cpp
msgid "In-game chat console background color (R,G,B)."
+msgstr "게임 ë‚´ì—ì„œ 채팅 콘솔 ë°°ê²½ ìƒ‰ìƒ (빨,ì´ˆ,파)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2242,7 +2400,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Inventory key"
-msgstr ""
+msgstr "ì¸ë²¤í† ë¦¬ 키"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
@@ -2263,6 +2421,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2293,11 +2459,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Jump key"
-msgstr ""
+msgstr "ì í”„ 키"
#: src/settings_translation_file.cpp
msgid "Jumping speed"
-msgstr ""
+msgstr "ì í”„ ì†ë„"
#: src/settings_translation_file.cpp
msgid ""
@@ -2305,6 +2471,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"보여지는 범위 ê°ì†Œì— 대한 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2312,6 +2481,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"현재 ì„ íƒëœ ì•„ì´í…œ ë“œë¡­ì— ëŒ€í•œ 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2319,6 +2491,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"보여지는 범위 ì¦ê°€ì— 대한 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2326,6 +2501,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ì í”„키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2333,6 +2511,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ê³ ì† ëª¨ë“œì—ì„œ 빠르게 ì´ë™í•˜ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2340,6 +2521,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"플레ì´ì–´ê°€ 뒤쪽으로 움ì§ì´ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2347,6 +2531,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"플레ì´ì–´ê°€ 앞으로 움ì§ì´ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2354,6 +2541,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"플레ì´ì–´ê°€ 왼쪽으로 움ì§ì´ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2361,6 +2551,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"플레ì´ì–´ê°€ 오른쪽으로 움ì§ì´ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2368,6 +2561,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"채팅 ì°½ì„ ì—¬ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2375,6 +2571,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"명령어를 입력하기 위해 ì±„íŒ…ì°½ì„ ì—¬ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2382,6 +2581,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ì±„íŒ…ì°½ì„ ì—¬ëŠ” 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2389,6 +2591,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ì¸ë²¤í† ë¦¬ë¥¼ 여는 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2396,6 +2601,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"디버그 무ë”기(stacks) ì¸ì‡„ 키. ê°œë°œì„ ìœ„í•´ 사용ë¨.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2405,6 +2613,10 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"살금살금걷기 키입니다.\n"
+"만약 aux1_descends를 사용할 수 없는 ê²½ìš°ì— ë¬¼ì—ì„œ 내려가거나 올ë¼ì˜¬ 수 있습니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2412,6 +2624,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"1ì¸ì¹­ì—ì„œ 3ì¸ì¹­ê°„ ì¹´ë©”ë¼ ì „í™˜í‚¤ìž…ë‹ˆë‹¤.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2419,6 +2634,16 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"스í¬ë¦°ìƒ·í‚¤ìž…니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
@@ -2426,6 +2651,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"시네마틱 모드 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2433,6 +2661,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"미니 맵 표시 설정/해제 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2440,6 +2671,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ê³ ì† ëª¨ë“œ 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2447,6 +2681,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"비행 모드 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2454,13 +2691,19 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ìžìœ ì‹œì  모드 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ì¹´ë©”ë¼ ì—…ë°ì´íŠ¸ 스위치 키입니다. ê°œë°œì„ ìœ„í•´ì„œë§Œ 사용ë©ë‹ˆë‹¤. \n"
+"참조 http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e"
+"3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2468,6 +2711,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"디버그 정보 표시 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2475,6 +2721,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"HUD 표시 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2482,6 +2731,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"채팅 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2489,6 +2741,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"안개 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid ""
@@ -2503,6 +2758,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"ì œí•œì—†ì´ ë³´ì—¬ì§€ëŠ” ë²”ìœ„ì— ëŒ€í•œ 스위치 키입니다.\n"
+"Http://irrlicht.sourceforge.net/docu/namespaceirr.html#"
+"a54da2a0e231901735e3da1b0edf72eb3 참조"
#: src/settings_translation_file.cpp
msgid "Key use for climbing/descending"
@@ -2510,11 +2768,11 @@ 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 "Lava Features"
@@ -2522,15 +2780,20 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Leaves style"
-msgstr ""
+msgstr "나뭇잎 스타ì¼"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Leaves style:\n"
"- Fancy: all faces visible\n"
"- 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"
@@ -2608,18 +2871,33 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Main menu game manager"
+msgid "Load the game profiler"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Main menu mod manager"
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Main menu script"
+msgid "Loading Block Modifiers"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Main menu game manager"
+msgstr "주 메뉴 게임 관리ìž"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu mod manager"
+msgstr "주 메뉴 모드 관리ìž"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu script"
+msgstr "주 메뉴 스í¬ë¦½íŠ¸"
+
+#: src/settings_translation_file.cpp
msgid ""
"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
msgstr ""
@@ -2640,8 +2918,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2651,8 +2927,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2663,8 +2937,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2674,8 +2946,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2683,7 +2953,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Map generation limit"
-msgstr ""
+msgstr "맵 ìƒì„± 제한"
#: src/settings_translation_file.cpp
msgid "Map save interval"
@@ -2987,11 +3257,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Massive cave depth"
-msgstr ""
+msgstr "거대한 ë™êµ´ 깊ì´"
#: src/settings_translation_file.cpp
msgid "Massive cave noise"
-msgstr ""
+msgstr "거대한 ë™êµ´ ìž¡ìŒ"
#: src/settings_translation_file.cpp
msgid "Massive caves form here."
@@ -3003,7 +3273,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Max block send distance"
-msgstr ""
+msgstr "최대 ë¸”ë¡ ì „ì†¡ 거리"
#: src/settings_translation_file.cpp
msgid "Max liquids processed per step."
@@ -3019,11 +3289,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum FPS"
-msgstr ""
+msgstr "최대 FPS"
#: src/settings_translation_file.cpp
msgid "Maximum FPS when game is paused."
-msgstr ""
+msgstr "최대 FPS는 ê²Œìž„ì´ ì¼ì‹œì •ì§€ë ë•Œ 나타납니다."
#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
@@ -3031,6 +3301,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum hotbar width"
+msgstr "최대 hotbar í­"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3075,17 +3353,25 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "ë¸”ë¡ ë‹¹ 최대 개체"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
+"현재 윈ë„ìš°ì˜ ìµœëŒ€ ë¶€ë¶„ì€ hotbar를 사용할 것입니다.\n"
+"hotbarì˜ ì˜¤ë¥¸ìª½ì´ë‚˜ ì™¼ìª½ì— ë¬´ì–¸ê°€ë¥¼ 나타낼 ë•Œ 유용합니다."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr ""
+#, fuzzy
+msgid "Maximum simultaneous block sends per client"
+msgstr "í´ë¼ì´ì–¸íŠ¸ 당 최대 ë™ì‹œ ë¸”ë¡ ì „ì†¡"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3094,19 +3380,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Maximum users"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
+msgstr "최대 사용ìž"
#: src/settings_translation_file.cpp
msgid "Menus"
-msgstr ""
+msgstr "메뉴"
#: src/settings_translation_file.cpp
msgid "Mesh cache"
-msgstr ""
+msgstr "메쉬 ìºì‹œ"
#: src/settings_translation_file.cpp
msgid "Message of the day"
@@ -3122,51 +3404,48 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Minimap"
-msgstr ""
+msgstr "미니맵"
#: src/settings_translation_file.cpp
msgid "Minimap key"
-msgstr ""
+msgstr "미니맵 키"
#: src/settings_translation_file.cpp
msgid "Minimap scan height"
-msgstr ""
+msgstr "미니맵 검색 높ì´"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Minimum texture size for filters"
-msgstr ""
+msgstr "í•„í„° 최소 í…스처 í¬ê¸°"
#: src/settings_translation_file.cpp
msgid "Mipmapping"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
+msgstr "밉매핑(Mipmapping)"
#: src/settings_translation_file.cpp
msgid "Modstore details URL"
-msgstr ""
+msgstr "Modstore ì •ë³´ URL"
#: src/settings_translation_file.cpp
msgid "Modstore download URL"
-msgstr ""
+msgstr "Modstore 다운로드 URL"
#: src/settings_translation_file.cpp
msgid "Modstore mods list URL"
-msgstr ""
+msgstr "Modstore 모드 리스트 URL"
#: src/settings_translation_file.cpp
msgid "Monospace font path"
-msgstr ""
+msgstr "ê³ ì • í­ ê¸€ê¼´ 경로"
#: src/settings_translation_file.cpp
msgid "Monospace font size"
-msgstr ""
+msgstr "ê³ ì • í­ ê¸€ê¼´ í¬ê¸°"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity"
-msgstr ""
+msgstr "마우스 ê°ë„"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity multiplier."
@@ -3185,10 +3464,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Name of map generator to be used when creating a new world.\n"
"Creating a world in the main menu will override this."
msgstr ""
+"맵 ìƒì„±ê¸°ì˜ ì´ë¦„ì€ ìƒˆë¡œìš´ 월드를 만들때 사용ë©ë‹ˆë‹¤.\n"
+"주 메뉴ì—ì„œ 새 월드를 만들면 ì´ê²ƒì€ ë¬´ì‹œë  ê²ƒìž…ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid ""
@@ -3200,11 +3482,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Name of the server, to be displayed when players join and in the serverlist."
-msgstr ""
+msgstr "서버ì´ë¦„ì€ í”Œë ˆì´ì–´ê°€ 서버 ë¦¬ìŠ¤íŠ¸ì— ë“¤ì–´ê°ˆ ë•Œ 나타납니다."
#: src/settings_translation_file.cpp
msgid "Network"
-msgstr ""
+msgstr "네트워í¬"
#: src/settings_translation_file.cpp
msgid ""
@@ -3214,23 +3496,23 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "New users need to input this password."
-msgstr ""
+msgstr "ì‹ ê·œ 사용ìžëŠ” 비밀번호를 입력하세요."
#: src/settings_translation_file.cpp
msgid "Noclip"
-msgstr ""
+msgstr "ìžìœ ì‹œì "
#: src/settings_translation_file.cpp
msgid "Noclip key"
-msgstr ""
+msgstr "ìžìœ ì‹œì  키"
#: src/settings_translation_file.cpp
msgid "Node highlighting"
-msgstr ""
+msgstr "Node ê°•ì¡°"
#: src/settings_translation_file.cpp
msgid "NodeTimer interval"
-msgstr ""
+msgstr "NodeTimer 간격"
#: src/settings_translation_file.cpp
msgid "Noise parameters for biome API temperature, humidity and biome blend."
@@ -3238,15 +3520,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Noises"
-msgstr ""
+msgstr "소리"
#: src/settings_translation_file.cpp
msgid "Normalmaps sampling"
-msgstr ""
+msgstr "Normalmaps 샘플ë§"
#: src/settings_translation_file.cpp
msgid "Normalmaps strength"
-msgstr ""
+msgstr "Normalmaps ê°•ë„"
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
@@ -3277,16 +3559,18 @@ msgid "Overall bias of parallax occlusion effect, usually scale/2."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Overall scale of parallax occlusion effect."
-msgstr ""
+msgstr "시차 êµí•© íš¨ê³¼ì˜ ì „ì²´ 규모"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion"
-msgstr ""
+msgstr "시차 êµí•©"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Parallax occlusion Scale"
-msgstr ""
+msgstr "시차 êµí•© 규모"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion bias"
@@ -3297,38 +3581,42 @@ msgid "Parallax occlusion iterations"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Parallax occlusion mode"
-msgstr ""
+msgstr "시차 êµí•© 모드"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Parallax occlusion strength"
-msgstr ""
+msgstr "시차 êµí•© ê°•ë„"
#: src/settings_translation_file.cpp
msgid "Path to TrueTypeFont or bitmap."
-msgstr ""
+msgstr "TrueTypeFont ë˜ëŠ” ë¹„íŠ¸ë§µì˜ ê²½ë¡œìž…ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "Path to save screenshots at."
-msgstr ""
+msgstr "스í¬ë¦°ìƒ· 저장 경로입니다."
#: src/settings_translation_file.cpp
msgid "Path to texture directory. All textures are first searched from here."
-msgstr ""
+msgstr "í…스처 디렉터리 경로입니다. 모든 í…스처는 여기ì—ì„œ 먼저 검색 ë©ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "Physics"
-msgstr ""
+msgstr "물리학"
#: src/settings_translation_file.cpp
msgid ""
"Player is able to fly without being affected by gravity.\n"
"This requires the \"fly\" privilege on the server."
msgstr ""
+"플레ì´ì–´ëŠ” ì¤‘ë ¥ì— ì˜í•´ ì˜í–¥ì„ 받지 ì•Šê³  ë‚  수 있습니다.\n"
+"서버ì—ì„œ \"비행\" ê¶Œí•œì´ í•„ìš”ë¡œ 합니다."
#: src/settings_translation_file.cpp
msgid "Player name"
-msgstr ""
+msgstr "플레ì´ì–´ ì´ë¦„"
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
@@ -3336,16 +3624,26 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Player versus Player"
-msgstr ""
+msgstr "PVP"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
msgstr ""
+"(UDP)ì— ì—°ê²° 하는 í¬íŠ¸.\n"
+"참고 주 ë©”ë‰´ì˜ í¬íŠ¸ 필트는 ì´ ì„¤ì •ìœ¼ë¡œ ìž¬ì •ì˜ ë©ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Prevent mods from doing insecure things like running shell commands."
+msgstr "shell 명령어 실행 ê°™ì€ ì•ˆì „ 하지 ì•Šì€ ê²ƒìœ¼ë¡œë¶€í„° 모드를 보호합니다."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
msgstr ""
#: src/settings_translation_file.cpp
@@ -3353,16 +3651,17 @@ msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
+msgid "Profiler"
+msgstr "프로파ì¼ëŸ¬"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
-msgstr ""
+msgstr "프로파ì¼ëŸ¬ 토글 키"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
+#, fuzzy
+msgid "Profiling"
+msgstr "프로 파ì¼ë§"
#: src/settings_translation_file.cpp
msgid ""
@@ -3372,68 +3671,78 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Raises terrain to make valleys around the rivers"
-msgstr ""
+msgstr "ê°• ì£¼ë³€ì— ê³„ê³¡ì„ ë§Œë“¤ê¸° 위해 ì§€í˜•ì„ ì˜¬ë¦½ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Random input"
-msgstr ""
+msgstr "ìž„ì˜ ìž…ë ¥"
#: src/settings_translation_file.cpp
msgid "Range select key"
-msgstr ""
+msgstr "범위 ì„ íƒ í‚¤"
#: src/settings_translation_file.cpp
msgid "Remote media"
-msgstr ""
+msgstr "ì›ê²© 미디어"
#: src/settings_translation_file.cpp
msgid "Remote port"
-msgstr ""
+msgstr "ì›ê²© í¬íŠ¸"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Replaces the default main menu with a custom one."
-msgstr ""
+msgstr "기본 주 메뉴를 커스텀 메뉴로 바꿉니다."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "보고서 경로"
#: src/settings_translation_file.cpp
msgid "Right key"
-msgstr ""
+msgstr "오른쪽 키"
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
-msgstr ""
+msgstr "오른쪽 í´ë¦­ 반복 간격"
#: src/settings_translation_file.cpp
msgid "River Depth"
-msgstr ""
+msgstr "ê°• 깊ì´"
#: src/settings_translation_file.cpp
msgid "River Noise"
-msgstr ""
+msgstr "강 소리"
#: src/settings_translation_file.cpp
msgid "River Size"
-msgstr ""
+msgstr "ê°• í¬ê¸°"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
-msgstr ""
+msgstr "ê°• 소리 -- ê°•ì´ 0ì— ê°€ê¹Œìš¸ ë•Œ ë°œìƒ"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Rollback recording"
-msgstr ""
+msgstr "롤백 레코딩"
#: src/settings_translation_file.cpp
msgid "Round minimap"
-msgstr ""
+msgstr "ì›í˜• 미니맵"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "디스í¬ì— í´ë¼ì´ì–¸íŠ¸ì—ì„œ ë°›ì€ ë§µì„ ì €ìž¥ 합니다."
#: src/settings_translation_file.cpp
msgid "Saving map received from server"
-msgstr ""
+msgstr "서버로부터 ë°›ì€ ë§µì„ ì €ìž¥"
#: src/settings_translation_file.cpp
msgid ""
@@ -3446,27 +3755,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Screen height"
-msgstr ""
+msgstr "화면 높ì´"
#: src/settings_translation_file.cpp
msgid "Screen width"
-msgstr ""
+msgstr "화면 너비"
#: src/settings_translation_file.cpp
msgid "Screenshot"
-msgstr ""
+msgstr "스í¬ë¦°ìƒ·"
#: src/settings_translation_file.cpp
msgid "Screenshot folder"
-msgstr ""
+msgstr "스í¬ë¦°ìƒ· í´ë”"
#: src/settings_translation_file.cpp
msgid "Screenshot format"
-msgstr ""
+msgstr "화면 캡처 형ì‹"
#: src/settings_translation_file.cpp
msgid "Screenshot quality"
-msgstr ""
+msgstr "스í¬ë¦°ìƒ· 품질"
#: src/settings_translation_file.cpp
msgid ""
@@ -3474,105 +3783,120 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"화면 캡처 품질입니다. JPEG 형ì‹ì—만 사용.\n"
+"1ì€ ìµœì•…ì˜ í’ˆì§ˆ; 100ì€ ìµœê³ ì˜ í’ˆì§ˆì„ ì˜ë¯¸í•©ë‹ˆë‹¤.\n"
+"기본 í’ˆì§ˆì€ 0ì„ ì‚¬ìš© 합니다."
#: src/settings_translation_file.cpp
msgid "Security"
-msgstr ""
+msgstr "보안"
#: src/settings_translation_file.cpp
msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Http://www.sqlite.org/pragma.html#pragma_synchronous 참조"
#: src/settings_translation_file.cpp
msgid "Selection box border color (R,G,B)."
-msgstr ""
+msgstr "ì„ íƒ ë°•ìŠ¤ í…Œë‘리 색 (빨, ì´ˆ, 파)."
#: src/settings_translation_file.cpp
msgid "Selection box color"
-msgstr ""
+msgstr "ì„ íƒ ë°•ìŠ¤ 컬러"
#: src/settings_translation_file.cpp
msgid "Selection box width"
-msgstr ""
+msgstr "ì„ íƒ ë°•ìŠ¤ 너비"
#: src/settings_translation_file.cpp
msgid "Server / Singleplayer"
-msgstr ""
+msgstr "서버 / 싱글 플레ì´ì–´"
#: src/settings_translation_file.cpp
msgid "Server URL"
-msgstr ""
+msgstr "서버 URL"
#: src/settings_translation_file.cpp
msgid "Server address"
-msgstr ""
+msgstr "서버 주소"
#: src/settings_translation_file.cpp
msgid "Server description"
-msgstr ""
+msgstr "서버 설명"
#: src/settings_translation_file.cpp
msgid "Server name"
-msgstr ""
+msgstr "서버 ì´ë¦„"
#: src/settings_translation_file.cpp
msgid "Server port"
-msgstr ""
+msgstr "서버 í¬íŠ¸"
#: src/settings_translation_file.cpp
msgid "Serverlist URL"
-msgstr ""
+msgstr "서버리스트 URL"
#: src/settings_translation_file.cpp
msgid "Serverlist file"
-msgstr ""
+msgstr "서버리스트 파ì¼"
#: src/settings_translation_file.cpp
msgid ""
"Set the language. Leave empty to use the system language.\n"
"A restart is required after changing this."
msgstr ""
+"언어 설정. 시스템 언어를 사용하려면 비워ë‘세요.\n"
+"설정 ì ìš© 후 ìž¬ì‹œìž‘ì´ í•„ìš”í•©ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
+"Trueë¡œ 설정하면 í”들리는 나뭇잎 효과가 ì ìš©ë©ë‹ˆë‹¤.\n"
+"ì‰ì´ë”를 활성화 해야 합니다."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving plants.\n"
"Requires shaders to be enabled."
msgstr ""
+"Trueë¡œ 설정하면 í”들리는 ì‹ë¬¼ 효과가 ì ìš©ë©ë‹ˆë‹¤.\n"
+"ì‰ì´ë”를 활성화 해야 합니다."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving water.\n"
"Requires shaders to be enabled."
msgstr ""
+"Trueë¡œ 설정하면 물결효과가 ì ìš©ë©ë‹ˆë‹¤.\n"
+"ì‰ì´ë”를 활성화해야 합니다.."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
+"ì‰ì´ë”는 í™•ìž¥ëœ ì‹œê° íš¨ê³¼ë¥¼ 제공합니다 그래서 비디오 ì¹´ë“œì˜ ì„±ëŠ¥ì´ ì¦ê°€ë  것입니다.\n"
+"Thy only work with the OpenGL video backend."
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "미니맵 모양. 활성화 = ì›í˜•, 비활성화 = 정사ê°í˜•."
#: src/settings_translation_file.cpp
msgid "Show debug info"
-msgstr ""
+msgstr "디버그 정보 보기"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Show entity selection boxes"
-msgstr ""
+msgstr "개체 ì„ íƒ ìƒìž 보기"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
-msgstr ""
+msgstr "서버닫힘 메시지"
#: src/settings_translation_file.cpp
msgid ""
@@ -3581,34 +3905,38 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Slope and fill work together to modify the heights"
-msgstr ""
+msgstr "ë†’ì´ ìˆ˜ì •ì„ ìœ„í•´ 기울기와 채우기를 함께 작용합니다"
#: src/settings_translation_file.cpp
msgid "Smooth lighting"
-msgstr ""
+msgstr "부드러운 조명효과"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
+"주위를 ëŒì•„ë³¼ ë•Œ ì¹´ë©”ë¼ë¥¼ 부드럽게 í•´ì¤ë‹ˆë‹¤. 보기 ë˜ëŠ” 부드러운 마우스ë¼ê³ ë„ 합니다.\n"
+"비디오를 ë…¹í™”í•˜ê¸°ì— ìœ ìš©í•©ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
-msgstr ""
+msgstr "시네마틱 모드ì—ì„œ ì¹´ë©”ë¼ì˜ íšŒì „ì„ ë§¤ë„럽게 만듭니다. 사용 하지 않으려면 0입니다."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "ì¹´ë©”ë¼ì˜ íšŒì „ì„ ë§¤ë„럽게 만듭니다. 사용 하지 않으려면 0입니다."
#: src/settings_translation_file.cpp
msgid "Sneak key"
-msgstr ""
+msgstr "살금살금걷기 키"
#: src/settings_translation_file.cpp
msgid "Sound"
-msgstr ""
+msgstr "사운드"
#: src/settings_translation_file.cpp
msgid ""
@@ -3620,7 +3948,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Static spawnpoint"
-msgstr ""
+msgstr "ê³ ì •ëœ ìŠ¤í°í¬ì¸íŠ¸"
#: src/settings_translation_file.cpp
msgid "Strength of generated normalmaps."
@@ -3632,7 +3960,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Strict protocol checking"
-msgstr ""
+msgstr "엄격한 프로토콜 검사"
#: src/settings_translation_file.cpp
msgid "Support older servers"
@@ -3644,7 +3972,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Terrain Height"
-msgstr ""
+msgstr "지형 높ì´"
#: src/settings_translation_file.cpp
msgid ""
@@ -3662,14 +3990,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Texture path"
-msgstr ""
+msgstr "í…스처 경로"
#: src/settings_translation_file.cpp
msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "The depth of dirt or other filler"
+msgstr "í™ì´ë‚˜ 다른 ê²ƒì˜ ê¹Šì´"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3688,6 +4029,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3703,13 +4050,19 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
#: src/settings_translation_file.cpp
msgid "This font will be used for certain languages."
-msgstr ""
+msgstr "ì´ ê¸€ê¼´ì€ íŠ¹ì • ì–¸ì–´ì— ì‚¬ìš© ë©ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "Time in between active block management cycles"
@@ -3722,36 +4075,43 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Time send interval"
-msgstr ""
+msgstr "시간 전송 간격"
#: src/settings_translation_file.cpp
msgid "Time speed"
-msgstr ""
+msgstr "시간 ì†ë„"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Timeout for client to remove unused map data from memory."
-msgstr ""
+msgstr "메모리ì—ì„œ 사용 하지 않는 맵 ë°ì´í„°ë¥¼ 제거하기 위해 í´ë¼ì´ì–¸íŠ¸ì— 대한 시간 제한입니다."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"To reduce lag, block transfers are slowed down when a player is building "
"something.\n"
"This determines how long they are slowed down after placing or removing a "
"node."
msgstr ""
+"플레ì´ì–´ê°€ ë¬´ì—‡ì„ ê±´ì„¤í•  ë•Œ 딜레ì´ë¥¼ 줄ì´ê¸° 위해 블럭 ì „ì†¡ì´ ëŠë ¤ì§‘니다.\n"
+"ì´ê²ƒì€ nodeê°€ 배치ë˜ê±°ë‚˜ ì œê±°ëœ í›„ 얼마나 오래 ëŠë ¤ì§€ëŠ”지를 결정합니다."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Toggle camera mode key"
-msgstr ""
+msgstr "ì¹´ë©”ë¼ëª¨ë“œ 스위치 키"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Tooltip delay"
-msgstr ""
+msgstr "ë„구 설명 지연"
#: src/settings_translation_file.cpp
msgid "Trilinear filtering"
-msgstr ""
+msgstr "삼중 선형 í•„í„°ë§"
#: src/settings_translation_file.cpp
msgid ""
@@ -3759,58 +4119,60 @@ msgid ""
"False = 128\n"
"Useable to make minimap smoother on slower machines."
msgstr ""
+"True = 256 \n"
+"False = 128 \n"
+"ëŠë¦° 컴퓨터ì—ì„œ ë¯¸ë‹ˆë§µì„ ë¶€ë“œëŸ½ê²Œ 만들어ì¤ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
msgid "Trusted mods"
-msgstr ""
+msgstr "신뢰할 수 있는 모드"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "멀티 íƒ­ì— í‘œì‹œ ëœ ì„œë²„ ëª©ë¡ URL입니다."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Unlimited player transfer distance"
-msgstr ""
+msgstr "무제한 플레ì´ì–´ 전송 거리"
#: src/settings_translation_file.cpp
msgid "Unload unused server data"
-msgstr ""
+msgstr "사용하지 ì•Šì€ ì„œë²„ ë°ì´í„° ì‚­ì œ"
#: src/settings_translation_file.cpp
msgid "Use 3D cloud look instead of flat."
-msgstr ""
+msgstr "í‰í‰í•˜ê²Œ 보는 ëŒ€ì‹ ì— 3D 구름 효과를 사용합니다."
#: src/settings_translation_file.cpp
msgid "Use a cloud animation for the main menu background."
-msgstr ""
+msgstr "주 메뉴 ë°°ê²½ì— êµ¬ë¦„ 애니메ì´ì…˜ì„ 사용 합니다."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr ""
+msgstr "ê°ë„ì— ë”°ë¼ í…스처를 ë³¼ ë•Œ ì´ë°©ì„± í•„í„°ë§ì„ 사용 합니다."
#: src/settings_translation_file.cpp
msgid "Use bilinear filtering when scaling textures."
-msgstr ""
+msgstr "ì´ì¤‘ 선형 í•„í„°ë§ì€ ì§ˆê° ìŠ¤ì¼€ì¼ë§ì„ í•  ë•Œ 사용 합니다."
#: src/settings_translation_file.cpp
msgid "Use key"
-msgstr ""
+msgstr "키 사용"
#: src/settings_translation_file.cpp
msgid "Use mip mapping to scale textures. May slightly increase performance."
-msgstr ""
+msgstr "í…스ì³ë¥¼ í¬ê²Œí•˜ê¸° 위해 mip mappingì„ ì‚¬ìš© 합니다. ì„±ëŠ¥ì´ ì•½ê°„ ì¦ê°€í• ê²ë‹ˆë‹¤."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Use trilinear filtering when scaling textures."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
+msgstr "삼중 선형 í•„í„°ë§ì€ ì§ˆê° ìŠ¤ì¼€ì¼ë§ì„ í•  ë•Œ 사용 합니다."
#: src/settings_translation_file.cpp
msgid "V-Sync"
-msgstr ""
+msgstr "수ì§ë™ê¸°í™” V-Sync"
#: src/settings_translation_file.cpp
msgid "VBO"
@@ -3818,57 +4180,64 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Valley Depth"
-msgstr ""
+msgstr "계곡 깊ì´"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Valley Fill"
-msgstr ""
+msgstr "계곡 채우기"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Valley Profile"
-msgstr ""
+msgstr "계곡 측면"
#: src/settings_translation_file.cpp
msgid "Valley Slope"
-msgstr ""
+msgstr "계곡 경사"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Valleys C Flags"
-msgstr ""
+msgstr "계곡 C 플래그"
#: src/settings_translation_file.cpp
msgid "Vertical screen synchronization."
-msgstr ""
+msgstr "세로 화면 ë™ê¸°í™”."
#: src/settings_translation_file.cpp
msgid "Video driver"
-msgstr ""
+msgstr "비디오 ë“œë¼ì´ë²„"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "View bobbing"
-msgstr ""
+msgstr "보기 만료"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"View distance in nodes.\n"
"Min = 20"
msgstr ""
+"nodeì˜ ë³´ì—¬ì§€ëŠ” 거리\n"
+"최소 = 20"
#: src/settings_translation_file.cpp
msgid "View range decrease key"
-msgstr ""
+msgstr "보여지는 범위 ê°ì†Œ 키"
#: src/settings_translation_file.cpp
msgid "View range increase key"
-msgstr ""
+msgstr "보여지는 범위 ì¦ê°€ 키"
#: src/settings_translation_file.cpp
msgid "Viewing range"
-msgstr ""
+msgstr "보여지는 범위"
#: src/settings_translation_file.cpp
msgid "Volume"
-msgstr ""
+msgstr "볼륨"
#: src/settings_translation_file.cpp
msgid ""
@@ -3880,64 +4249,69 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Walking speed"
-msgstr ""
+msgstr "빠르게 걷기"
#: src/settings_translation_file.cpp
msgid "Water Features"
-msgstr ""
+msgstr "물 특징"
#: src/settings_translation_file.cpp
msgid "Water level"
-msgstr ""
+msgstr "ë¬¼ì˜ ë†’ì´"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
-msgstr ""
+msgstr "ì›”ë“œì˜ ë¬¼ 표면 높ì´."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Waving Nodes"
-msgstr ""
+msgstr "움ì§ì´ëŠ” Node"
#: src/settings_translation_file.cpp
msgid "Waving leaves"
-msgstr ""
+msgstr "í”들리는 나뭇잎 효과"
#: src/settings_translation_file.cpp
msgid "Waving plants"
-msgstr ""
+msgstr "í”들리는 ì‹ë¬¼ 효과"
#: src/settings_translation_file.cpp
msgid "Waving water"
-msgstr ""
+msgstr "물결 효과"
#: src/settings_translation_file.cpp
msgid "Waving water height"
-msgstr ""
+msgstr "물결 높ì´"
#: src/settings_translation_file.cpp
msgid "Waving water length"
-msgstr ""
+msgstr "물결 길ì´"
#: src/settings_translation_file.cpp
msgid "Waving water speed"
-msgstr ""
+msgstr "물결 ì†ë„"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"When gui_scaling_filter is true, all GUI images need to be\n"
"filtered in software, but some images are generated directly\n"
"to hardware (e.g. render-to-texture for nodes in inventory)."
msgstr ""
+"Gui_scaling_filterì´ true ì´ë©´ 모든 GUI ì´ë¯¸ì§€ 소프트웨어ì—ì„œ í•„í„°ë§ ë  í•„ìš”ê°€ 있습니다. 하지만 ì¼ë¶€ ì´ë¯¸ì§€ëŠ” "
+"바로 í•˜ë“œì›¨ì–´ì— ìƒì„±ë©ë‹ˆë‹¤. (e.g. render-to-texture for nodes in inventory)."
#: src/settings_translation_file.cpp
msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
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"
@@ -3947,6 +4321,12 @@ msgid ""
"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n"
"enabled."
msgstr ""
+"ì´ì¤‘선형/삼중선형/ì´ë°©ì„± 필터를 사용할 ë•Œ 저해ìƒë„ íƒìŠ¤ì³ëŠ” í¬ë¯¸í•˜ê²Œ ë³´ì¼ ìˆ˜ 있습니다.so automatically upscale "
+"them with nearest-neighbor interpolation to preserve crisp pixels. This sets "
+"the minimum texture size for the upscaled textures; ê°’ì´ ë†’ì„ìˆ˜ë¡ ì„ ëª…í•˜ê²Œ 보입니다. 하지만 "
+"ë§Žì€ ë©”ëª¨ë¦¬ê°€ 필요합니다. Powers of 2 are recommended. Setting this higher than 1 may "
+"not have a visible effect unless bilinear/trilinear/anisotropic filtering is "
+"enabled."
#: src/settings_translation_file.cpp
msgid ""
@@ -4001,18 +4381,23 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Width component of the initial window size."
-msgstr ""
+msgstr "í­ì€ 초기 ì°½ í¬ê¸°ë¡œ 구성ë˜ì–´ 있습니다."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Width of the selectionbox's lines around nodes."
msgstr ""
+"node 주위 “selectionbox'†or (if UTF-8 supported) “selectionbox’†ë¼ì¸ì˜ 너비입니다."
#: src/settings_translation_file.cpp
msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
+"월드 디렉토리 (ì›”ë“œì˜ ëª¨ë“  ê²ƒì€ ì—¬ê¸°ì— ì €ìž¥ë©ë‹ˆë‹¤).\n"
+"주 메뉴ì—ì„œ 시작 하는 경우 í•„ìš” 하지 않습니다."
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
diff --git a/po/ky/minetest.po b/po/ky/minetest.po
index 01a5910be..72c729f8d 100644
--- a/po/ky/minetest.po
+++ b/po/ky/minetest.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: 2013-06-01 18:09+0200\n"
"Last-Translator: Chynggyz Jumaliev <translatorky@lavabit.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -626,6 +626,11 @@ msgid "Particles"
msgstr "Баарын күйгүзүү"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Бир кишилик"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "ЫраÑтоолор"
@@ -1005,6 +1010,10 @@ msgstr ""
msgid "Use"
msgstr "Колдонуу"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "МаÑштаб"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "баÑкычты баÑыңыз"
@@ -1321,10 +1330,6 @@ msgstr ""
msgid "X Button 2"
msgstr ""
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "МаÑштаб"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1392,6 +1397,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1467,6 +1476,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "Ðртка"
@@ -1503,6 +1516,10 @@ msgid "Build inside player"
msgstr "Көп кишилик"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bumpmapping"
msgstr "Mip-текÑтуралоо"
@@ -1546,6 +1563,11 @@ msgid "Chat toggle key"
msgstr "БаÑкычтарды өзгөртүү"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команда"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1622,14 +1644,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1785,6 +1807,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1801,6 +1827,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1831,14 +1861,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1851,6 +1873,18 @@ msgid "Disable anticheat"
msgstr "Бөлүкчөлөрдү күйгүзүү"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
@@ -1875,6 +1909,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Баарын күйгүзүү"
@@ -1960,6 +1998,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2020,11 +2066,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2160,12 +2216,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2196,6 +2254,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2224,15 +2291,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2327,6 +2385,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2362,6 +2454,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2522,6 +2622,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2557,7 +2664,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2709,6 +2816,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2743,8 +2865,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2754,8 +2874,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2766,8 +2884,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2777,8 +2893,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3137,6 +3251,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3178,17 +3300,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3200,10 +3326,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Меню"
@@ -3246,10 +3368,6 @@ msgid "Mipmapping"
msgstr "Mip-текÑтуралоо"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3454,11 +3572,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3466,7 +3590,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3502,6 +3626,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Report path"
+msgstr "Тандоо"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Right key"
msgstr "Оң меню"
@@ -3665,7 +3794,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3703,7 +3832,7 @@ msgstr "Тегиз жарык"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3783,10 +3912,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3802,6 +3943,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3817,6 +3964,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3921,10 +4074,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4053,7 +4202,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4154,54 +4303,28 @@ msgid "cURL timeout"
msgstr ""
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Жүктөлүүдө..."
+#~ msgid "Public Serverlist"
+#~ msgstr "Жалпылык Ñерверлердин тизмеÑи:"
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Ылдый"
-
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Сол баÑкычы: Бардык буюмдарды ташуу, Оң баÑкычы: Бир буюмду ташуу"
-
-#~ msgid "is required by:"
-#~ msgstr "талап кылынганы:"
-
-#~ msgid "Configuration saved. "
-#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñакталды. "
-
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "ЭÑкертүү: Туура ÑÐ¼ÐµÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ. "
-
-#~ msgid "Show Public"
-#~ msgstr "Жалпылыкты көрÑÓ©Ñ‚Ò¯Ò¯"
-
-#~ msgid "Show Favorites"
-#~ msgstr "Тандалмаларды көрÑÓ©Ñ‚Ò¯Ò¯"
-
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Жергиликтүү Ñерверди жүргүзүү үчүн даректи бош калтырыңыз."
-
-#~ msgid "Create world"
-#~ msgstr "Дүйнөнү жаратуу"
-
-#~ msgid "Address required."
-#~ msgstr "Дареги талап кылынат."
-
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Дүнөнү жаратуу мүмкүн ÑмеÑ: Эч нерÑе тандалган жок"
+#~ msgid "If disabled "
+#~ msgstr "Баарын өчүрүү"
-#~ msgid "Files to be deleted"
-#~ msgstr "Өчүрүлө турган файлдар"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "күйгүзүлгөн"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Дүйнөнү жаратуу мүмкүн ÑмеÑ: Оюндар табылган жок"
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Оюн"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Дүйнөнү ыраÑтоо мүмкүн ÑмеÑ: Эч нерÑе тандалган жок"
+#, fuzzy
+#~ msgid "Password"
+#~ msgstr "ЭÑки ÑÑ‹Ñ€Ñөз"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Бардык дүйнө файлдарын өчүрүү оңунан чыккан жок"
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Чектүү Ñуюктук"
#~ msgid ""
#~ "Default Controls:\n"
@@ -4228,26 +4351,52 @@ msgstr ""
#~ "- ESC: бул меню\n"
#~ "- T: маек\n"
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Чектүү Ñуюктук"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Бардык дүйнө файлдарын өчүрүү оңунан чыккан жок"
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "ЭÑки ÑÑ‹Ñ€Ñөз"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Дүйнөнү ыраÑтоо мүмкүн ÑмеÑ: Эч нерÑе тандалган жок"
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Оюн"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Дүйнөнү жаратуу мүмкүн ÑмеÑ: Оюндар табылган жок"
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "күйгүзүлгөн"
+#~ msgid "Files to be deleted"
+#~ msgstr "Өчүрүлө турган файлдар"
+
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Дүнөнү жаратуу мүмкүн ÑмеÑ: Эч нерÑе тандалган жок"
+
+#~ msgid "Address required."
+#~ msgstr "Дареги талап кылынат."
+
+#~ msgid "Create world"
+#~ msgstr "Дүйнөнү жаратуу"
+
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Жергиликтүү Ñерверди жүргүзүү үчүн даректи бош калтырыңыз."
+
+#~ msgid "Show Favorites"
+#~ msgstr "Тандалмаларды көрÑÓ©Ñ‚Ò¯Ò¯"
+
+#~ msgid "Show Public"
+#~ msgstr "Жалпылыкты көрÑÓ©Ñ‚Ò¯Ò¯"
+
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "ЭÑкертүү: Туура ÑÐ¼ÐµÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ. "
+
+#~ msgid "Configuration saved. "
+#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñакталды. "
+
+#~ msgid "is required by:"
+#~ msgstr "талап кылынганы:"
+
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Сол баÑкычы: Бардык буюмдарды ташуу, Оң баÑкычы: Бир буюмду ташуу"
#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Баарын өчүрүү"
+#~ msgid "Downloading"
+#~ msgstr "Ылдый"
#, fuzzy
-#~ msgid "Public Serverlist"
-#~ msgstr "Жалпылык Ñерверлердин тизмеÑи:"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Жүктөлүүдө..."
diff --git a/po/lt/minetest.po b/po/lt/minetest.po
index 9818d29d0..ed31a75c8 100644
--- a/po/lt/minetest.po
+++ b/po/lt/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-11-19 05:14+0000\n"
-"Last-Translator: Liudas Ališauskas <liudas@akmc.lt>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-10 20:29+0000\n"
+"Last-Translator: Zygi Mantus <zygimantus@gmail.com>\n"
"Language-Team: Lithuanian <https://hosted.weblate.org/projects/minetest/"
"minetest/lt/>\n"
"Language: lt\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
"%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.5-dev\n"
+"X-Generator: Weblate 2.10-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -68,7 +68,7 @@ msgstr ""
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr ""
+msgstr "Mes palaikome tik $1 protokolo versijÄ…."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
@@ -219,7 +219,7 @@ msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
-msgstr ""
+msgstr "Naršyti"
#: builtin/mainmenu/dlg_settings_advanced.lua
#, fuzzy
@@ -610,6 +610,11 @@ msgid "Particles"
msgstr "Įjungti visus"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Atstatyti vieno žaidėjo pasaulį"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Nustatymai"
@@ -987,6 +992,10 @@ msgstr "Įjungti noclip"
msgid "Use"
msgstr "Naudoti"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Pritraukti"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "paspauskite klavišą"
@@ -1303,10 +1312,6 @@ msgstr "X mygtukas 1"
msgid "X Button 2"
msgstr "X mygtukas 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Pritraukti"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1374,6 +1379,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1448,6 +1457,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "Atgal"
@@ -1482,6 +1495,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr ""
@@ -1524,6 +1541,11 @@ msgid "Chat toggle key"
msgstr "Nustatyti klavišus"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Komanda"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1600,14 +1622,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1762,6 +1784,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1778,6 +1804,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1808,22 +1838,26 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1851,6 +1885,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Įjungti papildinį"
@@ -1937,6 +1975,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1997,11 +2043,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2136,12 +2192,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2173,6 +2231,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2201,15 +2268,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2304,6 +2362,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2339,6 +2431,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2499,6 +2599,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2534,7 +2641,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2686,6 +2793,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2720,8 +2842,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2731,8 +2851,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2743,8 +2861,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2754,8 +2870,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3118,6 +3232,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3159,17 +3281,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3181,10 +3307,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Meniu"
@@ -3226,10 +3348,6 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3434,11 +3552,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3446,7 +3570,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3481,6 +3605,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Right key"
msgstr "Dešinėn"
@@ -3647,7 +3775,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3685,7 +3813,7 @@ msgstr "Apšvietimo efektai"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3765,10 +3893,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3784,6 +3924,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3799,6 +3945,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3902,11 +4054,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Pagrindiniai kūrėjai"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4033,7 +4180,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4134,65 +4281,69 @@ msgid "cURL timeout"
msgstr ""
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Įkeliama..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Pagrindiniai kūrėjai"
-#~ msgid "Add mod:"
-#~ msgstr "Pridėti papildinį:"
+#~ msgid "No of course not!"
+#~ msgstr "Ne, tikrai ne!"
-#~ msgid "MODS"
-#~ msgstr "PAPILDINIAI"
+#~ msgid "Public Serverlist"
+#~ msgstr "Viešų serverių sąrašas"
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "VIENAS ŽAIDĖJAS"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Išjungti papildinį"
-#~ msgid "SETTINGS"
-#~ msgstr "NUSTATYMAI"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "įjungtas"
-#~ msgid "Password"
-#~ msgstr "Slaptažodis"
+#~ msgid "Game Name"
+#~ msgstr "Žaidimo pavadinimas"
-#~ msgid "Name"
-#~ msgstr "Vardas"
+#~ msgid "GAMES"
+#~ msgstr "ŽAIDIMAI"
-#~ msgid "START SERVER"
-#~ msgstr "PALEISTI SERVERÄ®"
+#~ msgid "Mods:"
+#~ msgstr "Papildiniai:"
-#~ msgid "CLIENT"
-#~ msgstr "ŽAISTI TINKLE"
+#~ msgid "new game"
+#~ msgstr "naujas žaidimas"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Pridėti papildinį"
+#, fuzzy
+#~ msgid "EDIT GAME"
+#~ msgstr "KEISTI ŽAIDIMĄ"
#~ msgid "Remove selected mod"
#~ msgstr "Pašalinti pasirinktą papildinį"
-#, fuzzy
-#~ msgid "EDIT GAME"
-#~ msgstr "KEISTI ŽAIDIMĄ"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Pridėti papildinį"
-#~ msgid "new game"
-#~ msgstr "naujas žaidimas"
+#~ msgid "CLIENT"
+#~ msgstr "ŽAISTI TINKLE"
-#~ msgid "Mods:"
-#~ msgstr "Papildiniai:"
+#~ msgid "START SERVER"
+#~ msgstr "PALEISTI SERVERÄ®"
-#~ msgid "GAMES"
-#~ msgstr "ŽAIDIMAI"
+#~ msgid "Name"
+#~ msgstr "Vardas"
-#~ msgid "Game Name"
-#~ msgstr "Žaidimo pavadinimas"
+#~ msgid "Password"
+#~ msgstr "Slaptažodis"
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "įjungtas"
+#~ msgid "SETTINGS"
+#~ msgstr "NUSTATYMAI"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Išjungti papildinį"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "VIENAS ŽAIDĖJAS"
-#~ msgid "Public Serverlist"
-#~ msgstr "Viešų serverių sąrašas"
+#~ msgid "MODS"
+#~ msgstr "PAPILDINIAI"
-#~ msgid "No of course not!"
-#~ msgstr "Ne, tikrai ne!"
+#~ msgid "Add mod:"
+#~ msgstr "Pridėti papildinį:"
+
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Įkeliama..."
diff --git a/po/minetest.pot b/po/minetest.pot
index ed014c01f..46a74b448 100644
--- a/po/minetest.pot
+++ b/po/minetest.pot
@@ -1,6 +1,6 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the minetest package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -589,6 +589,10 @@ msgid "Shaders"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
msgstr ""
@@ -937,6 +941,10 @@ msgstr ""
msgid "Print stacks"
msgstr ""
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
#: src/guiPasswordChange.cpp
msgid "Old Password"
msgstr ""
@@ -1249,10 +1257,6 @@ msgstr ""
msgid "PA1"
msgstr ""
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
#: src/settings_translation_file.cpp
msgid "Controls"
msgstr ""
@@ -1305,7 +1309,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -1396,6 +1400,30 @@ msgid "Continuous forward movement (only used for testing)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Forward key"
msgstr ""
@@ -1563,6 +1591,17 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Cinematic mode key"
msgstr ""
@@ -1645,7 +1684,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -1948,7 +1987,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -2180,6 +2219,16 @@ msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Gamma"
msgstr ""
@@ -2435,7 +2484,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -2634,6 +2683,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Server port"
msgstr ""
@@ -2688,20 +2749,23 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
+msgid "Maximum number of blocks that are simultaneously sent per client."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3032,30 +3096,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Max. clearobjects extra blocks"
msgstr ""
@@ -3077,7 +3117,7 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
+msgid "Maximum objects per block"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3214,8 +3254,6 @@ msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3345,8 +3383,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3422,8 +3458,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3489,8 +3523,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3736,8 +3768,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3911,11 +3941,117 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Profiling"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Client and Server"
msgstr ""
@@ -4030,3 +4166,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
diff --git a/po/nb/minetest.po b/po/nb/minetest.po
index 7ae1156e2..990783744 100644
--- a/po/nb/minetest.po
+++ b/po/nb/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2015-09-20 17:15+0200\n"
-"Last-Translator: Christian Haug <christian@metaboks.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-25 21:41+0000\n"
+"Last-Translator: Petter Reinholdtsen <pere-weblate@hungry.com>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
"minetest/minetest/nb/>\n"
"Language: nb\n"
@@ -17,19 +17,19 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.4-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
+msgstr "Det skjedde en feil i et Lua-skript, f.eks. en mod:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
-msgstr ""
+msgstr "Det skjedde en feil:"
#: builtin/fstk/ui.lua
msgid "Main menu"
-msgstr ""
+msgstr "Hovedmeny"
#: builtin/fstk/ui.lua builtin/mainmenu/store.lua
msgid "Ok"
@@ -37,27 +37,27 @@ msgstr "Ok"
#: builtin/fstk/ui.lua
msgid "Reconnect"
-msgstr ""
+msgstr "Koble til på nytt"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr ""
+msgstr "Tjeneren har bedt om ny tilkobling:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
-msgstr ""
+msgstr "Laster..."
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
-msgstr ""
+msgstr "Avvikende protokollversjon. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr ""
+msgstr "Tjener krever protokollversjon $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr ""
+msgstr "Tjener støtter protokollversjoner mellom $1 og $2. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
@@ -65,11 +65,11 @@ msgstr ""
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr ""
+msgstr "Vi støtter kun protokollversjon $1."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
-msgstr ""
+msgstr "Vi støtter protokollversjoner mellom versjon $1 og $2."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -80,43 +80,40 @@ msgid "Cancel"
msgstr "Avbryt"
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
-#, fuzzy
msgid "Depends:"
-msgstr "Avhenger av:"
+msgstr "Avhengigheter:"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "Disable MP"
-msgstr "Deaktiver Alle"
+msgstr "Koble ut MP"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "Enable MP"
-msgstr "Aktiver Alle"
+msgstr "Aktiver MP"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "Enable all"
-msgstr "Aktiver Alle"
+msgstr "Aktiver alle"
#: builtin/mainmenu/dlg_config_world.lua
msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
msgstr ""
+"Kunne ikke aktivere mod \"$1\" fordi den inneholder ulovlige tegn. Kun "
+"symbolene [a-z0-9_] er tillatt."
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "Hide Game"
-msgstr "Spill"
+msgstr "Skjul spill"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide mp content"
-msgstr ""
+msgstr "Skjul mp-innhold"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr ""
+msgstr "Mod:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -124,9 +121,8 @@ msgid "Save"
msgstr "Lagre"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "World:"
-msgstr "Navnet på verdenen"
+msgstr "Verden:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "enabled"
@@ -134,7 +130,7 @@ msgstr "aktivert"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
-msgstr ""
+msgstr "En verden med navn \"$1\" eksisterer allerede"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Create"
@@ -601,6 +597,10 @@ msgid "Particles"
msgstr "Aktiver Alle"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr ""
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr ""
@@ -949,6 +949,10 @@ msgstr ""
msgid "Use"
msgstr ""
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr ""
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr ""
@@ -1265,10 +1269,6 @@ msgstr ""
msgid "X Button 2"
msgstr ""
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr ""
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1335,6 +1335,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1409,6 +1413,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr ""
@@ -1441,6 +1449,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr ""
@@ -1481,6 +1493,10 @@ msgid "Chat toggle key"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1555,14 +1571,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1710,6 +1726,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1726,6 +1746,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1756,22 +1780,26 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
+msgid "Disable anticheat"
msgstr ""
#: src/settings_translation_file.cpp
-msgid ""
-"Determines terrain shape.\n"
-"The 3 numbers in brackets control the scale of the\n"
-"terrain, the 3 numbers should be identical."
+msgid "Disable escape sequences"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Disable anticheat"
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1799,6 +1827,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Aktiver Alle"
@@ -1884,6 +1916,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1944,11 +1984,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2082,12 +2132,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2118,6 +2170,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2146,15 +2207,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2249,6 +2301,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2283,6 +2369,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2442,6 +2536,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2477,7 +2578,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2628,6 +2729,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2660,8 +2776,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2671,8 +2785,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2683,8 +2795,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2694,8 +2804,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3054,6 +3162,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3095,17 +3211,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3117,10 +3237,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr ""
@@ -3161,10 +3277,6 @@ msgid "Mipmapping"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3369,11 +3481,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3381,7 +3499,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3416,6 +3534,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr ""
@@ -3573,7 +3695,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3610,7 +3732,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3689,10 +3811,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3708,6 +3842,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3723,6 +3863,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3825,10 +3971,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -3954,7 +4096,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4054,18 +4196,17 @@ msgstr ""
msgid "cURL timeout"
msgstr ""
-#~ msgid "is required by:"
-#~ msgstr "trengs av:"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Deaktiver Alle"
-#~ msgid "Configuration saved. "
-#~ msgstr "Konfigurasjon lagret. "
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "aktivert"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Advarsel: Noen konfigurerte modifikasjoner mangler. \n"
-#~ "Instillingene deres vil bli fjernet når du lagrer konfigurasjonen."
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Spill"
#~ msgid ""
#~ "Warning: Some mods are not configured yet.\n"
@@ -4074,14 +4215,15 @@ msgstr ""
#~ "Advarsel: Noen modifikasjoner er ikke konfigurert enda. \n"
#~ "De vil bli aktivert som standard når du lagrer konfigurasjonen."
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Spill"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Advarsel: Noen konfigurerte modifikasjoner mangler. \n"
+#~ "Instillingene deres vil bli fjernet når du lagrer konfigurasjonen."
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "aktivert"
+#~ msgid "Configuration saved. "
+#~ msgstr "Konfigurasjon lagret. "
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Deaktiver Alle"
+#~ msgid "is required by:"
+#~ msgstr "trengs av:"
diff --git a/po/nl/minetest.po b/po/nl/minetest.po
index 533917153..68e3e7b6d 100644
--- a/po/nl/minetest.po
+++ b/po/nl/minetest.po
@@ -6,9 +6,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-07 00:58+0000\n"
-"Last-Translator: Auke Kok <sofar+github@foo-projects.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-16 10:49+0000\n"
+"Last-Translator: Rogier <rogier777@gmail.com>\n"
"Language-Team: Dutch "
"<https://hosted.weblate.org/projects/minetest/minetest/nl/>\n"
"Language: nl\n"
@@ -16,12 +16,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"X-Generator: Weblate 2.10\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr ""
-"Er is een fout opgetreden in een Lua script (bijvoorbeeld van een mod):"
+msgstr "Er is een fout opgetreden in een Lua script (bijvoorbeeld van een mod):"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -245,7 +244,8 @@ msgid ""
"<octaves>, <persistence>"
msgstr ""
"Formaat: <basiswaarde>, <schaal>, (<X-spreiding>, <Y-spreiding>, "
-"<Z-spreiding>), <kiemgetal>, <octaven>, <persistentie>"
+"<Z-spreiding>),\n"
+"<kiemgetal>, <octaven>, <persistentie>"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
@@ -280,7 +280,7 @@ msgstr "Mogelijke waarden zijn: "
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
-msgstr "Standaardwaarde herstellen"
+msgstr "Standaardwaarde"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select path"
@@ -571,11 +571,11 @@ msgstr "Geen Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
-msgstr "Node Oplichten"
+msgstr "Node licht op"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Outlining"
-msgstr "Node omstrepen"
+msgstr "Node is omlijnd"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
@@ -602,6 +602,10 @@ msgid "Particles"
msgstr "Effectdeeltjes"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reset Singleplayer wereld"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Instellingen"
@@ -627,7 +631,7 @@ msgstr "Om schaduwen mogelijk te maken moet OpenGL worden gebruikt."
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
-msgstr "Toon Mapping"
+msgstr "Tone-mapping"
#: builtin/mainmenu/tab_settings.lua
msgid "Touchthreshold (px)"
@@ -739,7 +743,7 @@ msgstr "Het gespecificeerde wereld-pad bestaat niet: "
#: src/fontengine.cpp
msgid "needs_fallback_font"
-msgstr "needs_fallback_font"
+msgstr "no"
#: src/game.cpp
msgid ""
@@ -955,7 +959,7 @@ msgstr "Rechts"
#: src/guiKeyChangeMenu.cpp
msgid "Sneak"
-msgstr "sluipen"
+msgstr "Sluipen"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle Cinematic"
@@ -977,6 +981,10 @@ msgstr "Noclip aan/uit"
msgid "Use"
msgstr "Gebruiken"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoomen"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "druk op toets"
@@ -1227,7 +1235,7 @@ msgstr "Print"
#: src/keycode.cpp
msgid "Prior"
-msgstr "Eerste"
+msgstr "Vorige"
#: src/keycode.cpp
msgid "Return"
@@ -1293,10 +1301,6 @@ msgstr "X knop 1"
msgid "X Button 2"
msgstr "X knop 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoomen"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1305,6 +1309,16 @@ msgid ""
"sets.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"(X,Y,Z)-afstand van de fractal, vanaf het centrum van de wereld, als "
+"veelvoud van de schaal.\n"
+"Te gebruiken om een geschikt geboortegebied met laaggelegen land in de buurt "
+"van (0,0)\n"
+"te krijgen.\n"
+"De standaardwaarde is geschikt voor Mandelbrot fractals. Aanpassing is nodig "
+"voor\n"
+"Julia fractals.\n"
+"Bereik: circa -2 tot +2. Vermenigvuldig dit met de 'schaal' voor de afstand "
+"in nodes."
#: src/settings_translation_file.cpp
msgid ""
@@ -1323,7 +1337,6 @@ msgid "3D mode"
msgstr "3D modus"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"3D support.\n"
"Currently supported:\n"
@@ -1340,16 +1353,17 @@ msgstr ""
"- anaglyph: 3D met de kleuren cyaan en magenta.\n"
"- interlaced: 3D voor polariserend scherm (even/oneven beeldlijnen).\n"
"- topbottom: 3D met horizontaal gedeeld scherm (boven/onder).\n"
-"- sidebyside: 3D met vertikaal gedeeld scherm (links/rechts)."
+"- sidebyside: 3D met vertikaal gedeeld scherm (links/rechts).\n"
+"- pageflip: 3D met vier buffers ('quad buffer')."
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
-"Vooringesteld kiemgetal voor de wereld. Indien leeg, wordt een willekeurige "
+"Vooringesteld kiemgetal voor de wereld. Indien leeg, wordt een willekeurige\n"
"waarde gekozen.\n"
-"Wanneer vanuit het hoofdmenu een nieuwe wereld gecreëerd wordt, kan een "
+"Wanneer vanuit het hoofdmenu een nieuwe wereld gecreëerd wordt, kan een\n"
"ander kiemgetal gekozen worden."
#: src/settings_translation_file.cpp
@@ -1378,7 +1392,11 @@ msgstr "Bereik waarbinnen blokken actief zijn"
#: src/settings_translation_file.cpp
msgid "Active Block Modifier interval"
-msgstr "Bereik waarbinnen blok wijzigers actief zijn"
+msgstr "Actieve blokken wijzigers interval"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Actieve blokken wijzigers (ABMs)"
#: src/settings_translation_file.cpp
msgid "Active block range"
@@ -1403,8 +1421,8 @@ msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
-"Aangepaste DPI (dots per inch) instelling voor het scherm, bijv. voor 4k "
-"schermen (niet voor X11 of Android)."
+"Aangepaste DPI (dots per inch) instelling voor het scherm.\n"
+"Bijv. voor 4k schermen (niet voor X11 of Android)."
#: src/settings_translation_file.cpp
msgid ""
@@ -1421,7 +1439,7 @@ msgstr "Geavanceerd"
#: src/settings_translation_file.cpp
msgid "Altitude Chill"
-msgstr "Hoogte Koudheid"
+msgstr "Temperatuurverschil vanwege hoogte"
#: src/settings_translation_file.cpp
msgid "Always fly and fast"
@@ -1459,13 +1477,17 @@ msgstr "Ingeschatte (X,Y,Z) schaal van fractal in nodes."
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
-msgstr "Vraag om de verbinding te herstellen na een server-crash"
+msgstr "verbinding herstellen na een server-crash"
#: src/settings_translation_file.cpp
msgid "Automaticaly report to the serverlist."
msgstr "Meldt de server automatisch aan bij de serverlijst."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Toets voor automatisch lopen aan/uit"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Achteruit"
@@ -1479,7 +1501,7 @@ msgstr "Basis"
#: src/settings_translation_file.cpp
msgid "Basic Privileges"
-msgstr "Standaardvoorrechten"
+msgstr "Basisvoorrechten"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
@@ -1498,16 +1520,20 @@ msgid "Build inside player"
msgstr "Bouwen op de plaats van de speler"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Ingebouwd"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bumpmapping"
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
-msgstr "Vloeiender maken van de camerabeweging"
+msgstr "Vloeiender camerabeweging"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
-msgstr "Vloeiender maken van de camerabeweging (in cinematic modus)"
+msgstr "Vloeiender camerabeweging (in cinematic modus)"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
@@ -1515,11 +1541,11 @@ msgstr "Toets voor cameraverversing aan/uit"
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
-msgstr "Grot noise patroon #1"
+msgstr "Grot ruispatroon #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
-msgstr "Grot noise patroon #2"
+msgstr "Grot ruispatroon #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
@@ -1527,7 +1553,7 @@ msgstr "Grot breedte"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr "Grotten en tunnels vormen bij het kruispunt van twee noise patronen"
+msgstr "Grotten en tunnels vormen bij het kruispunt van twee ruis patronen"
#: src/settings_translation_file.cpp
msgid "Chat key"
@@ -1538,6 +1564,10 @@ msgid "Chat toggle key"
msgstr "Toets voor tonen/verbergen chat"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Chat-commando's"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1559,6 +1589,25 @@ msgid ""
"17 = 4D \"Mandelbulb\" mandelbrot set.\n"
"18 = 4D \"Mandelbulb\" julia set."
msgstr ""
+"Keuze uit 18 fractals op basis van 9 formules.\n"
+"1 = 4D \"Roundy\" mandelbrot verzameling.\n"
+"2 = 4D \"Roundy\" julia verzameling.\n"
+"3 = 4D \"Squarry\" mandelbrot verzameling.\n"
+"4 = 4D \"Squarry\" julia verzameling.\n"
+"5 = 4D \"Mandy Cousin\" mandelbrot verzameling.\n"
+"6 = 4D \"Mandy Cousin\" julia verzameling.\n"
+"7 = 4D \"Variatie\" mandelbrot verzameling.\n"
+"8 = 4D \"Variatie\" julia verzameling.\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot verzameling.\n"
+"10 = 3D \"Mandelbrot/Mandelbar\" julia verzameling.\n"
+"11 = 3D \"Kerstboom\" mandelbrot verzameling.\n"
+"12 = 3D \"Kerstboom\" julia verzameling.\n"
+"13 = 3D \"Mandelbulb\" mandelbrot verzameling.\n"
+"14 = 3D \"Mandelbulb\" julia verzameling.\n"
+"15 = 3D \"Cosinus Mandelbulb\" mandelbrot verzameling.\n"
+"16 = 3D \"Cosinus Mandelbulb\" julia verzameling.\n"
+"17 = 4D \"Mandelbulb\" mandelbrot verzameling.\n"
+"18 = 4D \"Mandelbulb\" julia verzameling."
#: src/settings_translation_file.cpp
msgid "Chunk size"
@@ -1610,18 +1659,22 @@ msgstr "Gekleurde mist"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
-"Lijst, door komma's gescheiden, van vertrouwde mods die onveilige functies "
-"mogen gebruiken,\n"
-"zelfs wanneer mod-beveiliging aan staat (via request_insecure_environment())."
+"Lijst van mods die HTTP mogen gebruiken. Deze mods kunnen gegevens uploaden\n"
+"naar en downloaden van het internet.\n"
+"Gescheiden door komma's."
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
+"Lijst van vertrouwde mods die onveilige functies mogen gebruiken,\n"
+"zelfs wanneer mod-beveiliging aan staat (via request_insecure_environment())."
+"\n"
+"Gescheiden door komma's."
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -1670,30 +1723,32 @@ msgid ""
"unchanged."
msgstr ""
"Bepaalt de lengte van de dag/nacht cyclus\n"
-"Voorbeeld: 72 = 20min, 360 = 4min, 1 = 24 uur, 0 = de kloktijd (dag, nacht, "
-"schemering) verandert niet."
+"Voorbeelden:\n"
+"72 = 20min\n"
+"360 = 4min\n"
+"1 = 24 uur\n"
+"0 = de kloktijd (dag, nacht, schemering) verandert niet."
#: src/settings_translation_file.cpp
msgid ""
"Controls size of deserts and beaches in Mapgen v6.\n"
"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
msgstr ""
-"Bepaalt de grootte van woestijnen en stranden in de wereld-generator "
-"(mapgen) v6.\n"
+"Bepaalt de grootte van woestijnen en stranden in de wereld-generator (mapgen)"
+" v6.\n"
"Als 'snowbiomes' aan staat, wordt deze instelling genegeerd."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
-msgstr "Controleert steilheid/diepte van meer depressies."
+msgstr "Bepaalt steilheid/diepte van meer depressies."
#: src/settings_translation_file.cpp
msgid "Controls steepness/height of hills."
-msgstr "Controleert steilheid/hoogte van heuvels."
+msgstr "Bepaalt steilheid/hoogte van heuvels."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
-"Controleert breedte van tunnels, een kleinere waarde maakt bredere tunnels."
+msgstr "Bepaalt breedte van tunnels, een kleinere waarde maakt bredere tunnels."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1704,12 +1759,16 @@ msgid ""
"Creates unpredictable lava features in caves.\n"
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
+"Maakt onvoorspelbare lavabronnen in grotten.\n"
+"Dit kan het graven bemoeilijken. Waardes: 0-10; 0 = uit"
#: src/settings_translation_file.cpp
msgid ""
"Creates unpredictable water features in caves.\n"
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
+"Maakt onvoorspelbare waterbronnen in grotten.\n"
+"Dit kan het graven bemoeilijken. Waardes: 0-10; 0 = uit"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
@@ -1776,6 +1835,10 @@ msgid "Default privileges"
msgstr "Standaardvoorrechten"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Standaardformaat voor rapport-bestanden"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1788,12 +1851,19 @@ msgid ""
"Defines sampling step of texture.\n"
"A higher value results in smoother normal maps."
msgstr ""
+"Bemonsterings-interval voor texturen.\n"
+"Een hogere waarde geeft vloeiender normal maps."
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
"Maximale afstand (in blokken van 16 nodes) waarbinnen andere spelers "
-"zichtbaar zijn (0 = oneindig ver)."
+"zichtbaar zijn\n"
+"(0 = oneindig ver)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Vertraging bij het versturen van blokken na het bouwen"
#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
@@ -1828,26 +1898,36 @@ msgid "Desynchronize block animation"
msgstr "Textuur-animaties niet synchroniseren"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Gedetailleerde profiling-data voor mods. Nuttig voor mod-ontwikkelaars."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Gedetailleerde profiling van mods"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
"terrain, the 3 numbers should be identical."
msgstr ""
+"Bepaalt de vorm van het terrein.\n"
+"De 3 getallen tussen vierkante haken bepalen de schaal\n"
+"van het terrein. Ze dienen alle drie hetzelfde te zijn."
#: src/settings_translation_file.cpp
msgid "Disable anticheat"
msgstr "Valsspeelbescherming uitschakelen"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Schakel ANSI-codes in text uit"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Schakel ANSI-codes in text uit. ANSI codes worden bijvoorbeeld\n"
+" gebruikt voor kleuren in de chat.\n"
+"Gebruik dit voor een server met clienten met een versie vóór 0.4.14,\n"
+"indien ANSI-codes van mods uitgeschakeld moeten worden."
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Lege wachtwoorden niet toestaan"
@@ -1872,6 +1952,10 @@ msgid "Dump the mapgen debug infos."
msgstr "Print wereldgenerator debug informatie."
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Joysticks aanzetten"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "VBO aanzetten"
@@ -1892,6 +1976,8 @@ msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
msgstr ""
+"Vloeiende verlichting met eenvoudige ambient occlusion aanschakelen.\n"
+"Schakel dit uit voor minder vertraging, of voor een ander visueel effect."
#: src/settings_translation_file.cpp
msgid ""
@@ -1904,7 +1990,8 @@ msgstr ""
"Zet dit aan om verbindingen van oudere cliënten te weigeren.\n"
"Oudere cliënten zijn compatibel, in de zin dat ze niet crashen als ze "
"verbinding \n"
-"maken met nieuwere servers, maar ze ondersteunen wellicht niet alle nieuwere "
+"maken met nieuwere servers, maar ze ondersteunen wellicht niet alle "
+"nieuwere\n"
"mogelijkheden."
#: src/settings_translation_file.cpp
@@ -1916,9 +2003,8 @@ msgid ""
msgstr ""
"Sta het gebruik van een externe media-server toe (indien opgegeven door de "
"server).\n"
-"Het gebruik van externe media-servers versnelt het downloaden van media "
-"(bijv. texturen) aanzienlijk\n"
-"bij het maken van een verbinding met een server."
+"Het gebruik van externe media-servers versnelt het downloaden van media\n"
+"(bijv. texturen) aanzienlijk bij het maken van een verbinding met een server."
#: src/settings_translation_file.cpp
msgid ""
@@ -1941,7 +2027,7 @@ msgid ""
"or need to be auto-generated.\n"
"Requires shaders to be enabled."
msgstr ""
-"bumpmapping aanzetten voor texturen. Normalmaps moeten al in de texture pack "
+"Bumpmapping aanzetten voor texturen. Normalmaps moeten al in de texture pack "
"zitten\n"
"of ze moeten automatisch gegenereerd worden.\n"
"Schaduwen moeten aanstaan."
@@ -1952,7 +2038,7 @@ msgstr "Schakelt caching van facedir geroteerde meshes."
#: src/settings_translation_file.cpp
msgid "Enables filmic tone mapping"
-msgstr "Schakelt Filmisch Toon Mapping in"
+msgstr "Schakelt filmisch tone-mapping in"
#: src/settings_translation_file.cpp
msgid "Enables minimap."
@@ -1963,12 +2049,24 @@ msgid ""
"Enables on the fly normalmap generation (Emboss effect).\n"
"Requires bumpmapping to be enabled."
msgstr ""
+"Schakelt het genereren van normal maps in (emboss effect).\n"
+"Dit vereist dat bumpmapping ook aan staat."
#: src/settings_translation_file.cpp
msgid ""
"Enables parallax occlusion mapping.\n"
"Requires shaders to be enabled."
msgstr ""
+"Schakelt parallax occlusie mappen in.\n"
+"Dit vereist dat shaders ook aanstaan."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Profilergegevens print interval"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Entiteit-functies"
#: src/settings_translation_file.cpp
msgid ""
@@ -2035,15 +2133,27 @@ msgid "Field of view"
msgstr "Zichthoek"
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Zichthoek bij inzoomen"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Zichthoek in graden."
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Zichthoek bij inzoomen, in graden.\n"
+"Het \"zoom\" voorrecht is vereist op de server."
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
-"Bestand in de map 'client/serverlist/' met favoriete servers die getoond "
+"Bestand in de map 'client/serverlist/' met favoriete servers die getoond\n"
"worden in de multiplayer tab."
#: src/settings_translation_file.cpp
@@ -2052,7 +2162,7 @@ msgstr "Filler Diepte"
#: src/settings_translation_file.cpp
msgid "Filmic tone mapping"
-msgstr ""
+msgstr "Filmisch tone-mapping"
#: src/settings_translation_file.cpp
msgid ""
@@ -2061,6 +2171,11 @@ msgid ""
"light edge to transparent textures. Apply this filter to clean that up\n"
"at texture load time."
msgstr ""
+"Gefilterde texturen kunnen RGB-waarden vermengen met transparante buren,\n"
+"die door PNG-optimalisators vaak verwijderd worden. Dit kan donkere of "
+"lichte\n"
+"randen bij transparante texturen tot gevolg hebben.\n"
+"Gebruik dit filter om dat tijdens het laden van texturen te herstellen."
#: src/settings_translation_file.cpp
msgid "Filtering"
@@ -2127,8 +2242,8 @@ msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
msgstr ""
-"Tot welke afstand blokken gegenereerd worden voor cliënten. In mapblokken "
-"(16 nodes)."
+"Tot welke afstand blokken gegenereerd worden voor cliënten. In mapblokken ("
+"16 nodes)."
#: src/settings_translation_file.cpp
msgid ""
@@ -2141,6 +2256,8 @@ msgstr ""
msgid ""
"From how far clients know about objects, stated in mapblocks (16 nodes)."
msgstr ""
+"De afstand waarop clienten geïnformeerd worden over objecten. In blokken (16 "
+"nodes)."
#: src/settings_translation_file.cpp
msgid "Full screen"
@@ -2179,20 +2296,23 @@ msgid "Generate normalmaps"
msgstr "Genereer normaalmappen"
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Global callbacks"
+msgstr "Algemene callbacks"
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
-"de \"jungles\" vlag genegeerd.\n"
+"Algemene wereldgenerator instellingen.\n"
+"De vlag 'decorations' bepaalt de aanwezigheid van alle decoraties, behalve\n"
+"bij generator v6,\n"
+"waar de aanwezigheid van bomen en oerwoud-gras er niet\n"
+"door beïnvloed wordt.\n"
"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
"waarde.\n"
"Zet \"no\" voor een vlag om hem expliciet uit te zetten."
@@ -2221,16 +2341,31 @@ msgid ""
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
"Behandeling van verouderde lua api aanroepen:\n"
-"- legacy: (probeer) het oude gedrag na te bootsen (standaard voor een "
-"'release' versie).\n"
-"- log: boots het oude gedrag na, en log een backtrace van de aanroep "
-"(standaard voor een 'debug' versie).\n"
-"- error: stop de server bij gebruik van een verouderde aanroep "
-"(aanbevolen voor mod ontwikkelaars)."
+"- legacy: (probeer) het oude gedrag na te bootsen\n"
+" (standaard voor een 'release' versie).\n"
+"- log: boots het oude gedrag na, en log een backtrace van de aanroep\n"
+" (standaard voor een 'debug' versie).\n"
+"- error: stop de server bij gebruik van een verouderde aanroep\n"
+" (aanbevolen voor mod ontwikkelaars)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Laat de profiler zichzelf profileren:\n"
+"* Profileer een lege functie.\n"
+" Dit geeft een schatting van de CPU-tijd die door de profiler zelf "
+"gebruikt wordt,\n"
+" ten koste van één extra functie-aanroep.\n"
+"* Profileer de code die de statistieken ververst."
#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
-msgstr "Vertikale aanvangsgroote van het openingsvenster."
+msgstr "Aanvangshoogte van het venster."
#: src/settings_translation_file.cpp
msgid "Height on which clouds are appearing."
@@ -2246,7 +2381,7 @@ msgstr "Home-pagina van de server. Wordt getoond in de serverlijst."
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr "Hoe diep rivieren te maken"
+msgstr "Diepte van de rivieren"
#: src/settings_translation_file.cpp
msgid ""
@@ -2254,21 +2389,11 @@ msgid ""
"mapblocks (16 nodes).\n"
"In active blocks objects are loaded and ABMs run."
msgstr ""
-"Tot op welke afstand van actieve spelers blokken 'actief' zijn. In blokken "
-"(van 16 nodes).\n"
+"Tot op welke afstand van actieve spelers blokken 'actief' zijn. In blokken ("
+"van 16 nodes).\n"
"In actieve blokken worden objecten geladen (bijv. dieren die rondlopen) en "
-"ABMs uitgevoerd (bijv. groeien van planten)."
-
-#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-"Het aantal blokken dat totaal tegelijk onderweg kan zijn, voor de hele "
-"server."
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "Het aantal blokken dat per cliënt tegelijk onderweg kan zijn."
+"ABMs uitgevoerd\n"
+"(bijv. groeien van planten)."
#: src/settings_translation_file.cpp
msgid ""
@@ -2281,7 +2406,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "How wide to make rivers"
-msgstr "Hoe breed rivieren te maken"
+msgstr "Breedte van rivieren"
#: src/settings_translation_file.cpp
msgid "IPv6"
@@ -2309,7 +2434,8 @@ msgid ""
"enabled."
msgstr ""
"Indien uitgeschakeld, dan wordt met de \"gebruiken\" toets snel gevlogen "
-"wanneer de \"vliegen\" en de \"snel\" modus aanstaan."
+"wanneer\n"
+"de \"vliegen\" en de \"snel\" modus aanstaan."
#: src/settings_translation_file.cpp
msgid ""
@@ -2317,7 +2443,7 @@ msgid ""
"nodes.\n"
"This requires the \"noclip\" privilege on the server."
msgstr ""
-"Indien deze optie aanstaat, in combinatie met \"vliegen\" modus, dan kan de "
+"Indien deze optie aanstaat, in combinatie met \"vliegen\" modus, dan kan de\n"
"speler door vaste objecten heenvliegen.\n"
"Dit vereist het \"noclip\" voorrecht op de server."
@@ -2326,8 +2452,8 @@ msgid ""
"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
"and descending."
msgstr ""
-"Indien aangeschakeld, dan wordt de \"gebruiken\" toets gebruikt voor "
-"omlaagklimmen en dalen i.p.v. de \"kruipen\" toets."
+"Indien aangeschakeld, dan wordt de \"gebruiken\" toets gebruikt voor\n"
+"omlaagklimmen en dalen i.p.v. de \"sluipen\" toets."
#: src/settings_translation_file.cpp
msgid ""
@@ -2348,7 +2474,8 @@ msgid ""
"Only enable this if you know what you are doing."
msgstr ""
"Zorg dat de server niet stopt in geval van ongeldige wereld-data.\n"
-"Alleen aan te schakelen indien bekend is wat de consequenties zijn."
+"Alleen aan te schakelen door spelers / server-beheerders die weten wat de "
+"consequenties zijn."
#: src/settings_translation_file.cpp
msgid "If enabled, new players cannot join with an empty password."
@@ -2361,7 +2488,7 @@ msgid ""
"you stand.\n"
"This is helpful when working with nodeboxes in small areas."
msgstr ""
-"Indien aangeschakeld, kan een speler blokken plaatsen op de eigen positie "
+"Indien aangeschakeld, kan een speler blokken plaatsen op de eigen positie\n"
"(het niveau van de voeten en van de ogen).\n"
"Dit vergemakkelijkt het werken in nauwe ruimtes."
@@ -2388,6 +2515,45 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Chat console achtergrondkleur (R,G,B)."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Profileer 'builtin'.\n"
+"Dit is normaal enkel nuttig voor gebruik door ontwikkelaars van\n"
+"het 'builtin'-gedeelte van de server"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Profileer chat-commando's bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Profileer algemene callback-functies bij het registreren.\n"
+"(alles dat mbv een van de minetest.register_*() functies geregistreerd wordt"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "Profileer de acties van ABMs bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr "Profileer de acties van LBMs bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Profileer de acties van objecten bij het registreren."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Per soort"
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Interval voor het opslaan van belangrijke veranderingen in de wereld. In "
@@ -2399,7 +2565,7 @@ msgstr "Interval voor het sturen van de kloktijd naar cliënten."
#: src/settings_translation_file.cpp
msgid "Inventory items animations"
-msgstr "inventaris items animaties"
+msgstr "Inventaris items animaties"
#: src/settings_translation_file.cpp
msgid "Inventory key"
@@ -2407,7 +2573,7 @@ msgstr "Rugzak toets"
#: src/settings_translation_file.cpp
msgid "Invert mouse"
-msgstr "Muibeweging omkeren"
+msgstr "Muisbeweging omkeren"
#: src/settings_translation_file.cpp
msgid "Invert vertical mouse movement."
@@ -2418,50 +2584,57 @@ msgid "Item entity TTL"
msgstr "Bestaansduur van objecten"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Iterations of the recursive function.\n"
"Controls the amount of fine detail."
msgstr ""
-"Juliaverzameling: Aantal iteraties van de recursieve functie.\n"
+"Aantal iteraties van de recursieve functie.\n"
"Bepaalt de schaal van de kleinste details."
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Joystick-knop herhalingsinterval"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Joystick frustrum gevoeligheid"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
+"Juliaverzameling: W-waarde van de 4D vorm. Heeft geen effect voor 3D-"
+"fractals.\n"
+"Bereik is ongeveer -2 tot 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: X component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
-"Juliaverzameling: X-waarde van de 4D vorm.\n"
+"Juliaverzameling: X-waarde van de vorm.\n"
"Bereik is ongeveer -2 tot 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: Y component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
-"Juliaverzameling: Y-waarde van de 4D vorm.\n"
+"Juliaverzameling: Y-waarde van de vorm.\n"
"Bereik is ongeveer -2 tot 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: Z component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
-"Juliaverzameling: Z-waarde van de 4D-vorm.\n"
+"Juliaverzameling: Z-waarde van de vorm.\n"
"Bereik is ongeveer -2 tot 2."
#: src/settings_translation_file.cpp
@@ -2473,15 +2646,14 @@ msgid "Jumping speed"
msgstr "Sprinsnelheid"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for decreasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Toets om oneindige zichtastand aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Toets om de zichtastand te verminderen.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2490,19 +2662,18 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets voor het weggooien van het geselecteerde object.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Key for increasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Toets om oneindige zichtastand aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Toets om de zichtastand te vergroten.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2511,8 +2682,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets voor springen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2521,8 +2692,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om snel te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2531,8 +2702,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om de speler achteruit te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2541,8 +2712,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om de speler vooruit te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2551,8 +2722,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om de speler naar links te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2561,8 +2732,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om de speler naar rechts te bewegen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2571,8 +2742,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om de chat-console te openen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2581,8 +2752,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om het chat-window te openen om commando's te typen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2591,8 +2762,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om het chat-window te openen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2601,8 +2772,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om het rugzak-window te openen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2610,9 +2781,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Toets om debug-stapels te printen. Gebruikt voor ontwikkeling.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Toets om debug-stacks te printen. Gebruikt voor ontwikkeling.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2622,11 +2793,11 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Toets om te kruipen.\n"
+"Toets om te sluipen.\n"
"Wordt ook gebruikt om naar beneden te klimmen en te dalen indien "
"aux1_descends uitstaat.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2635,8 +2806,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om tussen 1e-persoon camera en 3e-persoon camera te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2645,8 +2816,18 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om screenshot te maken.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Toets om automatisch lopen aan/uit te schakelen.\n"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2655,8 +2836,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om cinematic modus aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2665,8 +2846,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om de mini-kaart aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2675,8 +2856,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om snelle modus aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2685,8 +2866,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om vliegen aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2695,19 +2876,19 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om 'noclip' modus aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om camera-verversing aan/uit te schakelen. Enkel gebruikt voor "
"ontwikkeling.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2716,8 +2897,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om debug informatie aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2726,8 +2907,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om de HUD aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2736,8 +2917,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om het tonen van chatberichten aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2746,8 +2927,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om mist aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2757,8 +2938,8 @@ msgid ""
msgstr ""
"Toets om het tonen van de code-profiler aan/uit te schakelen. Gebruikt voor "
"ontwikkeling.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2767,8 +2948,8 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Toets om oneindige zichtastand aan/uit te schakelen.\n"
-"Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Zie http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735"
+"e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid "Key use for climbing/descending"
@@ -2780,7 +2961,7 @@ msgstr "Taal"
#: src/settings_translation_file.cpp
msgid "Large cave depth"
-msgstr "Grote grotten diepte"
+msgstr "Diepte van grote grotten"
#: src/settings_translation_file.cpp
msgid "Lava Features"
@@ -2799,7 +2980,7 @@ msgid ""
msgstr ""
"Type bladeren:\n"
"- Fancy: alle zijden zichtbaar\n"
-"- Simple: enkel buitenzijden zichtbaar; special_tiles worden gebruikt "
+"- Simple: enkel buitenzijden zichtbaar; special_tiles wordt gebruikt "
"indien gedefiniëerd\n"
"- Opaque: geen doorzichtige bladeren"
@@ -2817,11 +2998,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Length of time between ABM execution cycles"
-msgstr "Tijd tussen ABM executie cycli"
+msgstr ""
+"Tijdsinterval waarmee actieve blokken wijzigers (ABMs) geactiveerd worden"
#: src/settings_translation_file.cpp
msgid "Length of time between NodeTimer execution cycles"
-msgstr "Tijd tussen NodeTimer executie cycli"
+msgstr "Tijdsinterval waarmee node timerd geactiveerd worden"
#: src/settings_translation_file.cpp
msgid ""
@@ -2837,9 +3019,11 @@ msgstr ""
"Hoeveelheid logging die geschreven wordt naar debug.txt:\n"
"- <leeg> (geen logging)\n"
"- none (enkel berichten zonder gedefiniëerd niveau)\n"
-"- error (alles van minstens fout-niveau)- warning (alles van minstens "
-"waarschuwings-niveau)- action (alles van minstens actie-niveau)- info "
-"(alles van minstens informatie-niveau)- verbose (alles)"
+"- error (alles van minstens fout-niveau)\n"
+"- warning (alles van minstens waarschuwings-niveau)\n"
+"- action (alles van minstens actie-niveau)\n"
+"- info (alles van minstens informatie-niveau)\n"
+"- verbose (alles)"
#: src/settings_translation_file.cpp
msgid "Limit of emerge queues on disk"
@@ -2857,7 +3041,7 @@ msgid ""
"- Downloads performed by main menu (e.g. mod manager).\n"
"Only has an effect if compiled with cURL."
msgstr ""
-"Beperking van aantal parallele HTTP verzoeken. Van toepassing op:\n"
+"Beperking van het aantal parallele HTTP verzoeken. Van toepassing op:\n"
"- Laden van media indien een externe media-server gebruikt wordt.\n"
"- Laden van de serverlijst en server-aankondigingen.\n"
"- Downloads vanuit het hoofdmens (bijv. mods).\n"
@@ -2892,6 +3076,25 @@ msgid "Liquid update tick"
msgstr "Vloeistof verspreidingssnelheid"
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Gebruik de spel-profiler"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Gebruik de spel-profiler om profileringsgegevens van het spel te verzamelen."
+"\n"
+"Hierbij komt ook het server-commando '/profiler' beschikbaar.\n"
+"Nuttig voor mod-ontwikkelaars en server-beheerders."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Geladen blokken aanpassers (LBMs)"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr "Hoofdmenu spelbeheer"
@@ -2920,7 +3123,6 @@ msgid "Map directory"
msgstr "Wereld map"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen Valleys.\n"
"'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2928,69 +3130,61 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
-"de \"jungles\" vlag genegeerd.\n"
+"Wereldgenerator instellingen specifiek voor generator 'valleys' (valleien).\n"
+"'altitude_chill' maakt hogere gebieden kouder. Dit kan gevolgen hebben voor "
+"de biomen.\n"
+"'humid_rivers' verhoogt de vochtigheidsgraad bij rivieren en andere "
+"gebieden\n"
+"met water. Dit kan gevolgen hebben voor de zorgvuldig geconfigureerde biomen."
+"\n"
"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
"waarde.\n"
"Zet \"no\" voor een vlag om hem expliciet uit te zetten."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Wereldgenerator instellingen specified voor generator v7.\n"
-"\"ridges\" zijn rivieren.\n"
+"Wereldgenerator instellingen specifiek voor generator 'flat' (vlak).\n"
+"Verspreide meren en heuvels kunnen toegevoegd worden.\n"
"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
"waarde.\n"
"Zet \"no\" voor een vlag om hem expliciet uit te zetten."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
+"Wereldgenerator instellingen specifiek voor generator v6.\n"
+"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt\n"
"de \"jungles\" vlag genegeerd.\n"
"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
"waarde.\n"
"Zet \"no\" voor een vlag om hem expliciet uit te zetten."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Wereldgenerator instellingen specified voor generator v6.\n"
-"Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
-"de \"jungles\" vlag genegeerd.\n"
+"Wereldgenerator instellingen specifiek voor generator v7.\n"
+"\"ridges\" zijn rivieren.\n"
"Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
"waarde.\n"
"Zet \"no\" voor een vlag om hem expliciet uit te zetten."
@@ -3017,15 +3211,15 @@ msgstr "Valleien Wereldgenerator"
#: src/settings_translation_file.cpp
msgid "Mapgen biome heat noise parameters"
-msgstr "Wereldgenerator landschapstemperatuur ruisparameters"
+msgstr "Wereldgenerator landschapstemperatuur"
#: src/settings_translation_file.cpp
msgid "Mapgen biome humidity blend noise parameters"
-msgstr "Wereldgenerator landschapsvochtigheidsovergangen ruisparameters"
+msgstr "Wereldgenerator landschapsvochtigheidsovergangen"
#: src/settings_translation_file.cpp
msgid "Mapgen biome humidity noise parameters"
-msgstr "Wereldgenerator landschapsvochtigheid ruisparameters"
+msgstr "Wereldgenerator landschapsvochtigheid"
#: src/settings_translation_file.cpp
msgid "Mapgen debug"
@@ -3041,51 +3235,51 @@ msgstr "Vlakke Wereldgenerator"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave width"
-msgstr "Vlakke wereldgenerator grot breedte"
+msgstr "Grot breedte"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
-msgstr "Vlakke wereldgenerator grotten (1) ruisparameters"
+msgstr "Grotten (1) ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave2 noise parameters"
-msgstr "Vlakke wereldgenerator grotten (2) ruisparameters"
+msgstr "Grotten (2) ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen flat filler depth noise parameters"
-msgstr "Fractal wereldgenerator vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen flat flags"
-msgstr "Vlakke wereldgenerator vlaggen"
+msgstr "Vlaggen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat ground level"
-msgstr "Vlakke wereldgenerator grondniveau"
+msgstr "Grondniveau"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill steepness"
-msgstr "Vlakke wereldgenerator heuvel steilheid"
+msgstr "Steilheid van de heuvels"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill threshold"
-msgstr "Vlakke wereldgenerator heuvel grenswaarde"
+msgstr "Heuvel-grenswaarde"
#: src/settings_translation_file.cpp
msgid "Mapgen flat lake steepness"
-msgstr "Vlakke wereldgenerator meer steilheid"
+msgstr "Steilheid Van de meren"
#: src/settings_translation_file.cpp
msgid "Mapgen flat lake threshold"
-msgstr "Vlakke wereldgenerator meer grenswaarde"
+msgstr "Meren-grenswaarde"
#: src/settings_translation_file.cpp
msgid "Mapgen flat large cave depth"
-msgstr "Vlakke wereldgenerator grote grotten diepte"
+msgstr "Grote Grotten diepte"
#: src/settings_translation_file.cpp
msgid "Mapgen flat terrain noise parameters"
-msgstr "Vlakke Wereldgenerator basisterrein ruisparameters"
+msgstr "Terrein ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal"
@@ -3093,69 +3287,63 @@ msgstr "Fractal wereldgenerator"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave width"
-msgstr "Fractal wereldgenerator grot breedte"
+msgstr "Grot breedte"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
-msgstr "Fractal wereldgenerator grotten (1) ruisparameters"
+msgstr "Grotten (1) ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave2 noise parameters"
-msgstr "Fractal wereldgenerator grotten (2) ruisparameters"
+msgstr "Grotten (2) ruisparameters"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal filler depth noise parameters"
-msgstr "Fractal wereldgenerator vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal fractal"
-msgstr "Fractal wereldgenerator vlaggen"
+msgstr "Fractal"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal iterations"
-msgstr "Fractal wereldgenerator julia iteraties"
+msgstr "Aantal iteraties"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia w"
-msgstr "Fractal wereldgenerator julia w"
+msgstr "Fractal W"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia x"
-msgstr "Fractal wereldgenerator julia x"
+msgstr "Fractal X"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia y"
-msgstr "Fractal wereldgenerator julia y"
+msgstr "Fractal Y"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia z"
-msgstr "Fractal wereldgenerator julia z"
+msgstr "Fractal Z"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal offset"
-msgstr "Fractal wereldgenerator julia centrum-afstand"
+msgstr "Centrum-positie"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal scale"
-msgstr "Fractal wereldgenerator julia schaal"
+msgstr "Schaal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal seabed noise parameters"
-msgstr "Fractal wereldgenerator zeebodem parameters"
+msgstr "Zeebodem ruisparameters"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal slice w"
-msgstr "Fractal wereldgenerator julia w-doorsnede"
+msgstr "W-doorsnede"
#: src/settings_translation_file.cpp
msgid "Mapgen heat blend noise parameters"
-msgstr "Wereldgenerator landschapstemperatuurovergangen ruisparameters"
+msgstr "Wereldgenerator landschapstemperatuurovergangen"
#: src/settings_translation_file.cpp
msgid "Mapgen name"
@@ -3166,30 +3354,28 @@ msgid "Mapgen v5"
msgstr "Wereldgenerator v5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 cave width"
-msgstr "Fractal wereldgenerator julia schaal"
+msgstr "Grot-breedte"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
-msgstr "Wereldgenerator v5 grot 1 ruisparameters"
+msgstr "Grot 1 ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave2 noise parameters"
-msgstr "Wereldgenerator v5 grot 2 ruisparameters"
+msgstr "Grot 2 ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 factor noise parameters"
-msgstr "Wereldgenerator v5 ruisparameters factor"
+msgstr "Ruisparameters factor"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 filler depth noise parameters"
-msgstr "Wereldgenerator v5 vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 height noise parameters"
-msgstr "Wereldgenerator v5 hoogte ruisparameters"
+msgstr "Hoogte ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6"
@@ -3197,130 +3383,127 @@ msgstr "Wereldgenerator v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 apple trees noise parameters"
-msgstr "Wereldgenerator v6 appelbomen ruisparameters"
+msgstr "Appelbomen ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach frequency"
-msgstr "Wereldgenerator v6 strand frequentie"
+msgstr "Strand frequentie"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach noise parameters"
-msgstr "Wereldgenerator v6 strand ruisparameters"
+msgstr "Strand ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 biome noise parameters"
-msgstr "Wereldgenerator v6 landschap ruisparameters"
+msgstr "Landschap ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 cave noise parameters"
-msgstr "Wereldgenerator v6 grotten ruisparameters"
+msgstr "Grotten ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 desert frequency"
-msgstr "Wereldgenerator v6 woestijn ruisparameters"
+msgstr "Woestijn frequentie"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 flags"
-msgstr "Wereldgenerator v6 vlaggen"
+msgstr "Vlaggen"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 height select noise parameters"
-msgstr "Wereldgenerator v6 hoogte-selectie ruisparameters"
+msgstr "Hoogte-selectie ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 humidity noise parameters"
-msgstr "Wereldgenerator v6 vochtigheid ruisparameters"
+msgstr "Vochtigheid ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 mud noise parameters"
-msgstr "Wereldgenerator v6 modder ruisparameters"
+msgstr "Modder ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 steepness noise parameters"
-msgstr "Wereldgenerator v6 steilheid ruisparameters"
+msgstr "Steilheid ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 terrain altitude noise parameters"
-msgstr "Wereldgenerator v6 terrein-hoogte ruisparameters"
+msgstr "Terrein-hoogte ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 terrain base noise parameters"
-msgstr "Wereldgenerator v6 basisterrein ruisparameters"
+msgstr "Basisterrein ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 trees noise parameters"
-msgstr "Wereldgenerator v6 bomen ruisparameters"
+msgstr "Bomen ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7"
msgstr "Wereldgenerator v7"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 cave width"
-msgstr "Fractal wereldgenerator julia schaal"
+msgstr "Grot-breedte"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
-msgstr "Wereldgenerator v7 grotten (1) ruisparameters"
+msgstr "Grotten (1) ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave2 noise parameters"
-msgstr "Wereldgenerator v7 grotten (2) ruisparameters"
+msgstr "Grotten (2) ruisparameters"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 filler depth noise parameters"
-msgstr "Wereldgenerator v7 vuldiepte ruisparameters"
+msgstr "Vuldiepte ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 flags"
-msgstr "Wereldgenerator v7 vlaggen"
+msgstr "Vlaggen"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 height select noise parameters"
-msgstr "Wereldgenerator v7 hoogte-selectie ruisparameters"
+msgstr "Hoogte-selectie ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 mount height noise parameters"
-msgstr "Wereldgenerator v7 heuvel-hoogte ruisparameters"
+msgstr "Heuvel-hoogte ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 mountain noise parameters"
-msgstr "Wereldgenerator v7 bergen ruisparameters"
+msgstr "Bergen ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 ridge noise parameters"
-msgstr "Wereldgenerator v7 richel ruisparameters"
+msgstr "Richel ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 ridge water noise parameters"
-msgstr "Wereldgenerator richel-water ruisparameters"
+msgstr "Ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 terrain altitude noise parameters"
-msgstr "Wereldgenerator v7 terrein-hoogte ruisparameters"
+msgstr "Terrein-hoogte ruisparameters"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 terrain base noise parameters"
-msgstr "Wereldgenerator v7 terrein basis ruisparameters"
+msgstr "Terrein basis ruisparameters"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 terrain persistation noise parameters"
-msgstr "Wereldgenerator v7 terrein-'persist' ruisparameters"
+msgstr "Terrein-'persist' ruisparameters"
#: src/settings_translation_file.cpp
msgid "Massive cave depth"
-msgstr ""
+msgstr "Zeer grote grotten: diepte"
#: src/settings_translation_file.cpp
msgid "Massive cave noise"
-msgstr ""
+msgstr "Zeer grote grotten: ruis"
#: src/settings_translation_file.cpp
msgid "Massive caves form here."
-msgstr ""
+msgstr "Zeer grote grotten ruis parameters."
#: src/settings_translation_file.cpp
msgid "Max block generate distance"
@@ -3333,8 +3516,8 @@ msgstr "Maximale afstand voor te versturen blokken"
#: src/settings_translation_file.cpp
msgid "Max liquids processed per step."
msgstr ""
-"Maximaal aantal vloeistof-nodes te verwerken (dwz verspreiden) per server-"
-"stap."
+"Maximaal aantal vloeistof-nodes te verwerken (dwz verspreiden)\n"
+"per server-stap."
#: src/settings_translation_file.cpp
msgid "Max. clearobjects extra blocks"
@@ -3357,11 +3540,18 @@ msgid "Maximum forceloaded blocks"
msgstr "Maximaal aantal geforceerd geladen blokken"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Maximum hotbar width"
msgstr "Maximale breedte van de 'hotbar'"
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Maximaal aantal blokken dat in totaal tegelijk verzonden wordt."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Maximaal aantal blokken per client dat tegelijk verzonden wordt."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr "Maximaal aantal blokken in de wachtrij voor laden/genereren."
@@ -3412,24 +3602,28 @@ msgstr "Maximaal aantal spelers dat tegelijk verbonden kan zijn."
#: src/settings_translation_file.cpp
msgid "Maximum number of statically stored objects in a block."
-msgstr "Maximaal aantal objecten per block."
+msgstr "Maximaal aantal objecten per blok dat wordt opgeslagen."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Maximaal aantal objecten per blok"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
-"Maximaal gedeelte van het window dat gebruikt mag worden voor de hotbar.\n"
+"Maximale fractie van de breedte het window dat gebruikt mag worden voor de "
+"hotbar.\n"
"Dit is nuttig als er iets links of rechts ervan getoond moet worden."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr "Maximaal aantal tegelijk te verzenden blokken per cliënt"
+msgid "Maximum simultaneous block sends per client"
+msgstr "Maximaal simultaan verzonden blokken per cliënt"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr "Maximaal aantal tegelijk te verzenden blokken (totaal)"
+msgid "Maximum simultaneous block sends total"
+msgstr "Maximaal simultaan verzonden blokken (totaal)"
#: src/settings_translation_file.cpp
msgid "Maximum time in ms a file download (e.g. a mod download) may take."
@@ -3442,17 +3636,12 @@ msgid "Maximum users"
msgstr "Maximaal aantal gebruikers"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "Maximaal aantal objecten per blok"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Menus"
-msgstr "Menu"
+msgstr "Menus"
#: src/settings_translation_file.cpp
msgid "Mesh cache"
-msgstr ""
+msgstr "Cache voor meshes"
#: src/settings_translation_file.cpp
msgid "Message of the day"
@@ -3465,6 +3654,9 @@ msgstr "Toon bericht aan spelers die verbinding maken."
#: src/settings_translation_file.cpp
msgid "Method used to highlight selected object."
msgstr ""
+"Manier waarop het geselecteerde object zichtbaar wordt gemaakt.\n"
+"* box: node wordt omlijnd.\n"
+"* halo: node licht op."
#: src/settings_translation_file.cpp
msgid "Minimap"
@@ -3483,15 +3675,10 @@ msgid "Minimum texture size for filters"
msgstr "Minimale textuur-grootte voor filters"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mipmapping"
msgstr "Mip-Mapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr "Mod-winkel details URL"
@@ -3525,8 +3712,10 @@ msgid ""
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
"Vermenigvuldigingsfactor van loopbeweging bij vallen.\n"
-"Bijvoorbeeld: 0 voor geen loopbeweging; 1.0 voor normale loopbeweging; 2.0 "
-"voor twee keer grotere loopbeweging."
+"Bijvoorbeeld:\n"
+"0 voor geen loopbeweging.\n"
+"1.0 voor normale loopbeweging.\n"
+"2.0 voor twee keer grotere loopbeweging."
#: src/settings_translation_file.cpp
msgid ""
@@ -3534,8 +3723,10 @@ msgid ""
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
"Vermenigvuldigingsfactor van loopbeweging.\n"
-"Bijvoorbeeld: 0 voor geen loopbeweging; 1.0 voor normale loopbeweging; 2.0 "
-"voor twee keer grotere loopbeweging."
+"Bijvoorbeeld:\n"
+"0 voor geen loopbeweging.\n"
+"1.0 voor normale loopbeweging.\n"
+"2.0 voor twee keer grotere loopbeweging."
#: src/settings_translation_file.cpp
msgid ""
@@ -3585,18 +3776,16 @@ msgid "Noclip"
msgstr "Noclip"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Noclip key"
msgstr "Noclip-toets"
#: src/settings_translation_file.cpp
msgid "Node highlighting"
-msgstr "Oplichtende node"
+msgstr "Geselecteerde node indicatie"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "NodeTimer interval"
-msgstr "Kloktijd verstuur-interval"
+msgstr "Interval voor node-timers"
#: src/settings_translation_file.cpp
msgid "Noise parameters for biome API temperature, humidity and biome blend."
@@ -3605,15 +3794,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Noises"
-msgstr ""
+msgstr "Ruis"
#: src/settings_translation_file.cpp
msgid "Normalmaps sampling"
-msgstr ""
+msgstr "Normal-maps bemonstering"
#: src/settings_translation_file.cpp
msgid "Normalmaps strength"
-msgstr ""
+msgstr "Sterkte van normal-maps"
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
@@ -3639,9 +3828,9 @@ msgid ""
"This is a trade-off between sqlite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
-"Aantal extra blokken (van 16x16x16 nodes) dat door het commando '/"
-"clearobjects' tegelijk\n"
-"geladen mag worden.\n"
+"Aantal extra blokken (van 16x16x16 nodes) dat door het commando "
+"'/clearobjects'\n"
+"tegelijk geladen mag worden.\n"
"Dit aantal is een compromis tussen snelheid enerzijds (vanwege de overhead "
"van een sqlite\n"
"transactie), en geheugengebruik anderzijds (4096 = ca. 100MB)."
@@ -3652,11 +3841,11 @@ msgstr "Aantal parallax occlusie iteraties."
#: src/settings_translation_file.cpp
msgid "Overall bias of parallax occlusion effect, usually scale/2."
-msgstr ""
+msgstr "Algemene afwijking van het parallax occlusie effect. Normaal: schaal/2."
#: src/settings_translation_file.cpp
msgid "Overall scale of parallax occlusion effect."
-msgstr ""
+msgstr "Algemene schaal van het parallax occlusie effect."
#: src/settings_translation_file.cpp
msgid "Parallax occlusion"
@@ -3667,9 +3856,8 @@ msgid "Parallax occlusion Scale"
msgstr "Parallax occlusie schaal"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Parallax occlusion bias"
-msgstr "Parallax occlusie"
+msgstr "Parallax occlusie afwijking"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion iterations"
@@ -3680,9 +3868,8 @@ msgid "Parallax occlusion mode"
msgstr "Parallax occlusie modus"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Parallax occlusion strength"
-msgstr "Parallax occlusie"
+msgstr "Parallax occlusie sterkte"
#: src/settings_translation_file.cpp
msgid "Path to TrueTypeFont or bitmap."
@@ -3726,8 +3913,8 @@ msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
msgstr ""
-"Netwerk-poort (UDP) waarmee verbinding gemaakt moet worden.In het hoofdmenu "
-"kan een andere waarde opgegeven worden."
+"Netwerk-poort (UDP) waarmee verbinding gemaakt moet worden.\n"
+"In het hoofdmenu kan een andere waarde opgegeven worden."
#: src/settings_translation_file.cpp
msgid "Prevent mods from doing insecure things like running shell commands."
@@ -3735,22 +3922,28 @@ msgstr ""
"Voorkom dat mods onveilige commando's uitvoeren, zoals shell commando's."
#: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
msgstr ""
"Interval waarmee profiler-gegevens geprint worden. 0 = uitzetten. Dit is "
"nuttig voor ontwikkelaars."
#: src/settings_translation_file.cpp
+msgid "Privileges that players with basic_privs can grant"
+msgstr "Voorrechten die spelers met 'basic_privs' mogen toekennen"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
msgstr "Profiler aan/uit toets"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "Profilergegevens print interval"
+msgid "Profiling"
+msgstr "Profileren"
#: src/settings_translation_file.cpp
msgid ""
@@ -3763,7 +3956,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Raises terrain to make valleys around the rivers"
-msgstr ""
+msgstr "Verhoogt het terrein om rond de rivieren valleien te maken"
#: src/settings_translation_file.cpp
msgid "Random input"
@@ -3786,6 +3979,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr "Vervangt het standaard hoofdmenu door een ander."
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Rapport pad"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Toets voor rechts"
@@ -3795,19 +3992,21 @@ msgstr "Rechts-klik herhalingsinterval"
#: src/settings_translation_file.cpp
msgid "River Depth"
-msgstr ""
+msgstr "Diepte van rivieren"
#: src/settings_translation_file.cpp
msgid "River Noise"
-msgstr ""
+msgstr "Rivier ruis parameters"
#: src/settings_translation_file.cpp
msgid "River Size"
-msgstr ""
+msgstr "Grootte van rivieren"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
msgstr ""
+"Rivier ruis parameters.\n"
+"Rivieren komen voor in de buurt van niveau 0"
#: src/settings_translation_file.cpp
msgid "Rollback recording"
@@ -3856,14 +4055,12 @@ msgid "Screenshot folder"
msgstr "Map voor screenshots"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Map voor screenshots"
+msgstr "Formaat voor screenshots"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Screenshot"
+msgstr "Screenshot kwaliteit"
#: src/settings_translation_file.cpp
msgid ""
@@ -3871,6 +4068,9 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"Kwaliteit van screenshots. Enkel voot JPEG.\n"
+"Van 1 (slechtst) tot 100 (best).\n"
+"0 = een redelijke standaardwaarde."
#: src/settings_translation_file.cpp
msgid "Security"
@@ -3957,12 +4157,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
-"Shaders maken bijzondere visuele effecten mogelijk, en kunnen op sommige "
-"videokaarten ook de snelheid verhogen.\n"
+"Shaders maken bijzondere visuele effecten mogelijk, en kunnen op sommige\n"
+"videokaarten ook sneller zijn.\n"
"Alleen mogelijk met OpenGL."
#: src/settings_translation_file.cpp
@@ -3975,7 +4175,7 @@ msgstr "Toon debug informatie"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Toon selectie-box voor objecten"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -3991,7 +4191,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Slope and fill work together to modify the heights"
-msgstr ""
+msgstr "Helling en vulling bepalen in combinatie de hoogte"
#: src/settings_translation_file.cpp
msgid "Smooth lighting"
@@ -3999,10 +4199,11 @@ msgstr "Vloeiende verlichting"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
"Maakt camerabewegingen vloeiender bij het rondkijken.\n"
+"Wordt ook wel zicht- of muis-smoothing genoemd.\n"
"Nuttig bij het opnemen van videos."
#: src/settings_translation_file.cpp
@@ -4016,7 +4217,7 @@ msgstr "Maakt camera-rotatie vloeiender. O om uit te zetten."
#: src/settings_translation_file.cpp
msgid "Sneak key"
-msgstr "Kruipen toets"
+msgstr "Sluipen toets"
#: src/settings_translation_file.cpp
msgid "Sound"
@@ -4041,11 +4242,11 @@ msgstr "Vast geboortepunt"
#: src/settings_translation_file.cpp
msgid "Strength of generated normalmaps."
-msgstr ""
+msgstr "Sterkte van de normal-maps."
#: src/settings_translation_file.cpp
msgid "Strength of parallax."
-msgstr ""
+msgstr "Sterkte van de parallax."
#: src/settings_translation_file.cpp
msgid "Strict protocol checking"
@@ -4053,7 +4254,7 @@ msgstr "Stricte protocolcontrole"
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "Ondersteuning voor oudere servers"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
@@ -4061,7 +4262,7 @@ msgstr "Sqlite synchrone modus"
#: src/settings_translation_file.cpp
msgid "Terrain Height"
-msgstr ""
+msgstr "Terrein hoogte"
#: src/settings_translation_file.cpp
msgid ""
@@ -4069,6 +4270,9 @@ msgid ""
"Controls proportion of world area covered by hills.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Terrein ruis-grens voor heuvels.\n"
+"Bepaalt hoeveel van de wereld bedekt is met heuvels.\n"
+"Een lagere waarde (richting 0.0) geeft meer heuvels."
#: src/settings_translation_file.cpp
msgid ""
@@ -4076,6 +4280,9 @@ msgid ""
"Controls proportion of world area covered by lakes.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Terrein ruis-grens voor meren.\n"
+"Bepaalt hoeveel van de wereld bedekt is met meren.\n"
+"Een lagere waarde (richting 0.0) geeft meer meren."
#: src/settings_translation_file.cpp
msgid "Texture path"
@@ -4083,11 +4290,27 @@ msgstr "Pad van texturen"
#: src/settings_translation_file.cpp
msgid "The altitude at which temperature drops by 20C"
+msgstr "Het hoogteverschil voor een termperatuurverschil van 20°C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
msgstr ""
+"Het standaardformaat waarin profileringsgegevens worden bewaard,\n"
+" als '/profiler save' wordt aangeroepen zonder expliciet formaat."
#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
+msgstr "De diepte van aarde of andersoortige toplaag"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
msgstr ""
+"Het pad, ten opzichte van het wereld-pad, waar profilerings-gegevens worden "
+"opgeslagen.\n"
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
@@ -4108,11 +4331,23 @@ msgstr "Het Irrlicht backend voor renderen."
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"De gevoeligheid van de assen van de joystick voor het bewegen van de "
+"frustrum in het spel."
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
"set to the nearest valid value."
msgstr ""
+"De sterke van node ambient-occlusie shading effect.\n"
+"Lagere waarden geven een donkerder effect. Hoger is lichter.\n"
+"Geldige waarden zijn van 0.25 tot 4.0. Een ongeldige waarde wordt\n"
+"aangepast naar de dichtstbijzijnde geldige waarde."
#: src/settings_translation_file.cpp
msgid ""
@@ -4127,10 +4362,18 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"De tijd in seconden tussen herhaalde klikken als de joystick-knop ingedrukt "
+"gehouden wordt."
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
-"De tijd in seconden tussen herhaalde rechts-klikken als de rechter muisknop "
+"De tijd in seconden tussen herhaalde rechts-klikken als de rechter muisknop\n"
"ingedrukt gehouden wordt."
#: src/settings_translation_file.cpp
@@ -4139,7 +4382,7 @@ msgstr "Dit font wordt gebruikt voor bepaalde talen."
#: src/settings_translation_file.cpp
msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "Tijd tussen ABM cycli"
#: src/settings_translation_file.cpp
msgid ""
@@ -4170,9 +4413,9 @@ msgid ""
"This determines how long they are slowed down after placing or removing a "
"node."
msgstr ""
-"Om vertraging te verminderen worden blokken minder snel verstuurd als een "
+"Om vertraging te verminderen worden blokken minder snel verstuurd als een\n"
"speler aan het bouwen is.\n"
-"Deze instelling bepaalt hoelang ze achtergehouden worden nadat een speler "
+"Deze instelling bepaalt hoelang ze achtergehouden worden nadat een speler\n"
"een node geplaatst of verwijderd heeft."
#: src/settings_translation_file.cpp
@@ -4244,36 +4487,32 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "Gebruik tri-lineaire filtering om texturen te schalen."
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Nuttig voor mod-ontwikkelaars."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr "V-Sync"
#: src/settings_translation_file.cpp
msgid "VBO"
-msgstr ""
+msgstr "VBO"
#: src/settings_translation_file.cpp
msgid "Valley Depth"
-msgstr ""
+msgstr "Vallei-diepte"
#: src/settings_translation_file.cpp
msgid "Valley Fill"
-msgstr ""
+msgstr "Vallei-vulling"
#: src/settings_translation_file.cpp
msgid "Valley Profile"
-msgstr ""
+msgstr "Vallei-profiel"
#: src/settings_translation_file.cpp
msgid "Valley Slope"
-msgstr ""
+msgstr "Vallei-helling"
#: src/settings_translation_file.cpp
msgid "Valleys C Flags"
-msgstr ""
+msgstr "Valleien vlaggen"
#: src/settings_translation_file.cpp
msgid "Vertical screen synchronization."
@@ -4292,6 +4531,8 @@ msgid ""
"View distance in nodes.\n"
"Min = 20"
msgstr ""
+"Zichtafstand in nodes.\n"
+"Minimaal: 20"
#: src/settings_translation_file.cpp
msgid "View range decrease key"
@@ -4302,23 +4543,23 @@ msgid "View range increase key"
msgstr "Toets voor vergroten zichtafstand"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Viewing range"
-msgstr "Maximale zichtafstand"
+msgstr "Zichtafstand"
#: src/settings_translation_file.cpp
msgid "Volume"
msgstr "Geluidsniveau"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"W co-ordinate of the generated 3D slice of a 4D fractal.\n"
"Determines which 3D slice of the 4D shape is generated.\n"
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
-"Juliaverzameling: W-coördinaat van de 3D doorsnede van de 4D vorm.\n"
+"W-coördinaat van de 3D doorsnede van de 4D vorm.\n"
+"Bepaalt welke 3D-doorsnelde van de 4D-vorm gegenereerd wordt.\n"
+"Heeft geen effect voor 3D-fractals.\n"
"Bereik is ongeveer -2 tot 2."
#: src/settings_translation_file.cpp
@@ -4326,9 +4567,8 @@ msgid "Walking speed"
msgstr "Loopsnelheid"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Water Features"
-msgstr "Waterniveau"
+msgstr "Ondergronds water"
#: src/settings_translation_file.cpp
msgid "Water level"
@@ -4382,8 +4622,13 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
+"Als gui_scaling_filter_txr2img aan staat, worden plaatjes\n"
+"van de GPU naar het werkgeheugen gekopiëerd voor schalen.\n"
+"Anders wordt de oude methode gebruikt, voor video-kaarten\n"
+"die geen ondersteuning hebben voor het kopiëren van texturen\n"
+"terug naar het werkgeheugen."
#: src/settings_translation_file.cpp
msgid ""
@@ -4404,7 +4649,8 @@ msgstr ""
"aanbevolen\n"
"machten van 2 te gebruiken. Een waarde groter dan 1 heeft wellicht geen "
"zichtbaar\n"
-"effect indien bi-lineaire, tri-lineaire of anisotropische niet aan staan."
+"effect indien bi-lineaire, tri-lineaire of anisotropische filtering niet aan "
+"staan."
#: src/settings_translation_file.cpp
msgid ""
@@ -4417,10 +4663,14 @@ msgid ""
msgstr ""
"Grenzen van de wereldgenerator.\n"
"- Maximale waarde: 31000 (hogere waarden worden niet gehonoreerd).\n"
-"- De wereld wordt gegenereerd per gebied van 80x80x80 nodes (5x5x5 "
-"mapblokken).\n"
-"- Het centrum-gebied begint op coördinaten (-32, -32, -32).\n"
-"- Enkel groepen die vallen binnen map_generation_limit worden gegenereerd"
+"- De wereld wordt standaard gegenereerd per gebied van 80x80x80 nodes\n"
+" (5x5x5 mapblokken).\n"
+"- Coordinaat (0,0,0) bevindt zich zoveel mogelijk in het centrum van een "
+"gebied.\n"
+" Dat betekent dat standaard, het meest centrale gebied begint op "
+"coördinaat (-32,-32,-32)\n"
+"- Enkel gebieden (van standaard 5x5x5 blokken) die geheel vallen binnen\n"
+" map_generation_limit worden gegenereerd"
#: src/settings_translation_file.cpp
msgid ""
@@ -4453,8 +4703,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Whether to fog out the end of the visible area."
-msgstr ""
-"Maak het einde van het zichtbereik mistig, zodat het einde niet opvalt."
+msgstr "Maak het einde van het zichtbereik mistig, zodat het einde niet opvalt."
#: src/settings_translation_file.cpp
msgid ""
@@ -4470,11 +4719,15 @@ msgid ""
"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
"Disabling this option will protect your password better."
msgstr ""
+"Ondersteuning voor oudere servers (vóór protocol versie 25).\n"
+"Schakel dit in voor verbinden met servers versie 0.4.12 en eerder.\n"
+"Voor servers vanaf 0.4.13 is dit niet nodig. Dit geldt ook voor\n"
+"sommige servers versie 0.4.12-dev.\n"
+"Indien dit uit staat, wordt het wachtwoord op een veiligere manier verzonden."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Width component of the initial window size."
-msgstr "Horizontale aanvangsgroote van het window."
+msgstr "Aanvangsbreedte van het venster."
#: src/settings_translation_file.cpp
msgid "Width of the selectionbox's lines around nodes."
@@ -4491,11 +4744,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
-msgstr ""
+msgstr "Niveau van de oppervlakte (Y-coördinaat)."
#: src/settings_translation_file.cpp
msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "Minimale diepte van grote semi-willekeurige grotten."
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
@@ -4509,209 +4762,141 @@ msgstr "Maximaal parallellisme in cURL"
msgid "cURL timeout"
msgstr "cURL timeout"
-#~ msgid "Item textures..."
-#~ msgstr "Voorwerp-texturen..."
-
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
#~ msgstr ""
-#~ "Maak de wateroppervlakte iets lager, zodat het niet de hele node vult.\n"
-#~ "Dit is niet echt geoptimaliseerd, en vloeiende belichting van de\n"
-#~ "wateroppervlakte werkt niet als dit is aangeschakeld."
+#~ "Gedetailleerde profiling-data voor mods. Nuttig voor mod-ontwikkelaars."
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr "Laat geselecteerde nodes oplichten (schakelt selectie-randen uit)."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Gedetailleerde profiling van mods"
#~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
#~ msgstr ""
-#~ "Juliaverzameling: (X,Y,X) afstanden van wereld-centrum.\n"
-#~ "Bereik is ongeveer -2 tot 2. Vermenigvuldig met j_scale voor de afstand "
-#~ "in nodes."
+#~ "Het aantal blokken dat totaal tegelijk onderweg kan zijn, voor de hele "
+#~ "server."
-#~ msgid ""
-#~ "Julia set: W value determining the 4D shape.\n"
-#~ "Range roughly -2 to 2."
-#~ msgstr ""
-#~ "Juliaverzameling: W-waarde van de 4D vorm.\n"
-#~ "Bereik is ongeveer -2 tot 2."
-
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Toets voor het verkleinen van de zichtafstand. Dit verandert de minimale "
-#~ "zichtafstand.\n"
-#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Het aantal blokken dat per cliënt tegelijk onderweg kan zijn."
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Toets voor het vergroten van de zichtafstand. Dit verandert de minimale "
-#~ "zichtafstand.\n"
-#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Nuttig voor mod-ontwikkelaars."
-#~ msgid ""
-#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
-#~ msgstr ""
-#~ "Mandelbrot verzameling: (X,Y,Z) afstanden vanaf wereld-centrum.\n"
-#~ " Bereik is ongeveer -2 tot 2. Vermenigvuldig met m_scale voor de afstand "
-#~ "in nodes."
+#~ msgid "No of course not!"
+#~ msgstr "Nee, natuurlijk niet!"
-#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
-#~ msgstr "Mandelbrot verzameling: (X,Y,Z) schaal, in nodes (bij benadering)."
+#~ msgid "Public Serverlist"
+#~ msgstr "Publieke Serverlijst"
-#~ msgid ""
-#~ "Mandelbrot set: Iterations of the recursive function.\n"
-#~ "Controls scale of finest detail."
-#~ msgstr ""
-#~ "Mandelbrot verzameling: Aantal iteraties van de recursieve functie.\n"
-#~ "Bepaalt de schaal van de kleinste details."
+#~ msgid "No!!!"
+#~ msgstr "Nee!!!"
+#, fuzzy
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen fractal.\n"
-#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
#~ msgstr ""
-#~ "Wereldgeneratie instellingen voor de fractal generator.\n"
-#~ "'julia' selecterd een julia-verzameling in plaats van een mandebrot-"
-#~ "verzameling.\n"
+#~ "Algemene wereldgenerator instellingen.\n"
#~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
#~ "waarde.\n"
-#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
-
-#~ msgid "Mapgen fractal mandelbrot iterations"
-#~ msgstr "Fractal wereldgenerator mandelbrot iteraties"
-
-#~ msgid "Mapgen fractal mandelbrot offset"
-#~ msgstr "Fractal wereldgenerator mandelbrot centrum-afstand"
-
-#~ msgid "Mapgen fractal mandelbrot scale"
-#~ msgstr "Fractal wereldgenerator mandelbrot schaal"
-
-#~ msgid "Mapgen fractal mandelbrot slice w"
-#~ msgstr "Fractal wereldgenerator mandelbrot w-doorsnede"
-
-#~ msgid ""
-#~ "Maximum distance above water level for player spawn.\n"
-#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
-#~ "Smaller values may result in a suitable spawn point not being found,\n"
-#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
-#~ msgstr ""
-#~ "Maximum hoogte boven waterniveau waar een speler geboren wordt.\n"
-#~ "Bij hogere waarden zullen de plaatsen dichter bij (x = 0, z = 0) liggen.\n"
-#~ "Bij lagere waarden kan het zijn dat een geschikte plek niet gevonden "
-#~ "wordt,\n"
-#~ "in dat geval wordt de speler geboren op (0, 0, 0), mogelijk onder de "
-#~ "grond."
+#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten.\n"
+#~ "'trees' en 'flat' zijn enkel van toepassing in mgv6."
-#~ msgid ""
-#~ "Minimum wanted FPS.\n"
-#~ "The amount of rendered stuff is dynamically set according to this. and "
-#~ "viewing range min and max."
-#~ msgstr ""
-#~ "Minimaal gewenste FPS.\n"
-#~ "De hoeveelheid gerenderd materiaal wordt aangepast afhankelijk van deze "
-#~ "waarde, en van de min en max zichtafstanden."
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "MP uitschakelen"
-#~ msgid "New style water"
-#~ msgstr "Nieuw water"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "ingeschakeld"
-#~ msgid ""
-#~ "Pre-generate all item visuals used in the inventory.\n"
-#~ "This increases startup time, but runs smoother in-game.\n"
-#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
-#~ "the inventory."
-#~ msgstr ""
-#~ "Genereer beelden van objecten in de rugzak vooraf.\n"
-#~ "De start-tijd wordt hierdoor langer, maar het spel wordt vloeiender.\n"
-#~ "Dit kost veel geheugen op de videokaart. Als die onvoldoende geheugen "
-#~ "heeft kan dit resulteren in vreemde effecten."
+#~ msgid "Rendering:"
+#~ msgstr "Rendering:"
-#~ msgid "Preload inventory textures"
-#~ msgstr "Laad rugzak-texturen vooraf"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "Herstart minetest om de driver te activeren"
-#~ msgid "Vertical initial window size."
-#~ msgstr "Aanvangshoogte van het window."
+#~ msgid "Game Name"
+#~ msgstr "Spel"
-#~ msgid "Vertical spawn range"
-#~ msgstr "Vertikaal geboortegebied"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Kan mod \"$1\" niet naar spel \"$2\" kopiëren"
-#~ msgid "Viewing range minimum"
-#~ msgstr "Minimale zichtafstand"
+#~ msgid "GAMES"
+#~ msgstr "SPELLEN"
-#~ msgid "Wanted FPS"
-#~ msgstr "Gewenste FPS"
+#~ msgid "Mods:"
+#~ msgstr "Mods:"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Reset Singleplayer wereld"
+#~ msgid "new game"
+#~ msgstr "nieuw spel"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Schaal-factor toegepast op menu elementen: "
+#~ msgid "EDIT GAME"
+#~ msgstr "SPEL AANPASSEN"
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Downloaden"
+#~ msgid "Remove selected mod"
+#~ msgstr "Geselecteerde mod verwijderen"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Linkermuisknop: Verplaats alle items. Rechtermuisknop: Verplaats één item"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Mod toevoegen"
-#~ msgid "is required by:"
-#~ msgstr "is benodigd voor:"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
-#~ msgid "Configuration saved. "
-#~ msgstr "Instellingen bewaard. "
+#~ msgid "START SERVER"
+#~ msgstr "START SERVER"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Waarschuwing: Instellingen niet consistent. "
+#~ msgid "Name"
+#~ msgstr "Naam"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Kan geen nieuwe wereld aanmaken: de naam bevat onjuiste tekens"
+#~ msgid "Password"
+#~ msgstr "Wachtwoord"
-#~ msgid "Show Public"
-#~ msgstr "Publieke server"
+#~ msgid "SETTINGS"
+#~ msgstr "INSTELLINGEN"
-#~ msgid "Show Favorites"
-#~ msgstr "Favourieten"
+#~ msgid "Preload item visuals"
+#~ msgstr "Voorwerpen vooraf laden"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Laat het adres leeg om een lokale server te starten."
+#~ msgid "Finite Liquid"
+#~ msgstr "Eindige vloeistoffen"
-#~ msgid "Create world"
-#~ msgstr "Maak wereld aan"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "SINGLEPLAYER"
-#~ msgid "Address required."
-#~ msgstr "IP-adres nodig."
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "TEXTUREN"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Kan niets verwijderen: Geen wereld geselecteerd"
+#~ msgid "MODS"
+#~ msgstr "MODS"
-#~ msgid "Files to be deleted"
-#~ msgstr "Deze bestanden worden verwijderd"
+#~ msgid "Add mod:"
+#~ msgstr "Mod toevoegen:"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Kan geen wereld aanmaken: Geen games gevonden"
+#~ msgid "Local install"
+#~ msgstr "Plaatselijk installeren"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Kan instellingen niet aanpassen: Niets geselecteerd"
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Let op: Nog niet alle mods zijn geconfigueerd. \n"
+#~ "De mods zullen automatisch worden ingeschakeld als je de configuratie "
+#~ "bewaard. "
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Niet alle bestanden zijn verwijderd"
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "LEt op: Sommige ingestelde mods zijn vermist.\n"
+#~ "Hun instellingen worden verwijderd als je de configuratie opslaat. "
#~ msgid ""
#~ "Default Controls:\n"
@@ -4738,131 +4923,236 @@ msgstr "cURL timeout"
#~ "- ESC: Menu\n"
#~ "- T: Chat\n"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "LEt op: Sommige ingestelde mods zijn vermist.\n"
-#~ "Hun instellingen worden verwijderd als je de configuratie opslaat. "
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Niet alle bestanden zijn verwijderd"
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Let op: Nog niet alle mods zijn geconfigueerd. \n"
-#~ "De mods zullen automatisch worden ingeschakeld als je de configuratie "
-#~ "bewaard. "
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Kan instellingen niet aanpassen: Niets geselecteerd"
-#~ msgid "Local install"
-#~ msgstr "Plaatselijk installeren"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Kan geen wereld aanmaken: Geen games gevonden"
-#~ msgid "Add mod:"
-#~ msgstr "Mod toevoegen:"
+#~ msgid "Files to be deleted"
+#~ msgstr "Deze bestanden worden verwijderd"
-#~ msgid "MODS"
-#~ msgstr "MODS"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Kan niets verwijderen: Geen wereld geselecteerd"
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "TEXTUREN"
+#~ msgid "Address required."
+#~ msgstr "IP-adres nodig."
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "SINGLEPLAYER"
+#~ msgid "Create world"
+#~ msgstr "Maak wereld aan"
-#~ msgid "Finite Liquid"
-#~ msgstr "Eindige vloeistoffen"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Laat het adres leeg om een lokale server te starten."
-#~ msgid "Preload item visuals"
-#~ msgstr "Voorwerpen vooraf laden"
+#~ msgid "Show Favorites"
+#~ msgstr "Favourieten"
-#~ msgid "SETTINGS"
-#~ msgstr "INSTELLINGEN"
+#~ msgid "Show Public"
+#~ msgstr "Publieke server"
-#~ msgid "Password"
-#~ msgstr "Wachtwoord"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Kan geen nieuwe wereld aanmaken: de naam bevat onjuiste tekens"
-#~ msgid "Name"
-#~ msgstr "Naam"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Waarschuwing: Instellingen niet consistent. "
-#~ msgid "START SERVER"
-#~ msgstr "START SERVER"
+#~ msgid "Configuration saved. "
+#~ msgstr "Instellingen bewaard. "
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "is required by:"
+#~ msgstr "is benodigd voor:"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Mod toevoegen"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Linkermuisknop: Verplaats alle items. Rechtermuisknop: Verplaats één item"
-#~ msgid "Remove selected mod"
-#~ msgstr "Geselecteerde mod verwijderen"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Downloaden"
-#~ msgid "EDIT GAME"
-#~ msgstr "SPEL AANPASSEN"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Schaal-factor toegepast op menu elementen: "
-#~ msgid "new game"
-#~ msgstr "nieuw spel"
+#~ msgid "Wanted FPS"
+#~ msgstr "Gewenste FPS"
-#~ msgid "Mods:"
-#~ msgstr "Mods:"
+#~ msgid "Viewing range minimum"
+#~ msgstr "Minimale zichtafstand"
-#~ msgid "GAMES"
-#~ msgstr "SPELLEN"
+#~ msgid "Vertical spawn range"
+#~ msgstr "Vertikaal geboortegebied"
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Kan mod \"$1\" niet naar spel \"$2\" kopiëren"
+#~ msgid "Vertical initial window size."
+#~ msgstr "Aanvangshoogte van het window."
-#~ msgid "Game Name"
-#~ msgstr "Spel"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Laad rugzak-texturen vooraf"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "Herstart minetest om de driver te activeren"
+#~ msgid ""
+#~ "Pre-generate all item visuals used in the inventory.\n"
+#~ "This increases startup time, but runs smoother in-game.\n"
+#~ "The generated textures can easily exceed your VRAM, causing artifacts in "
+#~ "the inventory."
+#~ msgstr ""
+#~ "Genereer beelden van objecten in de rugzak vooraf.\n"
+#~ "De start-tijd wordt hierdoor langer, maar het spel wordt vloeiender.\n"
+#~ "Dit kost veel geheugen op de videokaart. Als die onvoldoende geheugen "
+#~ "heeft kan dit resulteren in vreemde effecten."
-#~ msgid "Rendering:"
-#~ msgstr "Rendering:"
+#~ msgid "New style water"
+#~ msgstr "Nieuw water"
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "ingeschakeld"
+#~ msgid ""
+#~ "Minimum wanted FPS.\n"
+#~ "The amount of rendered stuff is dynamically set according to this. and "
+#~ "viewing range min and max."
+#~ msgstr ""
+#~ "Minimaal gewenste FPS.\n"
+#~ "De hoeveelheid gerenderd materiaal wordt aangepast afhankelijk van deze "
+#~ "waarde, en van de min en max zichtafstanden."
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "MP uitschakelen"
+#~ msgid ""
+#~ "Maximum distance above water level for player spawn.\n"
+#~ "Larger values result in spawn points closer to (x = 0, z = 0).\n"
+#~ "Smaller values may result in a suitable spawn point not being found,\n"
+#~ "resulting in a spawn at (0, 0, 0) possibly buried underground."
+#~ msgstr ""
+#~ "Maximum hoogte boven waterniveau waar een speler geboren wordt.\n"
+#~ "Bij hogere waarden zullen de plaatsen dichter bij (x = 0, z = 0) liggen.\n"
+#~ "Bij lagere waarden kan het zijn dat een geschikte plek niet gevonden "
+#~ "wordt,\n"
+#~ "in dat geval wordt de speler geboren op (0, 0, 0), mogelijk onder de "
+#~ "grond."
+
+#~ msgid "Mapgen fractal mandelbrot slice w"
+#~ msgstr "Fractal wereldgenerator mandelbrot w-doorsnede"
+
+#~ msgid "Mapgen fractal mandelbrot scale"
+#~ msgstr "Fractal wereldgenerator mandelbrot schaal"
+
+#~ msgid "Mapgen fractal mandelbrot offset"
+#~ msgstr "Fractal wereldgenerator mandelbrot centrum-afstand"
+
+#~ msgid "Mapgen fractal mandelbrot iterations"
+#~ msgstr "Fractal wereldgenerator mandelbrot iteraties"
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "Map generation attributes specific to Mapgen fractal.\n"
+#~ "'julia' selects a julia set to be generated instead of a mandelbrot set.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
#~ "Flags starting with \"no\" are used to explicitly disable them."
#~ msgstr ""
-#~ "Wereldgenerator instellingen specified voor generator v7.\n"
-#~ "\"ridges\" zijn rivieren.\n"
+#~ "Wereldgeneratie instellingen voor de fractal generator.\n"
+#~ "'julia' selecterd een julia-verzameling in plaats van een mandebrot-"
+#~ "verzameling.\n"
#~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
#~ "waarde.\n"
#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
+#~ msgid ""
+#~ "Mandelbrot set: Iterations of the recursive function.\n"
+#~ "Controls scale of finest detail."
+#~ msgstr ""
+#~ "Mandelbrot verzameling: Aantal iteraties van de recursieve functie.\n"
+#~ "Bepaalt de schaal van de kleinste details."
+
+#~ msgid "Mandelbrot set: Approximate (X,Y,Z) scales in nodes."
+#~ msgstr "Mandelbrot verzameling: (X,Y,Z) schaal, in nodes (bij benadering)."
+
+#~ msgid ""
+#~ "Mandelbrot set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by m_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Mandelbrot verzameling: (X,Y,Z) afstanden vanaf wereld-centrum.\n"
+#~ " Bereik is ongeveer -2 tot 2. Vermenigvuldig met m_scale voor de afstand "
+#~ "in nodes."
+
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Toets voor het vergroten van de zichtafstand. Dit verandert de minimale "
+#~ "zichtafstand.\n"
+#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Toets voor het verkleinen van de zichtafstand. Dit verandert de minimale "
+#~ "zichtafstand.\n"
+#~ "Zie http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#~ msgid ""
+#~ "Julia set: W value determining the 4D shape.\n"
+#~ "Range roughly -2 to 2."
+#~ msgstr ""
+#~ "Juliaverzameling: W-waarde van de 4D vorm.\n"
+#~ "Bereik is ongeveer -2 tot 2."
+
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Juliaverzameling: (X,Y,X) afstanden van wereld-centrum.\n"
+#~ "Bereik is ongeveer -2 tot 2. Vermenigvuldig met j_scale voor de afstand "
+#~ "in nodes."
+
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr "Laat geselecteerde nodes oplichten (schakelt selectie-randen uit)."
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Maak de wateroppervlakte iets lager, zodat het niet de hele node vult.\n"
+#~ "Dit is niet echt geoptimaliseerd, en vloeiende belichting van de\n"
+#~ "wateroppervlakte werkt niet als dit is aangeschakeld."
+
+#~ msgid "Item textures..."
+#~ msgstr "Voorwerp-texturen..."
+
#, fuzzy
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen v7.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
#~ msgstr ""
-#~ "Algemene wereldgenerator instellingen.\n"
+#~ "Wereldgenerator instellingen specified voor generator v6.\n"
+#~ "Indien sneeuwgebieden aanstaan, dan worden oerwouden ook aangezet, en wordt "
+#~ "de \"jungles\" vlag genegeerd.\n"
#~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
#~ "waarde.\n"
-#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten.\n"
-#~ "'trees' en 'flat' zijn enkel van toepassing in mgv6."
-
-#~ msgid "No!!!"
-#~ msgstr "Nee!!!"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Publieke Serverlijst"
+#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
-#~ msgid "No of course not!"
-#~ msgstr "Nee, natuurlijk niet!"
+#, fuzzy
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "Wereldgenerator instellingen specified voor generator v7.\n"
+#~ "\"ridges\" zijn rivieren.\n"
+#~ "Vlaggen die niet in de lijst van vlaggen staan, behouden hun standaard-"
+#~ "waarde.\n"
+#~ "Zet \"no\" voor een vlag om hem expliciet uit te zetten."
diff --git a/po/pl/minetest.po b/po/pl/minetest.po
index ea404e32b..b767a560a 100644
--- a/po/pl/minetest.po
+++ b/po/pl/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-24 19:38+0000\n"
-"Last-Translator: red-001 <red-001@openmailbox.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-08 17:20+0000\n"
+"Last-Translator: Jakub Mendel <jimikuba@o2.pl>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/minetest/minetest/"
"pl/>\n"
"Language: pl\n"
@@ -18,11 +18,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.9\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Wystąpił błąd w skrypcie modyfikacji:"
+msgstr "Wystąpił błąd w skrypcie Lua modyfikacji:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -54,24 +54,25 @@ msgstr "Niezgodne wersje protokołów. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr "Serwer narzuca wersję protokołu $1. "
+msgstr "Serwer żąda użycia protokołu w wersji $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr "Serwer wspiera wersje protokołu od $1 do $2. "
+msgstr "Serwer wspiera protokoły w wersjach od $1 do $2. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
-"Spróbuj włączyć ponownie publiczną listę serwerów i sprawdź połączenie."
+"Spróbuj ponownie włączyć publiczną listę serwerów i sprawdź swoje połączenie "
+"internetowe."
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr "Wspieramy tylko protokół w wersji $1."
+msgstr "Wspieramy wyłącznie protokół w wersji $1."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
-msgstr "Wspieramy protokół w wersji od $1 do $2."
+msgstr "Wspieramy protokoły w wersji od $1 do $2."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -87,11 +88,11 @@ msgstr "Zależy od:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Disable MP"
-msgstr "Wyłącz MP"
+msgstr "Wyłącz paczkę modów"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable MP"
-msgstr "WÅ‚Ä…cz MP"
+msgstr "Włącz paczkę modów"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
@@ -102,8 +103,8 @@ msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
msgstr ""
-"Nie można włączyć moda \"$1\" gdyż nazwa zawiera niedozwolone znaki. "
-"Dozwolone sÄ… znaki [a-z0-9_]."
+"Nie udało się aktywować moda \"$1\", ponieważ zawiera niedozwolone znaki. "
+"Tylko znaki [a-z0-9_] sÄ… dozwolone."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
@@ -111,7 +112,7 @@ msgstr "Ukryj GrÄ™"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide mp content"
-msgstr "Ukryj zawartość MP"
+msgstr "Ukryj zawartość paczki modów"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
@@ -140,11 +141,11 @@ msgstr "Utwórz"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "ÅšciÄ…gnij podgrÄ™, takÄ… jak minetest_game, z minetest.net"
+msgstr "Pobierz tryb gry (np. minetest_game), z minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
-msgstr "ÅšciÄ…gninj z minetest.net"
+msgstr "ÅšciÄ…gnij takÄ… z minetest.net"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@@ -160,11 +161,12 @@ msgstr "Nie podano nazwy świata lub nie wybrano gry"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Seed"
-msgstr "Ziarno"
+msgstr "Ziarno losowości"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The minimal development test is meant for developers."
-msgstr "Ostrzeżenie: Gra minimalna jest przeznaczona dla dewelperów."
+msgstr ""
+"Uwaga: Minimal development test jest przeznaczony tylko dla developerów."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
@@ -172,7 +174,7 @@ msgstr "Nazwa świata"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
-msgstr "Nie masz zainstalowanych żadnych podgier."
+msgstr "Nie zainstalowano żadnych trybów gry."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
@@ -210,7 +212,7 @@ msgstr "\"$1\" nie jest poprawnÄ… flagÄ…."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr "(Brak opisu ustawienia)"
+msgstr "(brak opisu)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
@@ -241,8 +243,8 @@ msgid ""
"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
msgstr ""
-"Składnia: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
-"<octaves>, <persistence>"
+"Format: <offset>, <skala>, (<rozpiętośćX>, <rozpiętośćY>, <rozpiętośćZ>), "
+"<ziarno>, <oktawy>, <trwanie>"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
@@ -262,15 +264,15 @@ msgstr "Wprowadź listę flag oddzielonych przecinkami."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
-msgstr "Wprowadź poprawną liczbę całkowitą."
+msgstr "Proszę wpisać prawidłową liczbę."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid number."
-msgstr "Wprowadź poprawną liczbę."
+msgstr "Proszę wpisać prawidłowy numer."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Possible values are: "
-msgstr "Możliwe wartości: "
+msgstr "Możliwe wartości to: "
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
@@ -282,15 +284,15 @@ msgstr "Wybierz ścieżkę"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Show technical names"
-msgstr "Pokaż nazwy ustawień"
+msgstr "Pokaż nazwy techniczne"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be greater than $1."
-msgstr "Wartość musi być większa od $1."
+msgstr "Wartość musi być większa niż $1."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "The value must be lower than $1."
-msgstr "Wartość musi być mniejsza od $1."
+msgstr "Wartość musi być mniejsza niż $1."
#: builtin/mainmenu/modmgr.lua
msgid ""
@@ -298,7 +300,7 @@ msgid ""
"Install Mod: unsupported filetype \"$1\" or broken archive"
msgstr ""
"\n"
-"Instalacja moda: nieznany typ pliku \"$1\" lub archiwum uszkodzone"
+"Instalacja moda: nieznany typ pliku \"$1\" lub uszkodzone archiwum"
#: builtin/mainmenu/modmgr.lua
msgid "Failed to install $1 to $2"
@@ -319,7 +321,7 @@ msgstr ""
#: builtin/mainmenu/store.lua
msgid "Close store"
-msgstr "Zamknij sklep"
+msgstr "Zamknij"
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
@@ -343,11 +345,11 @@ msgstr "Szukaj"
#: builtin/mainmenu/store.lua
msgid "Shortname:"
-msgstr "Nazwa świata:"
+msgstr "Nazwa skrócona:"
#: builtin/mainmenu/store.lua
msgid "Successfully installed:"
-msgstr "Udana instalacja:"
+msgstr "Zainstalowano pomyślnie:"
#: builtin/mainmenu/store.lua
msgid "Unsorted"
@@ -375,7 +377,7 @@ msgstr "Byli współautorzy"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Core Developers"
-msgstr "Poprzedni Główni Twórcy"
+msgstr "Poprzedni Główni Deweloperzy"
#: builtin/mainmenu/tab_mods.lua
msgid "Installed Mods:"
@@ -387,7 +389,7 @@ msgstr "Informacje o modzie:"
#: builtin/mainmenu/tab_mods.lua
msgid "No mod description available"
-msgstr "Brak informacji o modzie"
+msgstr "Brak dostępnych informacji o modzie"
#: builtin/mainmenu/tab_mods.lua
msgid "Rename"
@@ -403,12 +405,11 @@ msgstr "Usuń zaznaczony modyfikację"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected modpack"
-msgstr "Usuń zaznaczony modpack"
+msgstr "Odinstaluj wybraną paczkę modów"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "Adres / Port :"
+msgstr "Adres / Port"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -427,19 +428,16 @@ msgid "Damage enabled"
msgstr "Obrażenia włączone"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Del. Favorite"
-msgstr "Ulubione:"
+msgstr "Usuń ulubiony"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Favorite"
-msgstr "Ulubione:"
+msgstr "Ulubione"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Nazwa gracza / Hasło :"
+msgstr "Nazwa gracza / Hasło"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -447,7 +445,7 @@ msgstr "PvP włączone"
#: builtin/mainmenu/tab_server.lua
msgid "Bind Address"
-msgstr "Przypisz Adres"
+msgstr "Adres"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Configure"
@@ -473,7 +471,7 @@ msgstr "Nowy"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "No world created or selected!"
-msgstr "Nie stworzono lub nie wybrano świata!"
+msgstr "Nie wybrano bądź nie utworzono świata!"
#: builtin/mainmenu/tab_server.lua
msgid "Port"
@@ -524,16 +522,14 @@ msgid "Antialiasing:"
msgstr "Antyaliasing:"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Are you sure to reset your singleplayer world?"
-msgstr "Pojedynczy gracz"
+msgstr "Jesteś pewny że chcesz zresetować świat singleplayer?"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
msgstr "Filtrowanie dwuliniowe"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
msgstr "Mapowanie wypukłości"
@@ -570,23 +566,20 @@ msgid "No Mipmap"
msgstr "Mip-Mappowanie wyłączone"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Highlighting"
-msgstr "Płynne oświetlenie"
+msgstr "Podświetlanie bloku"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
-msgstr "Płynne oświetlenie"
+msgstr "Obramowanie bloków"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
msgstr "Brak"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "Mip-Mappowanie"
+msgstr "Mapowanie normalnych"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -601,11 +594,14 @@ msgid "Parallax Occlusion"
msgstr "Mapowanie paralaksy"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
msgstr "WÅ‚Ä…cz Efekty CzÄ…steczkowe"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Resetuj świat pojedynczego gracza"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Ustawienia"
@@ -627,35 +623,31 @@ msgstr "Teksturowanie:"
#: builtin/mainmenu/tab_settings.lua
msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr ""
+msgstr "Sterownik OpenGL jest wymagany aby włączyć shadery."
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
-#, fuzzy
msgid "Tone Mapping"
-msgstr "Mip-Mappowanie"
+msgstr "Tone Mapping"
#: builtin/mainmenu/tab_settings.lua
msgid "Touchthreshold (px)"
-msgstr ""
+msgstr "Próg dotyku (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
msgstr "Filtrowanie trójliniowe"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Leaves"
-msgstr "Ozdobne drzewa"
+msgstr "Falujące liście"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Plants"
-msgstr "Ozdobne drzewa"
+msgstr "Falujące rośliny"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Waving Water"
-msgstr "Ozdobne drzewa"
+msgstr "FalujÄ…ca woda"
#: builtin/mainmenu/tab_settings.lua
msgid "Yes"
@@ -663,7 +655,7 @@ msgstr "Tak"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Config mods"
-msgstr "Skonfiguruj mody"
+msgstr "Ustawienia modów"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Main"
@@ -695,19 +687,19 @@ msgstr "Paczki tekstur"
#: src/client.cpp
msgid "Connection timed out."
-msgstr "Przekroczono limit czasu połączenia."
+msgstr "Upłynął czas połączenia."
#: src/client.cpp
msgid "Done!"
-msgstr "Zrobione!"
+msgstr "Gotowe!"
#: src/client.cpp
msgid "Initializing nodes"
-msgstr "Initializownie nod"
+msgstr "Inicjalizacja elementów"
#: src/client.cpp
msgid "Initializing nodes..."
-msgstr "Initializowanie nod..."
+msgstr "Inicjalizacja elementów..."
#: src/client.cpp
msgid "Loading textures..."
@@ -715,7 +707,7 @@ msgstr "Åadowanie tekstur..."
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Kompilowanie shaderów..."
+msgstr "Przebudowywanie shaderów..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -739,11 +731,11 @@ msgstr "Nie wybrano świata ani adresu."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr "Nazwa gracza zbyt długa."
+msgstr "Nazwa gracza jest za długa."
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr "Podana ścieżka do świata nie istnieje: "
+msgstr "Podana ścieżka świata nie istnieje: "
#: src/fontengine.cpp
msgid "needs_fallback_font"
@@ -967,7 +959,7 @@ msgstr "Skradanie"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle Cinematic"
-msgstr "Włącz/Wyłącz tryb Cinematic"
+msgstr "Przełącz na tryb Cinematic"
#: src/guiKeyChangeMenu.cpp
msgid "Toggle fast"
@@ -985,6 +977,10 @@ msgstr "Przełącz tryb noclip"
msgid "Use"
msgstr "Użyj"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "naciśnij klawisz"
@@ -1047,7 +1043,7 @@ msgstr "Control"
#: src/keycode.cpp
msgid "Convert"
-msgstr "Convert"
+msgstr "Konwertuj"
#: src/keycode.cpp
msgid "CrSel"
@@ -1058,7 +1054,6 @@ msgid "Down"
msgstr "Dół"
#: src/keycode.cpp
-#, fuzzy
msgid "End"
msgstr "End"
@@ -1076,7 +1071,7 @@ msgstr "ExSel"
#: src/keycode.cpp
msgid "Execute"
-msgstr "Execute"
+msgstr "Wykonaj"
#: src/keycode.cpp
msgid "Final"
@@ -1140,11 +1135,11 @@ msgstr "Minus"
#: src/keycode.cpp
msgid "Mode Change"
-msgstr "Mode Change"
+msgstr "Zmiana Trybu"
#: src/keycode.cpp
msgid "Next"
-msgstr "Next"
+msgstr "Następny"
#: src/keycode.cpp
msgid "Nonconvert"
@@ -1156,59 +1151,59 @@ msgstr "Num Lock"
#: src/keycode.cpp
msgid "Numpad *"
-msgstr "Numpad *"
+msgstr "Numeryczna *"
#: src/keycode.cpp
msgid "Numpad +"
-msgstr "Numpad +"
+msgstr "Numeryczna +"
#: src/keycode.cpp
msgid "Numpad -"
-msgstr "Numpad -"
+msgstr "Numeryczna -"
#: src/keycode.cpp
msgid "Numpad /"
-msgstr "Numpad /"
+msgstr "Numeryczna /"
#: src/keycode.cpp
msgid "Numpad 0"
-msgstr "Numpad 0"
+msgstr "Numeryczna 0"
#: src/keycode.cpp
msgid "Numpad 1"
-msgstr "Numpad 1"
+msgstr "Numeryczna 1"
#: src/keycode.cpp
msgid "Numpad 2"
-msgstr "Numpad 2"
+msgstr "Numeryczna 2"
#: src/keycode.cpp
msgid "Numpad 3"
-msgstr "Numpad 3"
+msgstr "Numeryczna 3"
#: src/keycode.cpp
msgid "Numpad 4"
-msgstr "Numpad 4"
+msgstr "Numeryczna 4"
#: src/keycode.cpp
msgid "Numpad 5"
-msgstr "Numpad 5"
+msgstr "Numeryczna 5"
#: src/keycode.cpp
msgid "Numpad 6"
-msgstr "Numpad 6"
+msgstr "Numeryczna 6"
#: src/keycode.cpp
msgid "Numpad 7"
-msgstr "Numpad 7"
+msgstr "Numeryczna 7"
#: src/keycode.cpp
msgid "Numpad 8"
-msgstr "Numpad 8"
+msgstr "Numeryczna 8"
#: src/keycode.cpp
msgid "Numpad 9"
-msgstr "Numpad 9"
+msgstr "Numeryczna 9"
#: src/keycode.cpp
msgid "OEM Clear"
@@ -1302,10 +1297,6 @@ msgstr "X Button 1"
msgid "X Button 2"
msgstr "X Button 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1314,12 +1305,21 @@ msgid ""
"sets.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"(X, Y, Z) offset fraktalu od centrum świata w jednostkach \"skali\".\n"
+"Używany by przesunąć odpowiednie miejsce do spawnu niskiego podłoża blisko "
+"punktu (0, 0).\n"
+"Domyślny jest odpowiedni dla zbiorów Mandelbrota, wymaga edycji dla zbiorów "
+"Julii.\n"
+"Zakres w przybliżeniu -2 do 2. Pomnożony przez \"skalę\" dla offsetu na "
+"węzłech."
#: src/settings_translation_file.cpp
msgid ""
"0 = parallax occlusion with slope information (faster).\n"
"1 = relief mapping (slower, more accurate)."
msgstr ""
+"0 = parallax occlusion z informacjÄ… nachylenia (szybsze).\n"
+"1 = relief mapping (wolniejsze, bardziej dokładne)."
#: src/settings_translation_file.cpp
msgid "3D clouds"
@@ -1340,63 +1340,89 @@ msgid ""
"- sidebyside: split screen side by side.\n"
"- pageflip: quadbuffer based 3d."
msgstr ""
+"Wsparcie 3D\n"
+"Aktualnie wspierane:\n"
+"- none: bez wyjścia 3d.\n"
+"- anaglyph: cyan/magenta kolor 3d.\n"
+"- interlaced: bazujÄ…cy na polaryzacji parzystej/nieparzystej linii.\n"
+"- topbottom: podzielony ekran góra/dół.\n"
+"- sidebyside: podzielony obok siebie.\n"
+"- pageflip: bazujÄ…cy na quadbuffer."
#: src/settings_translation_file.cpp
msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
+"Wybrane ziarno dla nowej mapy, pozostaw puste dla losowego ziarna.\n"
+"Będzie nadpisane kiedy tworzy się nowy świat w głównym menu."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
msgstr ""
+"Wiadomość wyświetlana wszystkim klientom kiedy serwer zerwie połączenie."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
msgstr ""
+"Wiadomość, która będzie wyświetlona wszystkim klientom kiedy serwer zostanie "
+"wyłączony."
#: src/settings_translation_file.cpp
msgid "Absolute limit of emerge queues"
-msgstr ""
+msgstr "Bezwzględny limit kolejki"
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
-msgstr ""
+msgstr "Przyspieszenie w powietrzu"
#: src/settings_translation_file.cpp
msgid "Active Block Management interval"
-msgstr ""
+msgstr "Interwał zarządzania aktywnym blokiem"
#: src/settings_translation_file.cpp
msgid "Active Block Modifier interval"
-msgstr ""
+msgstr "Interwał modyfikatora aktywnego bloku"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "Interwał modyfikatora aktywnego bloku"
#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr ""
+msgstr "Zasięg aktywnego bloku"
#: src/settings_translation_file.cpp
msgid "Active object send range"
-msgstr ""
+msgstr "Zasięg wysyłania aktywnego obiektu"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Address to connect to.\n"
"Leave this blank to start a local server.\n"
"Note that the address field in the main menu overrides this setting."
msgstr ""
+"Adres połączenia.\n"
+"Pozostaw pusty aby utworzyć lokalny serwer.\n"
+"Zauważ że pole adresu w głównym menu nadpisuje te ustawienie."
#: src/settings_translation_file.cpp
msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
+"Ustaw konfiguracje DPI dla twojego ekranu (nie X11/Tylko Android) np. dla "
+"ekranów 4k."
#: src/settings_translation_file.cpp
msgid ""
"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
"This setting is for the client only and is ignored by the server."
msgstr ""
+"Ustaw enkodowanie gamma dla tablic świateł. Niższe wartości są jaśniejsze.\n"
+"Te ustawienie jest tylko dla klientów i jest ignorowane przez serwer."
#: src/settings_translation_file.cpp
msgid "Advanced"
@@ -1404,11 +1430,11 @@ msgstr "Zaawansowane"
#: src/settings_translation_file.cpp
msgid "Altitude Chill"
-msgstr ""
+msgstr "Wysokość mrozu"
#: src/settings_translation_file.cpp
msgid "Always fly and fast"
-msgstr ""
+msgstr "Zawsze lataj oraz poruszaj siÄ™ szybko"
#: src/settings_translation_file.cpp
msgid "Ambient occlusion gamma"
@@ -1416,16 +1442,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Amplifies the valleys"
-msgstr ""
+msgstr "Wzmacnia doliny"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Anisotropic filtering"
msgstr "Filtrowanie anizotropowe"
#: src/settings_translation_file.cpp
msgid "Announce server"
-msgstr ""
+msgstr "Rozgłoś serwer"
#: src/settings_translation_file.cpp
msgid ""
@@ -1433,49 +1458,54 @@ msgid ""
"If you want to announce your ipv6 address, use serverlist_url = v6.servers."
"minetest.net."
msgstr ""
+"Zgłoś do tej listy serwerów.\n"
+"Jeśli chcesz zgłosić twój adres ipv6, użyj serverlist_url = v6.servers."
+"minetest.net."
#: src/settings_translation_file.cpp
msgid "Approximate (X,Y,Z) scale of fractal in nodes."
-msgstr ""
+msgstr "Przybliżona (X,Y,Z) skala fraktali w węzłach."
#: src/settings_translation_file.cpp
msgid "Ask to reconnect after crash"
-msgstr ""
+msgstr "Poproś o ponowne połączenie po awarii"
#: src/settings_translation_file.cpp
msgid "Automaticaly report to the serverlist."
+msgstr "Automatycznie zgłoś do listy serwerów."
+
+#: src/settings_translation_file.cpp
+msgid "Autorun key"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Backward key"
-msgstr "Tył"
+msgstr "Wstecz"
#: src/settings_translation_file.cpp
msgid "Base terrain height"
-msgstr ""
+msgstr "Bazowa wysokość terenu"
#: src/settings_translation_file.cpp
msgid "Basic"
-msgstr ""
+msgstr "Podstawowy"
#: src/settings_translation_file.cpp
msgid "Basic Privileges"
-msgstr ""
+msgstr "Podstawowe uprawnienia"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bilinear filtering"
msgstr "Filtrowanie dwuliniowe"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Bind address"
-msgstr "Sprawdzanie adresu..."
+msgstr "Sprawdzanie adresu"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Bits per pixel (aka color depth) in fullscreen mode."
-msgstr ""
+msgstr "Bity na pixel (głębia koloru) w trybie pełnoekranowym."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -1483,46 +1513,52 @@ msgid "Build inside player"
msgstr "Gra wieloosobowa"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Wbudowany"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Mapowanie wypukłości"
#: src/settings_translation_file.cpp
msgid "Camera smoothing"
-msgstr ""
+msgstr "Wygładzanie kamery"
#: src/settings_translation_file.cpp
msgid "Camera smoothing in cinematic mode"
-msgstr ""
+msgstr "Wygładzanie kamery w trybie cinematic"
#: src/settings_translation_file.cpp
msgid "Camera update toggle key"
-msgstr ""
+msgstr "Klawisz przełączania kamery"
#: src/settings_translation_file.cpp
msgid "Cave noise #1"
-msgstr ""
+msgstr "Szum jaskini #1"
#: src/settings_translation_file.cpp
msgid "Cave noise #2"
-msgstr ""
+msgstr "Szum jaskini #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Szerokość jaskini"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
-msgstr ""
+msgstr "Jaskinie i tunele tworzą się na przecięciu dwóch szumów"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat key"
-msgstr "Zmień klawisze"
+msgstr "Klawisz czatu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Chat toggle key"
-msgstr "Zmień klawisze"
+msgstr "Klawisz przełączania czatu"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Komenda"
#: src/settings_translation_file.cpp
msgid ""
@@ -1546,112 +1582,125 @@ msgid ""
"17 = 4D \"Mandelbulb\" mandelbrot set.\n"
"18 = 4D \"Mandelbulb\" julia set."
msgstr ""
+"Wybór 18 fraktali z 9 formuł.\n"
+"1 = 4D \"Roundy\" zbiór Mandelbrota .\n"
+"2 = 4D \"Roundy\" zbiór Julii.\n"
+"3 = 4D \"Squarry\" zbiór Mandelbrota.\n"
+"4 = 4D \"Squarry\" zbiór Julii.\n"
+"5 = 4D \"Mandy Cousin\" zbiór Mandelbrota.\n"
+"6 = 4D \"Mandy Cousin\" zbiór Julii.\n"
+"7 = 4D \"Variation\" zbiór Mandelbrota.\n"
+"8 = 4D \"Variation\" zbiór Julii.\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" zbiór Mandelbrota.\n"
+"10 = 3D \"Mandelbrot/Mandelbar\" zbiór Julii.\n"
+"11 = 3D \"Christmas Tree\" zbiór Mandelbrota.\n"
+"12 = 3D \"Christmas Tree\" zbiór Julii.\n"
+"13 = 3D \"Mandelbulb\" zbiór Mandelbrota.\n"
+"14 = 3D \"Mandelbulb\" zbiór Julii.\n"
+"15 = 3D \"Cosine Mandelbulb\" zbiór Mandelbrota.\n"
+"16 = 3D \"Cosine Mandelbulb\" zbiór Julii.\n"
+"17 = 4D \"Mandelbulb\" zbiór Mandelbrota.\n"
+"18 = 4D \"Mandelbulb\" zbiór Julii."
#: src/settings_translation_file.cpp
msgid "Chunk size"
-msgstr ""
+msgstr "Szerokość fragmentu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cinematic mode"
-msgstr "Tryb kreatywny"
+msgstr "Tryb Cinematic"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cinematic mode key"
-msgstr "Tryb kreatywny"
+msgstr "Klawisz trybu Cinematic"
#: src/settings_translation_file.cpp
msgid "Clean transparent textures"
-msgstr ""
+msgstr "Czyste przeźroczyste tekstury"
#: src/settings_translation_file.cpp
msgid "Client and Server"
-msgstr ""
+msgstr "Klient i Serwer"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
-msgstr ""
+msgstr "Szybkość wspinania"
#: src/settings_translation_file.cpp
msgid "Cloud height"
-msgstr ""
+msgstr "Wysokość chmur"
#: src/settings_translation_file.cpp
msgid "Cloud radius"
-msgstr ""
+msgstr "Zasięg chmur"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Clouds"
msgstr "Chmury 3D"
#: src/settings_translation_file.cpp
msgid "Clouds are a client side effect."
-msgstr ""
+msgstr "Chmury sÄ… efektem po stronie klienta."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Clouds in menu"
-msgstr "Menu główne"
+msgstr "Chmury w menu"
#: src/settings_translation_file.cpp
msgid "Colored fog"
-msgstr ""
+msgstr "Kolorowa mgła"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
+"Lista oddzielonych przecinkiem modów które mają pozwolenie na dostęp do\n"
+"API HTTP, które pozwala im wysyłać i pobierać dane do/z internetu."
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
+"Lista oddzielona przecinkiem zaufanych modów które mają dostęp\n"
+"do niebezpiecznych funkcji nawet gdy zabezpieczenie modów jest włączone."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Command key"
-msgstr "Komenda"
+msgstr "Klawisz komend"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Connect glass"
-msgstr "Połącz"
+msgstr "Połączone szkło"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Connect to external media server"
-msgstr "ÅÄ…czenie z serwerem..."
+msgstr "ÅÄ…czenie z zewnÄ™trznym serwerem mediów"
#: src/settings_translation_file.cpp
msgid "Connects glass if supported by node."
-msgstr ""
+msgstr "Połącz szkło jeśli wspierane przez blok."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console alpha"
-msgstr "Konsola"
+msgstr "Przeźroczystość konsoli"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console color"
-msgstr "Konsola"
+msgstr "Kolor konsoli"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Console key"
-msgstr "Konsola"
+msgstr "Klawisz konsoli"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
-msgstr ""
+msgstr "Ciągle na przód"
#: src/settings_translation_file.cpp
msgid "Continuous forward movement (only used for testing)."
-msgstr ""
+msgstr "Ciągłe poruszanie się na przód (tylko do testowania)."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -1664,159 +1713,175 @@ msgid ""
"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
"unchanged."
msgstr ""
+"Kontrola długości cyklu dnia i nocy.\n"
+"Przykłady: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = dzień/noc/cokolwiek "
+"zostaje niezmienione."
#: src/settings_translation_file.cpp
msgid ""
"Controls size of deserts and beaches in Mapgen v6.\n"
"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
msgstr ""
+"Kontrola szerokości pustyni i plaż w generatorze map v6.\n"
+"Kiedy śnieżne biomy są włączone to 'mgv6_freq_desert' zostanie zignorowane."
#: src/settings_translation_file.cpp
msgid "Controls steepness/depth of lake depressions."
-msgstr ""
+msgstr "Kontroluje stromość/głębokość depresji jeziora."
#: src/settings_translation_file.cpp
msgid "Controls steepness/height of hills."
-msgstr ""
+msgstr "Kontroluje stromość/wysokość gór."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Kontroluje szerokość tuneli, mniejsze wartości tworzą szersze tunele."
#: src/settings_translation_file.cpp
msgid "Crash message"
-msgstr ""
+msgstr "Wiadomość awarii"
#: src/settings_translation_file.cpp
msgid ""
"Creates unpredictable lava features in caves.\n"
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
+"Tworzy nieobliczalne pojawianie siÄ™ lawy w jaskiniach.\n"
+"Może zwiększyć trudność kopania. Zero wyłącza tę opcję. (0-10)"
#: src/settings_translation_file.cpp
msgid ""
"Creates unpredictable water features in caves.\n"
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
+"Tworzy nieobliczalne pojawianie siÄ™ wody w jaskiniach.\n"
+"Może zwiększyć trudność kopania. Zero wyłącza tę opcję. (0-10)"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
-msgstr ""
+msgstr "Kanał alfa celownika"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Kanał alfa celownika (pomiędzy 0 a 255)."
#: src/settings_translation_file.cpp
msgid "Crosshair color"
-msgstr ""
+msgstr "Kolor celownika"
#: src/settings_translation_file.cpp
msgid "Crosshair color (R,G,B)."
-msgstr ""
+msgstr "Kolor celownika (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Crouch speed"
-msgstr ""
+msgstr "Szybkość podczas kucania"
#: src/settings_translation_file.cpp
msgid "DPI"
-msgstr ""
+msgstr "DPI"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Damage"
msgstr "Włącz obrażenia"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
-msgstr ""
+msgstr "Klawisz przełączania informacji debugowania"
#: src/settings_translation_file.cpp
msgid "Debug log level"
-msgstr ""
+msgstr "Poziom logowania debugowania"
#: src/settings_translation_file.cpp
msgid "Dedicated server step"
-msgstr ""
+msgstr "Krok serwera dedykowanego"
#: src/settings_translation_file.cpp
msgid "Default acceleration"
-msgstr ""
+msgstr "Domyślne przyspieszenie"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Default game"
-msgstr "edytuj grÄ™"
+msgstr "Domyślna gra"
#: 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 ""
+"Domyślna gra podczas tworzenia nowego świata.\n"
+"To zostanie nadpisane jeżeli tworzysz świat z menu głównego."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Default password"
-msgstr "Nowe hasło"
+msgstr "Domyślne hasło"
#: src/settings_translation_file.cpp
msgid "Default privileges"
-msgstr ""
+msgstr "Domyślne uprawnienia"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Domyślny format raportu"
#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
msgstr ""
+"Domyślny limit czasu dla cURL, w milisekundach.\n"
+"Ma znaczenie tylko gdy skompilowane z cURL."
#: src/settings_translation_file.cpp
msgid ""
"Defines sampling step of texture.\n"
"A higher value results in smoother normal maps."
msgstr ""
+"Definiuje krok próbkowania tekstury.\n"
+"Wyższa wartość reprezentuje łagodniejszą mapę normalnych."
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
+"Definiuje maksymalną odległość przesyłania graczy w blokach (0 = "
+"nieskończoność)."
#: src/settings_translation_file.cpp
-msgid "Delay showing tooltips, stated in milliseconds."
+msgid "Delay in sending blocks after building"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr "Opóźnienie wyświetlania dymkmów, w milisekundach."
+
+#: src/settings_translation_file.cpp
msgid "Deprecated Lua API handling"
-msgstr ""
+msgstr "Wsparcie przestarzałego API Lua"
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "Głębokość poniżej której znajdziesz duże jaskinie."
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "Głębokość poniżej której znajdziesz masywne jaskinie."
#: src/settings_translation_file.cpp
msgid "Descending speed"
-msgstr ""
+msgstr "Szybkość opadania"
#: src/settings_translation_file.cpp
msgid ""
"Description of server, to be displayed when players join and in the "
"serverlist."
msgstr ""
+"Opis serwera, który będzie wyświetlony gdy gracze dołączają oraz na liście "
+"serwerów."
#: src/settings_translation_file.cpp
msgid "Desynchronize block animation"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
+msgstr "Odsynchronizuj animację bloków"
#: src/settings_translation_file.cpp
msgid ""
@@ -1824,60 +1889,81 @@ msgid ""
"The 3 numbers in brackets control the scale of the\n"
"terrain, the 3 numbers should be identical."
msgstr ""
+"Determinuje kształt terenu.\n"
+"Trzy liczby w nawiasach kontrolujÄ… skalÄ™ terenu\n"
+"oraz powinny być identyczne."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Disable anticheat"
-msgstr "WÅ‚Ä…cz czÄ…stki"
+msgstr "Wyłącz anticheat"
#: src/settings_translation_file.cpp
-msgid "Disallow empty passwords"
+msgid "Disable escape sequences"
+msgstr "Wyłącza sekwencję ucieczki"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
msgstr ""
+"Wyłącza sekwencję ucieczki np. kolorowanie czatu.\n"
+"Użyj tego jeśli chcesz uruchomić serwer dla klientów przed 0.4.14 i chcesz "
+"wyłączyć\n"
+"sekwencjÄ™ ucieczki generowanÄ… przez modyfikacje."
+
+#: src/settings_translation_file.cpp
+msgid "Disallow empty passwords"
+msgstr "Nie zezwalaj na puste hasła"
#: src/settings_translation_file.cpp
msgid "Domain name of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Serwer DNS, wyświetlany na liście serwerów."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Double tap jump for fly"
msgstr "Wciśnij dwukrotnie \"Skok\" by włączyć tryb latania"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Double-tapping the jump key toggles fly mode."
-msgstr "Wciśnij dwukrotnie \"Skok\" by włączyć tryb latania"
+msgstr "Wciśnij dwukrotnie \"Skok\" by włączyć tryb latania."
#: src/settings_translation_file.cpp
msgid "Drop item key"
-msgstr ""
+msgstr "Klawisz wyrzucenia przedmiotu"
#: src/settings_translation_file.cpp
msgid "Dump the mapgen debug infos."
-msgstr ""
+msgstr "Zrzuć informacje debugowania generatora mapy."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "WÅ‚Ä…cz joystick"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enable VBO"
-msgstr "WÅ‚Ä…cz MP"
+msgstr "WÅ‚Ä…cz VBO"
#: src/settings_translation_file.cpp
msgid "Enable mod security"
-msgstr ""
+msgstr "WÅ‚Ä…cz tryb mod security"
#: src/settings_translation_file.cpp
msgid "Enable players getting damage and dying."
-msgstr ""
+msgstr "Włącz obrażenia i umieranie graczy."
#: src/settings_translation_file.cpp
msgid "Enable random user input (only used for testing)."
-msgstr ""
+msgstr "Włącz losowe wejście użytkownika (tylko dla testowania)."
#: src/settings_translation_file.cpp
msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
msgstr ""
+"Włącz gładkie oświetlenie z prostym efektem ambient occlusion.\n"
+"Wyłącz dla szybkości lub wyglądu."
#: src/settings_translation_file.cpp
msgid ""
@@ -1887,6 +1973,11 @@ msgid ""
"to new servers, but they may not support all new features that you are "
"expecting."
msgstr ""
+"Włącz blokadę dla połączenia starych klientów.\n"
+"Starsze klienty mogą być kompatybilne w tym sensie że nie będą się "
+"zawieszać\n"
+"kiedy łączą sę z nowym serwerem, ale mogą nie wspierać wszystkich nowych "
+"spodziewanych funkcjonalności."
#: src/settings_translation_file.cpp
msgid ""
@@ -1895,6 +1986,10 @@ msgid ""
"textures)\n"
"when connecting to the server."
msgstr ""
+"Włącza używanie zdalnego serwera mediów (jeżeli dostarczany przez serwer).\n"
+"Zdalny serwer oferuje znacząco szybszy sposób pobierania mediów (np. "
+"tekstur)\n"
+"jeżeli następuje połączenie z serwerem."
#: src/settings_translation_file.cpp
msgid ""
@@ -1902,10 +1997,13 @@ msgid ""
"to IPv6 clients, depending on system configuration.\n"
"Ignored if bind_address is set."
msgstr ""
+"Przełącza pracę serwera w trybie IPv6. Serwer IPv6 może być ograniczony\n"
+"tylko dla klientów IPv6, w zależności od konfiguracji systemu.\n"
+"Ignorowane jeżeli bind_address jest ustawiony."
#: src/settings_translation_file.cpp
msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Włącz animację inwentarza przedmiotów."
#: src/settings_translation_file.cpp
msgid ""
@@ -1914,42 +2012,58 @@ msgid ""
"or need to be auto-generated.\n"
"Requires shaders to be enabled."
msgstr ""
+"Włącza mapowanie wypukłości dla tekstur. Mapy normalnych muszą być dodane w "
+"paczce tekstur\n"
+"lub muszą być automatycznie wygenerowane.\n"
+"Wymaga włączonych shaderów."
#: src/settings_translation_file.cpp
msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Włącza cachowanie facedir obracanych meshów."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enables filmic tone mapping"
-msgstr "Włącz obrażenia"
+msgstr "WÅ‚Ä…cz filmic tone mapping"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Enables minimap."
-msgstr "Włącz obrażenia"
+msgstr "WÅ‚Ä…cz minimapÄ™."
#: src/settings_translation_file.cpp
msgid ""
"Enables on the fly normalmap generation (Emboss effect).\n"
"Requires bumpmapping to be enabled."
msgstr ""
+"Włącza generację map normalnych w locie (efekt płaskorzeźby).\n"
+"Wymaga włączenia mapowania wypukłości."
#: src/settings_translation_file.cpp
msgid ""
"Enables parallax occlusion mapping.\n"
"Requires shaders to be enabled."
msgstr ""
+"WÅ‚Ä…cza mapowanie paralaksy.\n"
+"Wymaga włączenia shaderów."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
msgstr ""
+"Eksperymentalna opcja, może powodować widoczne przestrzenie\n"
+"pomiędzy blokami kiedy ustawiona powyżej 0."
#: src/settings_translation_file.cpp
msgid "FPS in pause menu"
-msgstr ""
+msgstr "FPS podczas pauzy w menu"
#: src/settings_translation_file.cpp
msgid "FSAA"
@@ -1961,55 +2075,71 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Fallback font"
-msgstr ""
+msgstr "Zastępcza czcionka"
#: src/settings_translation_file.cpp
msgid "Fallback font shadow"
-msgstr ""
+msgstr "Zastępczy cień czcionki"
#: src/settings_translation_file.cpp
msgid "Fallback font shadow alpha"
-msgstr ""
+msgstr "Zastępcza przeźroczystość cienia czcionki"
#: src/settings_translation_file.cpp
msgid "Fallback font size"
-msgstr ""
+msgstr "Zastępczy rozmiar czcionki"
#: src/settings_translation_file.cpp
msgid "Fast key"
-msgstr ""
+msgstr "Klawisz szybkiego poruszania"
#: src/settings_translation_file.cpp
msgid "Fast mode acceleration"
-msgstr ""
+msgstr "Przyspieszenie trybu szybkiego"
#: src/settings_translation_file.cpp
msgid "Fast mode speed"
-msgstr ""
+msgstr "Prędkość trybu szybkiego"
#: src/settings_translation_file.cpp
msgid "Fast movement"
-msgstr ""
+msgstr "Szybkie poruszanie"
#: src/settings_translation_file.cpp
msgid ""
"Fast movement (via use key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
+"Szybkie poruszanie się (przez klawisz użycia).\n"
+"Wymaga przywileju \"fast\" na serwerze."
#: src/settings_translation_file.cpp
msgid "Field of view"
-msgstr ""
+msgstr "Pole widzenia"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Pole widzenia dla zoomu"
#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
+msgstr "Pole widzenia w stopniach."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
msgstr ""
+"Pole widzenia podczas zoomowania w stopniach.\n"
+"wymaga przywileju \"zoom\" na serwerze."
#: src/settings_translation_file.cpp
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
+"Plik w kliencie (lista serwerów) który zawiera ulubione ulubione serwery "
+"wyświetlane w zakładce Multiplayer."
#: src/settings_translation_file.cpp
msgid "Filler Depth"
@@ -2026,79 +2156,86 @@ msgid ""
"light edge to transparent textures. Apply this filter to clean that up\n"
"at texture load time."
msgstr ""
+"Filtrowanie tekstur może wymieszać wartości RGB piksela z w pełni "
+"przeźroczystymi sąsiadami,\n"
+"które optymalizatory PNG najczęściej odrzucają, co czasem powoduje "
+"ciemniejsze lub jaśniejsze\n"
+"krawędzie w przeźroczystych teksturach. Zastosuj ten filtr aby wyczyścić to "
+"w czasie Å‚adowania tekstur."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Filtering"
msgstr "Filtrowanie anizotropowe"
#: src/settings_translation_file.cpp
msgid "Fixed map seed"
-msgstr ""
+msgstr "Stałe ziarno mapy"
#: src/settings_translation_file.cpp
msgid "Fly key"
-msgstr ""
+msgstr "Klawisz latania"
#: src/settings_translation_file.cpp
msgid "Flying"
-msgstr ""
+msgstr "Latanie"
#: src/settings_translation_file.cpp
msgid "Fog"
-msgstr ""
+msgstr "Mgła"
#: src/settings_translation_file.cpp
msgid "Fog toggle key"
-msgstr ""
+msgstr "Klawisz przełączania mgły"
#: src/settings_translation_file.cpp
msgid "Font path"
-msgstr ""
+msgstr "Ścieżka czcionki"
#: src/settings_translation_file.cpp
msgid "Font shadow"
-msgstr ""
+msgstr "Cień czcionki"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha"
-msgstr ""
+msgstr "Przeźroczystość cienia czcionki"
#: src/settings_translation_file.cpp
msgid "Font shadow alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Kanał alfa cienia czcionki (nieprzeźroczystość, od 0 do 255)."
#: src/settings_translation_file.cpp
msgid "Font shadow offset, if 0 then shadow will not be drawn."
-msgstr ""
+msgstr "Offset cienia czcionki, jeżeli 0 to cień nie będzie rysowany."
#: src/settings_translation_file.cpp
msgid "Font size"
-msgstr ""
+msgstr "Rozmiar czcionki"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
-msgstr ""
+msgstr "Format zrzutu ekranu."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Forward key"
-msgstr "Przód"
+msgstr "Do przodu"
#: src/settings_translation_file.cpp
msgid "Freetype fonts"
-msgstr ""
+msgstr "Czcionki Freetype"
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
msgstr ""
+"Od jak daleka bloki są generowane dla klienta, w blokach mapy (16 węzłów)."
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
msgstr ""
+"Z jakiej odległości bloki są przesyłane do klientów, zapisane w blokach map "
+"(16 węzłów)."
#: src/settings_translation_file.cpp
msgid ""
@@ -2107,38 +2244,42 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Full screen"
-msgstr ""
+msgstr "Pełny ekran"
#: src/settings_translation_file.cpp
msgid "Full screen BPP"
-msgstr ""
+msgstr "Głębia koloru w trybie pełnoekranowym"
#: src/settings_translation_file.cpp
msgid "Fullscreen mode."
-msgstr ""
+msgstr "Tryb pełnoekranowy."
#: src/settings_translation_file.cpp
msgid "GUI scaling"
-msgstr ""
+msgstr "Skalowanie GUI"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter"
-msgstr ""
+msgstr "Filtr skalowania GUI"
#: src/settings_translation_file.cpp
msgid "GUI scaling filter txr2img"
-msgstr ""
+msgstr "Filtr skalowania GUI txr2img"
#: src/settings_translation_file.cpp
msgid "Gamma"
-msgstr ""
+msgstr "Gamma"
#: src/settings_translation_file.cpp
msgid "General"
-msgstr ""
+msgstr "Ogólne"
#: src/settings_translation_file.cpp
msgid "Generate normalmaps"
+msgstr "Generuj mapy normalnych"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
msgstr ""
#: src/settings_translation_file.cpp
@@ -2146,29 +2287,33 @@ msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Globalne właściwości generowania map.\n"
+"W generatorze map v6 flaga \"decorations\" kontroluje wszystkie dekoracje\n"
+"z wyjątkiem drzew i trawy dżungli. we wszystkich innych generatorach flaga\n"
+"ta kontroluje wszystkie dekoracje.\n"
+"Flagi, które nie są wymienione w ciągu flagi nie są modyfikowane z "
+"domyślnych.\n"
+"Flagi rozpoczynające się od \"no\" są stosowane aby jawnie ją wyłączyć."
#: src/settings_translation_file.cpp
msgid "Graphics"
-msgstr ""
+msgstr "Grafika"
#: src/settings_translation_file.cpp
msgid "Gravity"
-msgstr ""
+msgstr "Grawitacja"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "HTTP Mods"
msgstr "Mody"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
-msgstr ""
+msgstr "Klawisz przełączania HUD"
#: src/settings_translation_file.cpp
msgid ""
@@ -2177,26 +2322,41 @@ msgid ""
"- log: mimic and log backtrace of deprecated call (default for debug).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
+"Obsługa przestarzałych wywołań lua api:\n"
+"- legacy: (próbuje) naśladuje stare zachowanie (domyślne dla wydań).\n"
+"- log: naśladuje i loguje przestarzałe wywołania (domyślne dla wersji "
+"debug).\n"
+"- error: przerywa kiedy zostanie użyte przestarzałe api (sugerowane dla "
+"twórców modów)."
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Wysokość początkowego rozmiaru okna."
+
+#: src/settings_translation_file.cpp
msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Wysokość na której pojawiają się chmury."
#: src/settings_translation_file.cpp
msgid "High-precision FPU"
-msgstr ""
+msgstr "FPU Wysokiej precyzji"
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
-msgstr ""
+msgstr "Główna strona serwera, wyświetlana na liście serwerów."
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr ""
+msgstr "Jak głębokie robić rzeki"
#: src/settings_translation_file.cpp
msgid ""
@@ -2204,25 +2364,21 @@ msgid ""
"mapblocks (16 nodes).\n"
"In active blocks objects are loaded and ABMs run."
msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
+"Jak duży obszar bloków jest przedmiotem aktywnego bloku, zapisane w blokach "
+"map(16 jednostek).\n"
+"Na aktywnych blokach obiekty są wczytywane i ABM działa."
#: src/settings_translation_file.cpp
msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
+"Jak długo serwer będzie czekać do zwolnienia nieużywanych bloków mapy.\n"
+"Wyższa wartość jest łagodniejsza ale używa więcej pamięci RAM."
#: src/settings_translation_file.cpp
msgid "How wide to make rivers"
-msgstr ""
+msgstr "Jak szerokie sÄ… rzeki"
#: src/settings_translation_file.cpp
msgid "IPv6"
@@ -2230,23 +2386,27 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "IPv6 server"
-msgstr ""
+msgstr "Serwer IPv6"
#: src/settings_translation_file.cpp
msgid "IPv6 support."
-msgstr ""
+msgstr "Wsparcie 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 ""
+"Jeżeli FPS będzie wyższy niż to, ogranicz go przez usypianie\n"
+"nie marnuj mocy CPU bez znaczących korzyści."
#: src/settings_translation_file.cpp
msgid ""
"If disabled \"use\" key is used to fly fast if both fly and fast mode are "
"enabled."
msgstr ""
+"Jeśli wyłączone to klawisz \"używania\" jest wykorzystany aby latać szybko "
+"oraz przy włączonym trybie szybkiego poruszania."
#: src/settings_translation_file.cpp
msgid ""
@@ -2254,32 +2414,42 @@ msgid ""
"nodes.\n"
"This requires the \"noclip\" privilege on the server."
msgstr ""
+"Jeżeli włączone razem z trybem latania, gracz może latać przez solidne "
+"bloki.\n"
+"Wymaga przywileju \"noclip\" na serwerze."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
"and descending."
msgstr ""
+"Jeżeli włączone, klawisz \"użycia\" zamiast klawiszu \"skradania\" będzie "
+"użyty do schodzenia w dół i opadania."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
+"Jeżeli włączone, akcje są nagrywane dla odtwarzania.\n"
+"Ta opcja jest czytana tylko podczas startu serwera."
#: src/settings_translation_file.cpp
msgid "If enabled, disable cheat prevention in multiplayer."
-msgstr ""
+msgstr "Jeśli włączone, wyłącza ograniczenie oszustw w trybie multiplayer."
#: src/settings_translation_file.cpp
msgid ""
"If enabled, invalid world data won't cause the server to shut down.\n"
"Only enable this if you know what you are doing."
msgstr ""
+"Jeżeli włączone, nieprawidłowe dane świata nie będą powodować wyłączenia "
+"serwera.\n"
+"Włącz tylko jeżeli wiesz co robisz."
#: src/settings_translation_file.cpp
msgid "If enabled, new players cannot join with an empty password."
-msgstr ""
+msgstr "Jeśli włączone, nowi gracze nie mogą dołączyć do gry z pustym hasłem."
#: src/settings_translation_file.cpp
msgid ""
@@ -2287,200 +2457,326 @@ msgid ""
"you stand.\n"
"This is helpful when working with nodeboxes in small areas."
msgstr ""
+"Jeżeli włączone, możesz położyć bloki w pozycji gdzie stoisz.\n"
+"Pomocne gdy pracujesz na małych powierzchniach."
#: src/settings_translation_file.cpp
msgid "If this is set, players will always (re)spawn at the given position."
-msgstr ""
+msgstr "Jeśli ustawione, gracze zawsze będą się pojawiać w zadanej pozycji."
#: src/settings_translation_file.cpp
msgid "Ignore world errors"
-msgstr ""
+msgstr "Ignoruj błędy świata"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "In-Game"
msgstr "Gra"
#: src/settings_translation_file.cpp
msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
-msgstr ""
+msgstr "Kanał alfa konsoli w grze (od 0 do 255)."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "In-game chat console background color (R,G,B)."
+msgstr "Kolor konsoli czatu w grze (R,G,B)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of saving important changes in the world, stated in seconds."
+msgid "Instrument chatcommands on registration."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Interval of sending time of day to clients."
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Inventory items animations"
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Interval of saving important changes in the world, stated in seconds."
+msgstr "Interwał zapisywania ważnych zmian w świecie, w sekundach."
+
+#: src/settings_translation_file.cpp
+msgid "Interval of sending time of day to clients."
+msgstr "Interwał wysyłania czasu gry do klientów."
+
+#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Inventory items animations"
+msgstr "Animacje przedmiotów w ekwipunku"
+
+#: src/settings_translation_file.cpp
msgid "Inventory key"
msgstr "Ekwipunek"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Invert mouse"
-msgstr ""
+msgstr "Odwróć mysz"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Invert vertical mouse movement."
-msgstr ""
+msgstr "Odwróć ruch pionowy ruchu myszy."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Item entity TTL"
-msgstr ""
+msgstr "TTL przedmiotu"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Iterations of the recursive function.\n"
"Controls the amount of fine detail."
msgstr ""
+"Iteracje funkcji rekursywnych.\n"
+"Kontroluje ilość drobnych szczegółów."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Interwał powtarzania przycisku joysticka"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
+"Zbiór Julii tylko: W komponent stałej liczby hiperzespolonej determinującej "
+"kształt Julii.\n"
+"Nie ma efektu dla fraktali 3D.\n"
+"Zakres w przybliżeniu -2 do 2."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Julia set only: X component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
+"Zbiór Julii tylko: X komponent stałej hiperzespolonej liczby determinującej "
+"kształt Julii.\n"
+"Zakres w przybliżeniu -2 do 2."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Julia set only: Y component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
+"Zbiór Julii tylko: Y komponent stałej hiperzespolonej liczby determinującej "
+"kształt Julii.\n"
+"Zakres w przybliżeniu -2 do 2."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Julia set only: Z component of hypercomplex constant determining julia "
"shape.\n"
"Range roughly -2 to 2."
msgstr ""
+"Zbiór Julii tylko: Z komponent stałej hiperzespolonej liczby determinującej "
+"kształt Julii.\n"
+"Zakres w przybliżeniu -2 do 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Jump key"
msgstr "Skok"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Jumping speed"
-msgstr ""
+msgstr "Szybkość skoku"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for decreasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz zmniejszania zasięgu widzenia.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for dropping the currently selected item.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz wyrzucenia aktualnie wybranego przedmiotu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for increasing the viewing range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz zwiększania zasięgu widzenia.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for jumping.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz skakania.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for moving fast in fast mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz szybkiego poruszania siÄ™ w trybie \"fast\"\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for moving the player backward.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz poruszania siÄ™ wstecz.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for moving the player forward.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz poruszania się na przód,\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for moving the player left.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz poruszania się w lewo.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for moving the player right.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz poruszania się w prawo.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for opening the chat console.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz otwierania konsoli czatu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for opening the chat window to type commands.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz otwierania okna czatu aby wpisać komendę.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for opening the chat window.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz otwierania okna czatu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for opening the inventory.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz otwierania inwentarza.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for printing debug stacks. Used for development.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz wyświetlania danych debugowania. Przydatne dla deweloperów.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for sneaking.\n"
"Also used for climbing down and descending in water if aux1_descends is "
@@ -2488,151 +2784,237 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz skradania.\n"
+"Także używany do schodzenia w dół i opadania w wodzie jeżeli aux1_descends "
+"jest wyłączone.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for switching between first- and third-person camera.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania pomiedzy kamerą z pierwszej i trzeciej osoby.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for taking screenshots.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz do zrobienia zrzutu ekranu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Klawisz przełączania trybu szybkiego.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania trybu cinematic.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling display of minimap.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania wyświetlania minimapy.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling fast mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania trybu szybkiego.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling flying.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania latania.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling noclip mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania trybu noclip.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania aktualizacji kamery. Przydatne tylko dla deweloperów.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling the display of debug info.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania informacji debugowania.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling the display of the HUD.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania wyświetlania HUD.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling the display of the chat.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania wyświetlania czatu.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling the display of the fog.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania wyświetlania mgły\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling the display of the profiler. Used for development.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania wyświetlania profilera. Przydatne dla deweloperów.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Key for toggling unlimited view range.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Klawisz przełączania nieograniczonego pola widzenia.\n"
+"Zobacz http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Key use for climbing/descending"
-msgstr ""
+msgstr "Klawisz używany do wspinania"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Language"
-msgstr ""
+msgstr "Język"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Large cave depth"
-msgstr ""
+msgstr "Głębia dużej jaskini"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Lava Features"
-msgstr ""
+msgstr "Funkcjonalności lawy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Leaves style"
-msgstr ""
+msgstr "Styl liści"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Leaves style:\n"
"- Fancy: all faces visible\n"
"- Simple: only outer faces, if defined special_tiles are used\n"
"- Opaque: disable transparency"
msgstr ""
+"Style liści:\n"
+"- Fancy: wszystkie ściany widoczne\n"
+"- Simple: tylko zewnętrzene ściany, jeżeli special_tiles jest użyty\n"
+"- Opaque: wyłącza przeźroczystość"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Left key"
-msgstr "Lewy Menu"
+msgstr "W lewo"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Length of a server tick and the interval at which objects are generally "
"updated over network."
msgstr ""
+"Długość interwału czasowego serwera w trakcie którego obiekty są ogólnie "
+"aktualizowane przez sieć."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Długość czasu pomiędzy wykonywanymi cyklami ABM"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Długość czasu pomiędzy wykonywanymi cyklami NodeTimer."
#: src/settings_translation_file.cpp
msgid ""
@@ -2647,12 +3029,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Limit of emerge queues on disk"
-msgstr ""
+msgstr "Limit oczekiwań na dysku"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Limit of emerge queues to generate"
-msgstr ""
+msgstr "Limit kolejek oczekujÄ…cych do wytworzenia"
#: src/settings_translation_file.cpp
msgid ""
@@ -2664,59 +3048,85 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Liquid fluidity"
-msgstr ""
+msgstr "Płynność cieczy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Liquid fluidity smoothing"
-msgstr ""
+msgstr "Wygładzanie płynności cieczy"
#: src/settings_translation_file.cpp
msgid "Liquid loop max"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Liquid queue purge time"
-msgstr ""
+msgstr "Czas kolejki czyszczenia cieczy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Liquid sink"
-msgstr ""
+msgstr "Zanurzanie cieczy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Liquid update interval in seconds."
-msgstr ""
+msgstr "Interwał aktualizacji cieczy podany w sekundach"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Liquid update tick"
+msgstr "Interwał czasowy aktualizacji cieczy"
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Main menu game manager"
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Main menu mod manager"
-msgstr "Menu główne"
+msgid "Loading Block Modifiers"
+msgstr "Interwał modyfikatora aktywnego bloku"
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Main menu game manager"
+msgstr "Menedżer menu głównego"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu mod manager"
+msgstr "Manager modów w głównym menu"
+
+#: src/settings_translation_file.cpp
msgid "Main menu script"
-msgstr "Menu główne"
+msgstr "Skrypt głównego menu"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
msgstr ""
+"Ustwa mgłę i kolor nieba zależny od pory dnia(świt/zachód słońca) i pokaż "
+"kierunek"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
-msgstr ""
+msgstr "Sprawia, że DirectX działa z LuaJIT. Wyłącz jeśli występują kłopoty"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Map directory"
-msgstr ""
+msgstr "Katalog map"
#: src/settings_translation_file.cpp
msgid ""
@@ -2726,8 +3136,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2737,8 +3145,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2749,8 +3155,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2760,33 +3164,34 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Map generation limit"
-msgstr ""
+msgstr "Limit generacji mapy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Map save interval"
-msgstr ""
+msgstr "Interwał zapisu mapy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Mapblock limit"
-msgstr ""
+msgstr "Limit bloków mapy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Mapblock unload timeout"
-msgstr ""
+msgstr "Przekroczenie czasu wyładowania bloków mapy"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen Valleys"
-msgstr "Generator mapy"
+msgstr "Generator mapy Valleys"
#: src/settings_translation_file.cpp
msgid "Mapgen biome heat noise parameters"
@@ -2797,28 +3202,25 @@ msgid "Mapgen biome humidity blend noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Mapgen biome humidity noise parameters"
-msgstr ""
+msgstr "Wilgotność oraz parametry hałasu biomu Mapgen"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen debug"
-msgstr "Generator mapy"
+msgstr "Generator mapy debugowanie"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flags"
-msgstr "Generator mapy"
+msgstr "Flagi generatora mapy"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat szerokość jaskini"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
@@ -2833,14 +3235,12 @@ msgid "Mapgen flat filler depth noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat flags"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat flagi"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat ground level"
-msgstr "Generator mapy"
+msgstr "Generator mapy flat poziom ziemi"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill steepness"
@@ -2869,14 +3269,12 @@ msgid "Mapgen flat terrain noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal szerokość jaskini"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
@@ -2896,9 +3294,8 @@ msgid "Mapgen fractal fractal"
msgstr "Generator mapy"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal iterations"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal iteracje"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia w"
@@ -2922,9 +3319,8 @@ msgid "Mapgen fractal offset"
msgstr "Generator mapy"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal scale"
-msgstr "Generator mapy"
+msgstr "Generator mapy fractal skala"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal seabed noise parameters"
@@ -2940,19 +3336,16 @@ msgid "Mapgen heat blend noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen name"
-msgstr "Generator mapy"
+msgstr "Nazwa generatora mapy"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5"
-msgstr "Generator mapy"
+msgstr "Generator mapy v5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy v5 szerokość jaskini"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
@@ -2975,9 +3368,8 @@ msgid "Mapgen v5 height noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v6"
-msgstr "Generator mapy"
+msgstr "Generator mapy v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 apple trees noise parameters"
@@ -3036,14 +3428,12 @@ msgid "Mapgen v6 trees noise parameters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7"
-msgstr "Generator mapy"
+msgstr "Generator mapy v7"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 cave width"
-msgstr "Generator mapy"
+msgstr "Generator mapy v7 szerokość jaskini"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
@@ -3142,6 +3532,15 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Jak dużo bloków może być przesyłanych jednocześnie na jednego klienta."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3183,17 +3582,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3205,11 +3608,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Menus"
msgstr "Menu"
@@ -3230,31 +3628,28 @@ msgid "Method used to highlight selected object."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Minimap"
-msgstr ""
+msgstr "Minimapa"
#: src/settings_translation_file.cpp
msgid "Minimap key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Minimap scan height"
-msgstr ""
+msgstr "Wysokość skonowania minimapy"
#: src/settings_translation_file.cpp
msgid "Minimum texture size for filters"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mipmapping"
msgstr "Mip-Mappowanie"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3267,20 +3662,24 @@ msgid "Modstore mods list URL"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Monospace font path"
-msgstr ""
+msgstr "Ścieżka czcionki typu Monospace"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Monospace font size"
-msgstr ""
+msgstr "Rozmiar czcionki Monospace"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Czułość myszy"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Mouse sensitivity multiplier."
-msgstr ""
+msgstr "Mnożnik czułości myszy."
#: src/settings_translation_file.cpp
msgid ""
@@ -3313,8 +3712,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Network"
-msgstr ""
+msgstr "Sieć"
#: src/settings_translation_file.cpp
msgid ""
@@ -3335,8 +3735,9 @@ msgid "Noclip key"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Node highlighting"
-msgstr ""
+msgstr "Podświetlanie bloków"
#: src/settings_translation_file.cpp
msgid "NodeTimer interval"
@@ -3347,16 +3748,18 @@ msgid "Noise parameters for biome API temperature, humidity and biome blend."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Noises"
-msgstr ""
+msgstr "Szumy"
#: src/settings_translation_file.cpp
msgid "Normalmaps sampling"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Normalmaps strength"
-msgstr ""
+msgstr "Siła map normlanych"
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
@@ -3379,8 +3782,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Number of parallax occlusion iterations."
-msgstr ""
+msgstr "Liczba iteracji dla parallax occlusion."
#: src/settings_translation_file.cpp
msgid "Overall bias of parallax occlusion effect, usually scale/2."
@@ -3395,8 +3799,9 @@ msgid "Parallax occlusion"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Parallax occlusion Scale"
-msgstr ""
+msgstr "Skala parallax occlusion"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion bias"
@@ -3427,8 +3832,9 @@ msgid "Path to texture directory. All textures are first searched from here."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Physics"
-msgstr ""
+msgstr "Fizyka"
#: src/settings_translation_file.cpp
msgid ""
@@ -3437,16 +3843,18 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Player name"
-msgstr ""
+msgstr "Nazwa gracza"
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Player versus Player"
-msgstr ""
+msgstr "PvP"
#: src/settings_translation_file.cpp
msgid ""
@@ -3459,11 +3867,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3471,8 +3885,9 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
+#, fuzzy
+msgid "Profiling"
+msgstr "Profilowanie modyfikacji"
#: src/settings_translation_file.cpp
msgid ""
@@ -3486,11 +3901,11 @@ msgid "Raises terrain to make valleys around the rivers"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Random input"
-msgstr ""
+msgstr "Losowe wejście"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Range select key"
msgstr "Zasięg widzenia"
@@ -3499,8 +3914,9 @@ msgid "Remote media"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Remote port"
-msgstr ""
+msgstr "Port zdalny"
#: src/settings_translation_file.cpp
msgid "Replaces the default main menu with a custom one."
@@ -3508,24 +3924,31 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Report path"
+msgstr "Ścieżka czcionki"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
-msgstr "Prawy Menu"
+msgstr "W prawo"
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "River Depth"
-msgstr ""
+msgstr "Głębokość rzeki"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "River Noise"
-msgstr ""
+msgstr "Szum rzeki"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "River Size"
-msgstr ""
+msgstr "Rozmiar rzeki"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
@@ -3536,16 +3959,18 @@ msgid "Rollback recording"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Round minimap"
-msgstr ""
+msgstr "Okrągła minimapa"
#: src/settings_translation_file.cpp
msgid "Save the map received by the client on disk."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Saving map received from server"
-msgstr ""
+msgstr "Zapisz mapÄ™ otrzymanÄ… z serwera"
#: src/settings_translation_file.cpp
msgid ""
@@ -3557,31 +3982,31 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Screen height"
-msgstr ""
+msgstr "Wysokość ekranu"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Screen width"
-msgstr ""
+msgstr "Szerokość ekranu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot"
-msgstr "Snapshot"
+msgstr "Zrzut ekranu"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Screenshot folder"
-msgstr ""
+msgstr "Folder zrzutu ekranu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Snapshot"
+msgstr "Format zrzutu ekranu"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Snapshot"
+msgstr "Jakość zrzutu ekranu"
#: src/settings_translation_file.cpp
msgid ""
@@ -3591,8 +4016,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Security"
-msgstr ""
+msgstr "Bezpieczeństwo"
#: src/settings_translation_file.cpp
msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -3611,44 +4037,36 @@ msgid "Selection box width"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Server / Singleplayer"
msgstr "Pojedynczy gracz"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Server URL"
-msgstr "Serwer"
+msgstr "Adres URL serwera"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Server address"
-msgstr "Port Serwera"
+msgstr "Adres serwera"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Server description"
-msgstr "Port Serwera"
+msgstr "Opis serwera"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Server name"
-msgstr "Serwer"
+msgstr "Nazwa serwera"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Server port"
msgstr "Port Serwera"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Serverlist URL"
msgstr "Lista publicznych serwerów"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Serverlist file"
-msgstr "Lista publicznych serwerów"
+msgstr "Plik listy publicznych serwerów"
#: src/settings_translation_file.cpp
msgid ""
@@ -3676,7 +4094,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3687,7 +4105,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Show debug info"
-msgstr ""
+msgstr "Pokaż informacje debugowania"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
@@ -3708,13 +4126,12 @@ msgid "Slope and fill work together to modify the heights"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Smooth lighting"
msgstr "Płynne oświetlenie"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3727,13 +4144,13 @@ msgid "Smooths rotation of camera. 0 to disable."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Sneak key"
msgstr "Skradanie"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Sound"
-msgstr ""
+msgstr "Dźwięk"
#: src/settings_translation_file.cpp
msgid ""
@@ -3744,8 +4161,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Static spawnpoint"
-msgstr ""
+msgstr "Statyczny punkt spawnu"
#: src/settings_translation_file.cpp
msgid "Strength of generated normalmaps."
@@ -3786,7 +4204,6 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Texture path"
msgstr "Paczki tekstur"
@@ -3795,10 +4212,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3814,6 +4243,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3829,6 +4264,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3876,7 +4317,6 @@ msgid "Tooltip delay"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Trilinear filtering"
msgstr "Filtrowanie trójliniowe"
@@ -3920,9 +4360,8 @@ msgid "Use bilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Use key"
-msgstr "naciśnij klawisz"
+msgstr "Klawisz użycia"
#: src/settings_translation_file.cpp
msgid "Use mip mapping to scale textures. May slightly increase performance."
@@ -3933,11 +4372,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Twórcy"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -3996,7 +4430,6 @@ msgid "Viewing range"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Volume"
msgstr "Głośność"
@@ -4013,9 +4446,8 @@ msgid "Walking speed"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Water Features"
-msgstr "Tekstury przedmiotów..."
+msgstr "Funkcje wody"
#: src/settings_translation_file.cpp
msgid "Water level"
@@ -4030,9 +4462,8 @@ msgid "Waving Nodes"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Waving leaves"
-msgstr "Ozdobne drzewa"
+msgstr "Falujące liście"
#: src/settings_translation_file.cpp
msgid "Waving plants"
@@ -4066,7 +4497,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4141,86 +4572,151 @@ msgid "Width of the selectionbox's lines around nodes."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
+"Katalog świata (wszystko w świecie jest przechowywane tutaj).\n"
+"Nie wymagane jeżeli rozpoczyna się z głównego menu."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Y of flat ground."
-msgstr ""
+msgstr "Y płaskiego podłoża."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "Y górnego limitu preudolosowych jaskiń."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "cURL file download timeout"
-msgstr ""
+msgstr "cURL przekroczono limit pobierania pliku"
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "cURL timeout"
msgstr "Limit czasu cURL"
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Åadowanie..."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "Szczegółowe dane profilowania. Przydatne dla twórców modyfikacji."
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "ÅšciÄ…gnij"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Szczegółowe profilowanie modyfikacji"
-#~ msgid "Left click: Move all items, Right click: Move single item"
+#, fuzzy
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
#~ msgstr ""
-#~ "Lewy przycisk myszy: przenieÅ› wszystkie przedmioty, Prawy przycisk myszy: "
-#~ "przenieÅ› pojedynczy przedmiot"
+#~ "Jak dużo bloków może jednocześnie być przesyłana przez sieć dla całego "
+#~ "serwera."
-#~ msgid "is required by:"
-#~ msgstr "wymagane przez:"
+#~ msgid "Useful for mod developers."
+#~ msgstr "Przydatne dla twórców modyfikacji."
-#~ msgid "Configuration saved. "
-#~ msgstr "Konfiguracja zapisana. "
+#~ msgid "No of course not!"
+#~ msgstr "Oczywiście, że nie!"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Ostrzeżenie: Plik konfiguracyjny niespójny. "
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista publicznych serwerów"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Nie można stworzyć świata: Nazwa zawiera niedozwolone znaki"
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Generuj mapy normalnych"
-#~ msgid "Show Public"
-#~ msgstr "Pokaż publiczne"
+#~ msgid "No!!!"
+#~ msgstr "Nie!!"
-#~ msgid "Show Favorites"
-#~ msgstr "Pokaż ulubione"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Wyłącz wszystkie"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Pozostaw pole adresu puste, by uruchomić serwer lokalny."
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "włączone"
-#~ msgid "Create world"
-#~ msgstr "Stwórz świat"
+#~ msgid "Game Name"
+#~ msgstr "Nazwa Gry"
-#~ msgid "Address required."
-#~ msgstr "Wymagany adres."
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Kopiowanie moda \"$1\" do gry \"$2\" nie powiodło się"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Nie można skasować świata: nic nie zaznaczono"
+#~ msgid "GAMES"
+#~ msgstr "GRY"
-#~ msgid "Files to be deleted"
-#~ msgstr "Pliki do skasowania"
+#~ msgid "Mods:"
+#~ msgstr "Mody:"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Nie można utworzyć świata: Nie znaleziono żadnego trybu gry"
+#~ msgid "new game"
+#~ msgstr "nowa gra"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Nie można skonfigurować świata: Nic nie zaznaczono"
+#~ msgid "EDIT GAME"
+#~ msgstr "EDYTUJ GRĘ"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Nie udało się skasować wszystkich plików świata"
+#~ msgid "Remove selected mod"
+#~ msgstr "Usuń zaznaczony mod"
+
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<--Dodaj mod"
+
+#~ msgid "CLIENT"
+#~ msgstr "KLIENT"
+
+#~ msgid "START SERVER"
+#~ msgstr "URUCHOM SERWER"
+
+#~ msgid "Name"
+#~ msgstr "Nazwa"
+
+#~ msgid "Password"
+#~ msgstr "Hasło"
+
+#~ msgid "SETTINGS"
+#~ msgstr "USTAWIENIA"
+
+#~ msgid "Preload item visuals"
+#~ msgstr "Åaduj obrazy przedmiotów"
+
+#~ msgid "Finite Liquid"
+#~ msgstr "Realistyczne ciecze"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "TRYB JEDNOOSOBOWY"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACZKI TEKSTUR"
+
+#~ msgid "MODS"
+#~ msgstr "MODY"
+
+#, fuzzy
+#~ msgid "Add mod:"
+#~ msgstr "<<--Dodaj mod"
+
+#, fuzzy
+#~ msgid "Local install"
+#~ msgstr "Instaluj"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Uwaga: Niektóre z modyfikacji nie zostały jeszcze skonfigurowane.\n"
+#~ "Zostaną domyślnie włączone gdy zapiszesz konfigurację. "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Ostrzeżenie: Niektóre z modyfikacji nie zostały znalezione.\n"
+#~ "Ich ustawienia zostaną usunięte gdy zapiszesz konfigurację. "
#~ msgid ""
#~ "Default Controls:\n"
@@ -4247,98 +4743,57 @@ msgstr "Limit czasu cURL"
#~ "- ESC: to menu\n"
#~ "- T: czat\n"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Ostrzeżenie: Niektóre z modyfikacji nie zostały znalezione.\n"
-#~ "Ich ustawienia zostaną usunięte gdy zapiszesz konfigurację. "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Uwaga: Niektóre z modyfikacji nie zostały jeszcze skonfigurowane.\n"
-#~ "Zostaną domyślnie włączone gdy zapiszesz konfigurację. "
-
-#, fuzzy
-#~ msgid "Local install"
-#~ msgstr "Instaluj"
-
-#, fuzzy
-#~ msgid "Add mod:"
-#~ msgstr "<<--Dodaj mod"
-
-#~ msgid "MODS"
-#~ msgstr "MODY"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACZKI TEKSTUR"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "TRYB JEDNOOSOBOWY"
-
-#~ msgid "Finite Liquid"
-#~ msgstr "Realistyczne ciecze"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Nie udało się skasować wszystkich plików świata"
-#~ msgid "Preload item visuals"
-#~ msgstr "Åaduj obrazy przedmiotów"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Nie można skonfigurować świata: Nic nie zaznaczono"
-#~ msgid "SETTINGS"
-#~ msgstr "USTAWIENIA"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Nie można utworzyć świata: Nie znaleziono żadnego trybu gry"
-#~ msgid "Password"
-#~ msgstr "Hasło"
+#~ msgid "Files to be deleted"
+#~ msgstr "Pliki do skasowania"
-#~ msgid "Name"
-#~ msgstr "Nazwa"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Nie można skasować świata: nic nie zaznaczono"
-#~ msgid "START SERVER"
-#~ msgstr "URUCHOM SERWER"
+#~ msgid "Address required."
+#~ msgstr "Wymagany adres."
-#~ msgid "CLIENT"
-#~ msgstr "KLIENT"
+#~ msgid "Create world"
+#~ msgstr "Stwórz świat"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<--Dodaj mod"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Pozostaw pole adresu puste, by uruchomić serwer lokalny."
-#~ msgid "Remove selected mod"
-#~ msgstr "Usuń zaznaczony mod"
+#~ msgid "Show Favorites"
+#~ msgstr "Pokaż ulubione"
-#~ msgid "EDIT GAME"
-#~ msgstr "EDYTUJ GRĘ"
+#~ msgid "Show Public"
+#~ msgstr "Pokaż publiczne"
-#~ msgid "new game"
-#~ msgstr "nowa gra"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Nie można stworzyć świata: Nazwa zawiera niedozwolone znaki"
-#~ msgid "Mods:"
-#~ msgstr "Mody:"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Ostrzeżenie: Plik konfiguracyjny niespójny. "
-#~ msgid "GAMES"
-#~ msgstr "GRY"
+#~ msgid "Configuration saved. "
+#~ msgstr "Konfiguracja zapisana. "
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Kopiowanie moda \"$1\" do gry \"$2\" nie powiodło się"
+#~ msgid "is required by:"
+#~ msgstr "wymagane przez:"
-#~ msgid "Game Name"
-#~ msgstr "Nazwa Gry"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Lewy przycisk myszy: przenieÅ› wszystkie przedmioty, Prawy przycisk myszy: "
+#~ "przenieÅ› pojedynczy przedmiot"
#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "włączone"
+#~ msgid "Downloading"
+#~ msgstr "ÅšciÄ…gnij"
#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Wyłącz wszystkie"
-
-#~ msgid "No!!!"
-#~ msgstr "Nie!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Generuj mapy normalnych"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista publicznych serwerów"
-
-#~ msgid "No of course not!"
-#~ msgstr "Oczywiście, że nie!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Åadowanie..."
diff --git a/po/pt/minetest.po b/po/pt/minetest.po
index 4bdd22ee1..cef144845 100644
--- a/po/pt/minetest.po
+++ b/po/pt/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-01 00:21+0000\n"
-"Last-Translator: Fernando Reis <fernando.reis@pt.lu>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-11-08 00:48+0000\n"
+"Last-Translator: João Rodrigues <joaoadriano3@gmail.com>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/minetest/"
"minetest/pt/>\n"
"Language: pt\n"
@@ -17,11 +17,11 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.9\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Ocorreu um erro num script Lua, como por exemplo num extra:"
+msgstr "Ocorreu um erro num script Lua, como por exemplo num mod:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -41,7 +41,7 @@ msgstr "Reconectar"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr "O servidor solicitou uma reconexão:"
+msgstr "O servidor requisitou uma reconexão:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
@@ -49,20 +49,20 @@ msgstr "A carregar..."
#: builtin/mainmenu/common.lua
msgid "Protocol version mismatch. "
-msgstr "Versão do protocolo não coincide. "
+msgstr "A versão do protocolo não coincide. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr "O servidor requere o protocolo versão $1. "
+msgstr "O servidor requer o protocolo versão $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr "Servidor suporta versões de protocolo entre $1 e $2. "
+msgstr "O servidor suporta versões de protocolo entre $1 e $2. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
-"Tente recarregar a lista de servidores públicos e verificar a sua ligação à "
+"Tente recarregar a lista de servidores públicos e verifique a sua ligação à "
"internet."
#: builtin/mainmenu/common.lua
@@ -103,7 +103,7 @@ msgid ""
"chararacters [a-z0-9_] are allowed."
msgstr ""
"Falha ao ativar mod \"$1\" porque contém caracteres inválidos. Apenas "
-"caracteres de \"a\" até \"z\" e algarismos de 0 até 9 são permitidos."
+"caracteres [a-z0-9_] são permitidos."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
@@ -115,7 +115,7 @@ msgstr "Ocultar conteúdo do pacote"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr "Extra:"
+msgstr "Mod:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -128,7 +128,7 @@ msgstr "Mundo:"
#: builtin/mainmenu/dlg_config_world.lua
msgid "enabled"
-msgstr "ativo"
+msgstr "ativado"
#: builtin/mainmenu/dlg_create_world.lua
msgid "A world named \"$1\" already exists"
@@ -140,11 +140,11 @@ msgstr "Criar"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Descarregue um jogo, como o minetest_game, do sítio minetest.net"
+msgstr "Descarregue um subjogo, como o minetest_game, do site minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
-msgstr "Descarregue um do sítio minetest.net"
+msgstr "Descarregue um do site minetest.net"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@@ -160,25 +160,23 @@ msgstr "Mundo sem nome ou nenhum jogo selecionado"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Seed"
-msgstr "Semente aleatória"
+msgstr "Seed"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Warning: The minimal development test is meant for developers."
-msgstr ""
-"Aviso: O jogo \"minimal development test\" destina-se apenas a "
-"desenvolvedores."
+msgstr "Aviso: O minimal development test destina-se apenas a desenvolvedores."
#: builtin/mainmenu/dlg_create_world.lua
msgid "World name"
-msgstr "Nome do Mundo"
+msgstr "Nome do mundo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
-msgstr "Você não tem nenhum jogo instalado."
+msgstr "Não possui nenhum subjogo instalado."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
-msgstr "Tem a certeza que pertende eliminar \"$1\"?"
+msgstr "Tem a certeza que pretende eliminar \"$1\"?"
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
@@ -188,15 +186,15 @@ msgstr "Eliminar"
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: failed to delete \"$1\""
-msgstr "Mensagem de Extra: falhou a eliminação de \"$1\""
+msgstr "Modmgr: falha ao apagar \"$1\""
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: invalid modpath \"$1\""
-msgstr "Mensagem de extra: caminho inválido \"$1\""
+msgstr "Modmgr: caminho para o mod inválido \"$1\""
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
-msgstr "Eliminar Mundo \"$1\"?"
+msgstr "Eliminar mundo \"$1\"?"
#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
msgid "Accept"
@@ -204,7 +202,7 @@ msgstr "Aceitar"
#: builtin/mainmenu/dlg_rename_modpack.lua
msgid "Rename Modpack:"
-msgstr "Renomear Pacote de Extras:"
+msgstr "Renomear ModPack:"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "\"$1\" is not a valid flag."
@@ -212,11 +210,11 @@ msgstr "\"$1\" não é uma flag válida."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr "(Descrição de configuração não fornecida)"
+msgstr "(Não há descrição para esta configuração)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr "< Voltar para as configurações"
+msgstr "< Voltar para as definições"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
@@ -236,15 +234,15 @@ msgstr "Ativado"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Format is 3 numbers separated by commas and inside brackets."
-msgstr "O formato é de 3 números separados por vírgulas dentro de paréntesis."
+msgstr "O formato é de 3 números separados por vírgulas dentro de parêntesis."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid ""
"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
"<octaves>, <persistence>"
msgstr ""
-"Formato: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
-"<octaves>, <persistence>"
+"Formato: <offset>, <escala>, (<distânciaX>, <distânciaY>, <distânciaZ>), "
+"<seed>, <oitavos>, <persistência>"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Games"
@@ -252,7 +250,7 @@ msgstr "Jogos"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
msgid "Mods"
-msgstr "Extras"
+msgstr "Mods"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
@@ -265,7 +263,7 @@ msgstr "Por favor, introduza uma lista de flags separadas por vírgulas."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid integer."
-msgstr "Por favor insira um inteiro válido."
+msgstr "Por favor, insira um número inteiro válido."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Please enter a valid number."
@@ -281,7 +279,7 @@ msgstr "Restaurar valores por defeito"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Select path"
-msgstr "Selecionar diretório"
+msgstr "Seleccionar diretório"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Show technical names"
@@ -301,7 +299,7 @@ msgid ""
"Install Mod: unsupported filetype \"$1\" or broken archive"
msgstr ""
"\n"
-"Instalação de extra: o tipo de arquivo \"$1\" não é suportado ou o arquivo "
+"Instalação de mod: o tipo de ficheiro \"$1\" não é suportado ou o ficheiro "
"está corrompido"
#: builtin/mainmenu/modmgr.lua
@@ -310,25 +308,25 @@ msgstr "Falha ao instalar de $1 ao $2"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: file: \"$1\""
-msgstr "Instalar Extra: ficheiro: \"$1\""
+msgstr "Instalação de Mod: ficheiro: \"$1\""
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find real modname for: $1"
-msgstr "Instalação de extra: nome real de extra não encontrado para: $1"
+msgstr "Instalação de Mod: nome real de extra não encontrado para: $1"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: unable to find suitable foldername for modpack $1"
msgstr ""
-"Instalação de extra: não foi possível encontrar o nome adequado da pasta "
-"para o pacote de extras $1"
+"Instalação de Mod: não foi possível encontrar o nome adequado da pasta para "
+"o pacote de mods $1"
#: builtin/mainmenu/store.lua
msgid "Close store"
-msgstr "Fechar repositório de extras"
+msgstr "Fechar repositório"
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
-msgstr "Descarregando $1, por favor aguarde..."
+msgstr "A descarregar $1, por favor aguarde..."
#: builtin/mainmenu/store.lua
msgid "Install"
@@ -360,7 +358,7 @@ msgstr "Não ordenado"
#: builtin/mainmenu/store.lua
msgid "re-Install"
-msgstr "re-Instalar"
+msgstr "reinstalar"
#: builtin/mainmenu/tab_credits.lua
msgid "Active Contributors"
@@ -380,19 +378,19 @@ msgstr "Antigos Contribuidores"
#: builtin/mainmenu/tab_credits.lua
msgid "Previous Core Developers"
-msgstr "Desenvolvedores Chave Antigos"
+msgstr "Desenvolvedores principais anteriores"
#: builtin/mainmenu/tab_mods.lua
msgid "Installed Mods:"
-msgstr "Extras Instalados:"
+msgstr "Mods Instalados:"
#: builtin/mainmenu/tab_mods.lua
msgid "Mod information:"
-msgstr "Informação do extra:"
+msgstr "Informação do Mod:"
#: builtin/mainmenu/tab_mods.lua
msgid "No mod description available"
-msgstr "Nenhuma descrição disponível do extra"
+msgstr "Nenhuma descrição do Mod disponível"
#: builtin/mainmenu/tab_mods.lua
msgid "Rename"
@@ -400,20 +398,19 @@ msgstr "Renomear"
#: builtin/mainmenu/tab_mods.lua
msgid "Select Mod File:"
-msgstr "Seleccionar ficheiro de Extra:"
+msgstr "Seleccionar ficheiro de Mod:"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected mod"
-msgstr "Desinstalar extra selecionado"
+msgstr "Desinstalar mod selecionado"
#: builtin/mainmenu/tab_mods.lua
msgid "Uninstall selected modpack"
-msgstr "Desinstalar pacote de extras selecionado"
+msgstr "Desinstalar pacote de mods selecionado"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "Endereço / Porta :"
+msgstr "Endereço / Porta"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -432,27 +429,24 @@ msgid "Damage enabled"
msgstr "Dano ativado"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Del. Favorite"
-msgstr "Favoritos:"
+msgstr "Rem. Favorito"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Favorite"
-msgstr "Favoritos:"
+msgstr "Favorito"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Nome / Senha :"
+msgstr "Nome / Senha"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
-msgstr "PvP activado"
+msgstr "PvP ativado"
#: builtin/mainmenu/tab_server.lua
msgid "Bind Address"
-msgstr "Endereço Bind"
+msgstr "Endereço de ligação"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Configure"
@@ -478,7 +472,7 @@ msgstr "Novo"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "No world created or selected!"
-msgstr "Nenhum mundo criado ou selecionado!"
+msgstr "Nenhum mundo criado ou seleccionado!"
#: builtin/mainmenu/tab_server.lua
msgid "Port"
@@ -498,11 +492,11 @@ msgstr "Servidor"
#: builtin/mainmenu/tab_server.lua
msgid "Server Port"
-msgstr "Porta"
+msgstr "Porta do servidor"
#: builtin/mainmenu/tab_server.lua
msgid "Start Game"
-msgstr "Jogar"
+msgstr "Iniciar Jogo"
#: builtin/mainmenu/tab_settings.lua
msgid "2x"
@@ -526,7 +520,7 @@ msgstr "Configurações Avançadas"
#: builtin/mainmenu/tab_settings.lua
msgid "Antialiasing:"
-msgstr "Antisserrilhamento:"
+msgstr "Antialiasing:"
#: builtin/mainmenu/tab_settings.lua
msgid "Are you sure to reset your singleplayer world?"
@@ -534,10 +528,9 @@ msgstr "Tem a certeza que deseja reiniciar o seu mundo?"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
-msgstr "Filtro bi-linear"
+msgstr "Filtro bilinear"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
msgstr "Bump mapping"
@@ -555,11 +548,11 @@ msgstr "Folhas detalhadas"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
-msgstr "Mapa MIP"
+msgstr "Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap + Aniso. Filter"
-msgstr "Mapa MIP + Filtro Anisotrópico"
+msgstr "Mipmap + Filtro Anisotrópico"
#: builtin/mainmenu/tab_settings.lua
msgid "No"
@@ -571,14 +564,13 @@ msgstr "Sem Filtro"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
-msgstr "Sem mapa MIP"
+msgstr "Sem Mipmap"
#: builtin/mainmenu/tab_settings.lua
msgid "Node Highlighting"
msgstr "Destaque dos Cubos"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
msgstr "Destaque dos Cubos"
@@ -587,9 +579,8 @@ msgid "None"
msgstr "Nenhum"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "Mapeamento de tons"
+msgstr "Mapeamento Normal"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -604,9 +595,12 @@ msgid "Parallax Occlusion"
msgstr "Oclusão de paralaxe"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "Ativar Partículas"
+msgstr "Ativar Particulas"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Reiniciar mundo singleplayer"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -630,7 +624,7 @@ msgstr "Texturização:"
#: builtin/mainmenu/tab_settings.lua
msgid "To enable shaders the OpenGL driver needs to be used."
-msgstr "Para ativar os sombreadores é necessário usar o driver OpenGL."
+msgstr "Para ativar as sombras é necessário usar o controlador OpenGL."
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
@@ -642,7 +636,7 @@ msgstr "Nível de sensibilidade ao toque (px)"
#: builtin/mainmenu/tab_settings.lua
msgid "Trilinear Filter"
-msgstr "Filtro tri-linear"
+msgstr "Filtro trilinear"
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Leaves"
@@ -662,7 +656,7 @@ msgstr "Sim"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Config mods"
-msgstr "Configurar extras"
+msgstr "Configurar mods"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Main"
@@ -670,7 +664,7 @@ msgstr "Principal"
#: builtin/mainmenu/tab_simple_main.lua
msgid "Start Singleplayer"
-msgstr "Iniciar jogo solo"
+msgstr "Iniciar Um Jogador"
#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
msgid "Play"
@@ -682,7 +676,7 @@ msgstr "Um Jogador"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "No information available"
-msgstr "Sem informação"
+msgstr "Sem informações disponíveis"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Select texture pack:"
@@ -690,7 +684,7 @@ msgstr "Selecione um pacote de texturas:"
#: builtin/mainmenu/tab_texturepacks.lua
msgid "Texturepacks"
-msgstr "Pacotes texturas"
+msgstr "Pacotes de texturas"
#: src/client.cpp
msgid "Connection timed out."
@@ -698,7 +692,7 @@ msgstr "Erro de ligação (tempo excedido)."
#: src/client.cpp
msgid "Done!"
-msgstr "Terminado!"
+msgstr "Feito!"
#: src/client.cpp
msgid "Initializing nodes"
@@ -714,11 +708,11 @@ msgstr "A carregar texturas..."
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Reconstruindo sombreadores..."
+msgstr "A reconstruir sombras..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
-msgstr "Erro de conexão (excedeu tempo?)"
+msgstr "Erro de ligação (excedeu tempo?)"
#: src/client/clientlauncher.cpp
msgid "Could not find or load game \""
@@ -726,7 +720,7 @@ msgstr "Não foi possível encontrar ou carregar jogo \""
#: src/client/clientlauncher.cpp
msgid "Invalid gamespec."
-msgstr "gamespec inválido."
+msgstr "Especificação de jogo inválida."
#: src/client/clientlauncher.cpp
msgid "Main Menu"
@@ -734,8 +728,7 @@ msgstr "Menu Principal"
#: src/client/clientlauncher.cpp
msgid "No world selected and no address provided. Nothing to do."
-msgstr ""
-"Nenhum mundo seleccionado e nenhum endereço providenciado. Nada para fazer."
+msgstr "Nenhum mundo seleccionado e nenhum endereço fornecido. Nada a fazer."
#: src/client/clientlauncher.cpp
msgid "Player name too long."
@@ -743,11 +736,11 @@ msgstr "Nome de jogador demasiado longo."
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr "O caminho fornecido não existe: "
+msgstr "O caminho fornecido do mundo não existe: "
#: src/fontengine.cpp
msgid "needs_fallback_font"
-msgstr "yes"
+msgstr "necessita_fonte_alternativa"
#: src/game.cpp
msgid ""
@@ -796,7 +789,7 @@ msgid ""
"- T: chat\n"
msgstr ""
"Teclas por defeito:\n"
-"- WASD: mover\n"
+"- WASD: andar\n"
"- Barra de espaço: saltar/subir\n"
"- Shift: andar cuidadosamente/descer\n"
"- Q: Largar item\n"
@@ -805,7 +798,7 @@ msgstr ""
"- Clique esquerdo: cavar/bater\n"
"- Clique direito: colocar/utilizar\n"
"- Roda do rato: seleccionar item\n"
-"- T: conversação\n"
+"- T: chat\n"
#: src/game.cpp
msgid ""
@@ -837,11 +830,11 @@ msgstr ""
#: src/game.cpp
msgid "Exit to Menu"
-msgstr "Sair para Menu"
+msgstr "Sair para o Menu"
#: src/game.cpp
msgid "Exit to OS"
-msgstr "Sair para o sistema"
+msgstr "Sair para o S.O"
#: src/game.cpp
msgid "Item definitions..."
@@ -849,11 +842,11 @@ msgstr "Definições dos Itens..."
#: src/game.cpp
msgid "KiB/s"
-msgstr "KB/s"
+msgstr "KiB/s"
#: src/game.cpp
msgid "Media..."
-msgstr "Dados..."
+msgstr "Media..."
#: src/game.cpp
msgid "MiB/s"
@@ -861,7 +854,7 @@ msgstr "MiB/s"
#: src/game.cpp
msgid "Node definitions..."
-msgstr "Definindo cubos..."
+msgstr "A definir cubos..."
#: src/game.cpp
msgid "Resolving address..."
@@ -869,7 +862,7 @@ msgstr "A resolver endereço..."
#: src/game.cpp
msgid "Respawn"
-msgstr "Reaparecer"
+msgstr "Renascer"
#: src/game.cpp
msgid "Shutting down..."
@@ -905,7 +898,7 @@ msgstr "Recuar"
#: src/guiKeyChangeMenu.cpp
msgid "Chat"
-msgstr "Conversa"
+msgstr "Chat"
#: src/guiKeyChangeMenu.cpp
msgid "Command"
@@ -917,7 +910,7 @@ msgstr "Consola"
#: src/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
-msgstr "Carregue duas vezes em \"saltar\" para ativar o vôo"
+msgstr "Carregue duas vezes em \"saltar\" para voar"
#: src/guiKeyChangeMenu.cpp
msgid "Drop"
@@ -983,6 +976,10 @@ msgstr "Ativar/Desativar noclip"
msgid "Use"
msgstr "Usar"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "pressione a tecla"
@@ -1005,7 +1002,7 @@ msgstr "Senha antiga"
#: src/guiPasswordChange.cpp
msgid "Passwords do not match!"
-msgstr "Senhas não correspondem!"
+msgstr "As senhas não correspondem!"
#: src/guiVolumeChange.cpp
msgid "Exit"
@@ -1017,11 +1014,11 @@ msgstr "Volume do som: "
#: src/keycode.cpp
msgid "Apps"
-msgstr "App"
+msgstr "Aplicações"
#: src/keycode.cpp
msgid "Attn"
-msgstr "Attm"
+msgstr "Attn"
#: src/keycode.cpp
msgid "Back"
@@ -1045,7 +1042,7 @@ msgstr "Control"
#: src/keycode.cpp
msgid "Convert"
-msgstr "Converter"
+msgstr "Convert"
#: src/keycode.cpp
msgid "CrSel"
@@ -1129,7 +1126,7 @@ msgstr "Menu"
#: src/keycode.cpp
msgid "Middle Button"
-msgstr "Botão Central do Rato"
+msgstr "Roda do Rato"
#: src/keycode.cpp
msgid "Minus"
@@ -1221,7 +1218,7 @@ msgstr "Pausa"
#: src/keycode.cpp
msgid "Period"
-msgstr "Período"
+msgstr "Ponto"
#: src/keycode.cpp
msgid "Plus"
@@ -1299,10 +1296,6 @@ msgstr "Botão X 1"
msgid "X Button 2"
msgstr "Botão X 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1313,7 +1306,7 @@ msgid ""
msgstr ""
"Deslocamento (X,Y,Z) do fractal a partir do centro do mundo em unidades "
"'escala'.\n"
-"Usado para obter uma área de nascimento apropriada, próxima de (0, 0).\n"
+"Usado para obter um spawnpoint apropriado, próximo de (0, 0).\n"
"Valores por defeito apropriados para conjunto de Mandelbrot, necessitam ser "
"adaptados para conjunto de Julia.\n"
"Intervalos aproximadamente entre -2 e 2. Multiplicar por 'escala' para "
@@ -1359,14 +1352,14 @@ msgid ""
"A chosen map seed for a new map, leave empty for random.\n"
"Will be overridden when creating a new world in the main menu."
msgstr ""
-"Semente aleatória para gerar um novo mundo (em branco para deixar o "
-"computador escolher).\n"
+"Seed aleatória para um novo mundo (em branco para ser aleatória).\n"
"Será anulada quando for criado um outro novo mundo no menu principal."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server crashes."
msgstr ""
-"Mensagem a ser mostrada a todos os clientes do servidor quando ele bloqueia."
+"Mensagem a ser mostrada a todos os clientes do servidor quando o servidor "
+"crasha."
#: src/settings_translation_file.cpp
msgid "A message to be displayed to all clients when the server shuts down."
@@ -1383,22 +1376,24 @@ msgid "Acceleration in air"
msgstr "Aceleração no ar"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Management interval"
-msgstr "Distância de ativação de blocos"
+msgstr "Intervalo de gestão de blocos ativos"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Modifier interval"
-msgstr "Distância de ativação de blocos"
+msgstr "Intervalo de Modificador de Blocos ativos"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modificadores de Blocos Ativos"
#: src/settings_translation_file.cpp
msgid "Active block range"
-msgstr "Distância de ativação de blocos"
+msgstr "Alcance de blocos ativos"
#: src/settings_translation_file.cpp
msgid "Active object send range"
-msgstr "Distância de ativação de objectos"
+msgstr "Distância de envio de objetos ativos"
#: src/settings_translation_file.cpp
msgid ""
@@ -1406,7 +1401,7 @@ msgid ""
"Leave this blank to start a local server.\n"
"Note that the address field in the main menu overrides this setting."
msgstr ""
-"Endereço para conexão.\n"
+"Endereço para ligação.\n"
"Deixe em branco para iniciar um servidor local.\n"
"Note que o campo de endereço no menu principal sobrescreve esta configuração."
@@ -1415,7 +1410,7 @@ msgid ""
"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
"screens."
msgstr ""
-"Ajustar configuração de dpi ao seu ecrã (não aplicável a X11/Android) e.g. "
+"Ajustar configuração de dpi ao seu ecrã (não aplicável a X11/Android) ex: "
"para ecrãs 4K."
#: src/settings_translation_file.cpp
@@ -1423,9 +1418,9 @@ msgid ""
"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
"This setting is for the client only and is ignored by the server."
msgstr ""
-"Ajusta a correção gama nas tabelas de luminosidade. Valores mais baixos "
+"Ajusta a codificação gama nas tabelas de luminosidade. Valores mais baixos "
"resultam \n"
-"em imagem mais clara. Configuração somente para o cliente e ignorada pelo "
+"numa imagem mais clara. Configuração somente para o cliente e ignorada pelo "
"servidor."
#: src/settings_translation_file.cpp
@@ -1479,6 +1474,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "Informar automáticamente a lista de servidores."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Tecla de autoexecução"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Tecla para andar para trás"
@@ -1491,9 +1490,8 @@ msgid "Basic"
msgstr "Básico"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic Privileges"
-msgstr "Privilégios por defeito"
+msgstr "Privilégios básicos"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
@@ -1512,6 +1510,10 @@ msgid "Build inside player"
msgstr "Construir com o jogador dentro do cubo"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Builtin"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bump mapping"
@@ -1537,7 +1539,7 @@ msgstr "Ruído para cavernas #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Largura da caverna"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1552,6 +1554,10 @@ msgid "Chat toggle key"
msgstr "Tecla mostra/esconde conversação"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comandos do Chat"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1643,6 +1649,15 @@ msgstr "Névoa colorida"
#: src/settings_translation_file.cpp
msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Lista separada por vírgulas de extras que podem usar APIs de requisição "
+"HTTP, \n"
+"que lhes permitem enviar e descarregar dados para/da internet."
+
+#: src/settings_translation_file.cpp
+msgid ""
"Comma-separated list of trusted mods that are allowed to access insecure\n"
"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
@@ -1652,15 +1667,6 @@ msgstr ""
"request_insecure_environment())."
#: src/settings_translation_file.cpp
-msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
-msgstr ""
-"Lista separada por vírgulas de extras que podem usar APIs de requisição "
-"HTTP, \n"
-"que lhes permitem enviar e descarregar dados para/da internet."
-
-#: src/settings_translation_file.cpp
msgid "Command key"
msgstr "Tecla de comando"
@@ -1728,7 +1734,7 @@ msgstr "Controla a inclinação/altura das colinas."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Controla a largura dos túneis, um valor menor cria túneis maiores."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1815,6 +1821,10 @@ msgid "Default privileges"
msgstr "Privilégios por defeito"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Formato de report predefinido"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1837,6 +1847,10 @@ msgstr ""
"ilimitado)."
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Atraso no envio de blocos após construção"
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "Latência de apresentação de dicas de ferramentas, em milissegundos."
@@ -1869,15 +1883,6 @@ msgid "Desynchronize block animation"
msgstr "Dessincroniza animação de blocos"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-"Dados de perfil detalhados do extra. Útil para desenvolvedores de extras."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Dados de perfil detalhados do extra"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1892,6 +1897,21 @@ msgid "Disable anticheat"
msgstr "Desativar anti-batota"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Desabilitar as sequências de escape"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Desabilitar as sequências de escape, por exemplo, colorimento de bate-papo.\n"
+"Use isto se você quiser executar um servidor com clientes pre-0.4.14 e para "
+"desabilitar as sequências de escape geradas por modificadores."
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Não permitir senhas vazias"
@@ -1916,6 +1936,10 @@ msgid "Dump the mapgen debug infos."
msgstr "Mostrar informações de depuração do gerador de mapa."
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Ativar Joysticks"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "Ativar VBO"
@@ -1936,6 +1960,8 @@ msgid ""
"Enable smooth lighting with simple ambient occlusion.\n"
"Disable for speed or for different looks."
msgstr ""
+"Ativar a iluminação suave com oclusão de ambiente simples.\n"
+"Desativar para velocidade ou vistas diferentes."
#: src/settings_translation_file.cpp
msgid ""
@@ -1958,6 +1984,10 @@ msgid ""
"textures)\n"
"when connecting to the server."
msgstr ""
+"Ativar a utilização de um servidor media remoto (se fornecido pelo "
+"servidor).\n"
+"Servidores remotos oferecem uma maneira mais rápida de descarregar media\n"
+"(ex. texturas) quando se estiver a conectar ao servidor."
#: src/settings_translation_file.cpp
msgid ""
@@ -1981,10 +2011,14 @@ msgid ""
"or need to be auto-generated.\n"
"Requires shaders to be enabled."
msgstr ""
+"Ativa o bumpmapping para texturas. Mapas normais devem ser fornecidos pelo "
+"pack de\n"
+"texturas ou gerado automaticamente.\n"
+"Requer que as sombras sejam ativadas."
#: src/settings_translation_file.cpp
msgid "Enables caching of facedir rotated meshes."
-msgstr ""
+msgstr "Ativar armazenamento em cache para os meshes das faces."
#: src/settings_translation_file.cpp
msgid "Enables filmic tone mapping"
@@ -2009,6 +2043,14 @@ msgstr ""
"Requer sombreadores ativados."
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2071,11 +2113,23 @@ msgid "Field of view"
msgstr "Campo de visão"
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Campo de visão"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Campo de visão em graus."
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Campo de visão durante o zoom em graus.\n"
+"Isto requer o privilégio \"zoom\" no servidor."
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2216,12 +2270,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2257,6 +2313,15 @@ msgstr ""
"- error: aborta (sugerido para desenvolvedores de extras)."
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr "Altura da janela inicial."
@@ -2287,15 +2352,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2395,6 +2451,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Côr de fundo da consola de conversação (R,G,B)."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2429,6 +2519,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2610,6 +2708,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tecla para ativar auto-corrida.\n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2648,10 +2756,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Tecla para ativar a atualização da câmara. Usado para desenvolvimento.\n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2814,6 +2925,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "A carregar modificadores de blocos"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2846,8 +2972,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2857,8 +2981,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2869,8 +2991,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2880,8 +3000,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2932,9 +3050,8 @@ msgid "Mapgen flat"
msgstr "Gerador de mapa plano"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Limite de lagos no gerador de mapa plano"
+msgstr "Tamanho de cavernas lisas no Mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
@@ -2985,9 +3102,8 @@ msgid "Mapgen fractal"
msgstr "Gerador de mapa fractal"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal cave width"
-msgstr "W do corte do gerador de mapa fractal"
+msgstr "Tamanho da caverna mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
@@ -3055,9 +3171,8 @@ msgid "Mapgen v5"
msgstr "Gerador de mapa V5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 cave width"
-msgstr "Gerador de mapa V5"
+msgstr "Tamanho da Caverna no Mapgen v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
@@ -3144,9 +3259,8 @@ msgid "Mapgen v7"
msgstr "Gerador de mapa V7"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 cave width"
-msgstr "Gerador de mapa V7"
+msgstr "Tamanho da caverna no mapgen v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
@@ -3245,6 +3359,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3286,17 +3408,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3308,10 +3434,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Opções para menus"
@@ -3352,10 +3474,6 @@ msgid "Mipmapping"
msgstr "Mapeamento MIP"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3560,11 +3678,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3572,7 +3696,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3609,6 +3733,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Diretório para logs"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Tecla para a direita"
@@ -3679,14 +3807,12 @@ msgid "Screenshot folder"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Captura de ecrã"
+msgstr "Formato da captura de ecrã"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Captura de ecrã"
+msgstr "Qualidade da Captura de ecrã"
#: src/settings_translation_file.cpp
msgid ""
@@ -3775,7 +3901,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3813,7 +3939,7 @@ msgstr "Iluminação suave"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3892,10 +4018,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3911,6 +4049,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3926,6 +4070,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -4036,10 +4186,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Útil para desenvolvedores de extras."
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4170,7 +4316,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4286,58 +4432,113 @@ msgstr ""
msgid "cURL timeout"
msgstr ""
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr ""
+#~ "Dados de perfil detalhados do extra. Útil para desenvolvedores de extras."
+
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Dados de perfil detalhados do extra"
+
+#~ msgid "Useful for mod developers."
+#~ msgstr "Útil para desenvolvedores de extras."
+
+#~ msgid "No of course not!"
+#~ msgstr "Não, é claro que não!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista de Servidores Públicos"
+
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Gerar Normalmaps"
+
+#~ msgid "No!!!"
+#~ msgstr "Não!!!"
+
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "A carregar..."
+#~ msgid "If disabled "
+#~ msgstr "Desativar Tudo"
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Descarregar"
+#~ msgid "If enabled, "
+#~ msgstr "ativo"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Botão esq: Mover todos os itens Botão dir: Mover um item"
+#~ msgid "Game Name"
+#~ msgstr "Nome do Jogo"
-#~ msgid "is required by:"
-#~ msgstr "é necessário pelo:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr ""
+#~ "Mensagem de Jogo: Impossível fazer cópia do extra \"$1\" para o jogo "
+#~ "\"$2\""
-#~ msgid "Configuration saved. "
-#~ msgstr "Configuração gravada. "
+#~ msgid "GAMES"
+#~ msgstr "JOGOS"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Atenção: Configuração não compatível. "
+#~ msgid "Mods:"
+#~ msgstr "Extras:"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Não foi possível criar mundo: Nome com caracteres inválidos"
+#~ msgid "new game"
+#~ msgstr "novo jogo"
-#~ msgid "Show Public"
-#~ msgstr "Mostrar Públicos"
+#~ msgid "EDIT GAME"
+#~ msgstr "EDITAR JOGO"
-#~ msgid "Show Favorites"
-#~ msgstr "Mostrar Favoritos"
+#~ msgid "Remove selected mod"
+#~ msgstr "Remover extra selecionado"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Deixe endereço em branco para iniciar servidor local."
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Adicionar extra"
-#~ msgid "Create world"
-#~ msgstr "Criar mundo"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENTE"
-#~ msgid "Address required."
-#~ msgstr "Endereço necessário."
+#~ msgid "START SERVER"
+#~ msgstr "INICIAR SERVIDOR"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Não foi possível eliminar mundo: Nada seleccionado"
+#~ msgid "Name"
+#~ msgstr "Nome"
-#~ msgid "Files to be deleted"
-#~ msgstr "Ficheiros para eliminar"
+#~ msgid "Password"
+#~ msgstr "Senha"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Não foi possível criar mundo: Não foram detectados jogos"
+#~ msgid "SETTINGS"
+#~ msgstr "DEFINIÇÕES"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Não foi possível configurar mundo: Nada seleccionado"
+#~ msgid "Preload item visuals"
+#~ msgstr "Pré-carregamento dos itens"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Falhou a remoção de todos os ficheiros dos mundos"
+#~ msgid "Finite Liquid"
+#~ msgstr "Líquido Finito"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "Um Jogador"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACOTES DE TEXTURAS"
+
+#~ msgid "MODS"
+#~ msgstr "EXTRAS"
+
+#, fuzzy
+#~ msgid "Add mod:"
+#~ msgstr "<<-- Adicionar extra"
+
+#, fuzzy
+#~ msgid "Local install"
+#~ msgstr "Instalar"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Atenção: Alguns mods ainda não estão configurados.\n"
+#~ "Eles vão ser ativados por predefinição quando guardar a configuração. "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Atenção: Alguns mods configurados estão em falta.\n"
+#~ "As suas definições vão ser removidas quando gravar a configuração. "
#~ msgid ""
#~ "Default Controls:\n"
@@ -4364,100 +4565,55 @@ msgstr ""
#~ "- ESC: Este menu\n"
#~ "- T: Chat\n"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Atenção: Alguns mods configurados estão em falta.\n"
-#~ "As suas definições vão ser removidas quando gravar a configuração. "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Atenção: Alguns mods ainda não estão configurados.\n"
-#~ "Eles vão ser ativados por predefinição quando guardar a configuração. "
-
-#, fuzzy
-#~ msgid "Local install"
-#~ msgstr "Instalar"
-
-#, fuzzy
-#~ msgid "Add mod:"
-#~ msgstr "<<-- Adicionar extra"
-
-#~ msgid "MODS"
-#~ msgstr "EXTRAS"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACOTES DE TEXTURAS"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "Um Jogador"
-
-#~ msgid "Finite Liquid"
-#~ msgstr "Líquido Finito"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Falhou a remoção de todos os ficheiros dos mundos"
-#~ msgid "Preload item visuals"
-#~ msgstr "Pré-carregamento dos itens"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Não foi possível configurar mundo: Nada seleccionado"
-#~ msgid "SETTINGS"
-#~ msgstr "DEFINIÇÕES"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Não foi possível criar mundo: Não foram detectados jogos"
-#~ msgid "Password"
-#~ msgstr "Senha"
+#~ msgid "Files to be deleted"
+#~ msgstr "Ficheiros para eliminar"
-#~ msgid "Name"
-#~ msgstr "Nome"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Não foi possível eliminar mundo: Nada seleccionado"
-#~ msgid "START SERVER"
-#~ msgstr "INICIAR SERVIDOR"
+#~ msgid "Address required."
+#~ msgstr "Endereço necessário."
-#~ msgid "CLIENT"
-#~ msgstr "CLIENTE"
+#~ msgid "Create world"
+#~ msgstr "Criar mundo"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Adicionar extra"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Deixe endereço em branco para iniciar servidor local."
-#~ msgid "Remove selected mod"
-#~ msgstr "Remover extra selecionado"
+#~ msgid "Show Favorites"
+#~ msgstr "Mostrar Favoritos"
-#~ msgid "EDIT GAME"
-#~ msgstr "EDITAR JOGO"
+#~ msgid "Show Public"
+#~ msgstr "Mostrar Públicos"
-#~ msgid "new game"
-#~ msgstr "novo jogo"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Não foi possível criar mundo: Nome com caracteres inválidos"
-#~ msgid "Mods:"
-#~ msgstr "Extras:"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Atenção: Configuração não compatível. "
-#~ msgid "GAMES"
-#~ msgstr "JOGOS"
+#~ msgid "Configuration saved. "
+#~ msgstr "Configuração gravada. "
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr ""
-#~ "Mensagem de Jogo: Impossível fazer cópia do extra \"$1\" para o jogo "
-#~ "\"$2\""
+#~ msgid "is required by:"
+#~ msgstr "é necessário pelo:"
-#~ msgid "Game Name"
-#~ msgstr "Nome do Jogo"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Botão esq: Mover todos os itens Botão dir: Mover um item"
#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "ativo"
+#~ msgid "Downloading"
+#~ msgstr "Descarregar"
#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Desativar Tudo"
-
-#~ msgid "No!!!"
-#~ msgstr "Não!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Gerar Normalmaps"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista de Servidores Públicos"
-
-#~ msgid "No of course not!"
-#~ msgstr "Não, é claro que não!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "A carregar..."
diff --git a/po/pt_BR/minetest.po b/po/pt_BR/minetest.po
index 3b345226b..d759c87b4 100644
--- a/po/pt_BR/minetest.po
+++ b/po/pt_BR/minetest.po
@@ -7,21 +7,21 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-31 13:45+0000\n"
-"Last-Translator: Ian giestas pauli <iangiestaspauli@gmail.com>\n"
-"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
-"minetest/minetest/pt_BR/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-20 06:07+0000\n"
+"Last-Translator: Cold Meson 06 <fernando.devmines@gmail.com>\n"
+"Language-Team: Portuguese (Brazil) "
+"<https://hosted.weblate.org/projects/minetest/minetest/pt_BR/>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"X-Generator: Weblate 2.10\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
-msgstr "Ocorreu um erro no script Lua, assim como em um mod:"
+msgstr "Ocorreu um erro em um script Lua, como um mod:"
#: builtin/fstk/ui.lua
msgid "An error occured:"
@@ -41,7 +41,7 @@ msgstr "Reconectar"
#: builtin/fstk/ui.lua
msgid "The server has requested a reconnect:"
-msgstr "O servidor requisitou uma reconexão:"
+msgstr "O servidor solicitou uma reconexão:"
#: builtin/mainmenu/common.lua src/game.cpp
msgid "Loading..."
@@ -53,25 +53,25 @@ msgstr "Versão do protocolo incompatível. "
#: builtin/mainmenu/common.lua
msgid "Server enforces protocol version $1. "
-msgstr "O servidor suporta o protocolo versão $1. "
+msgstr "O servidor obriga a versão de protocolo $1. "
#: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. "
-msgstr "O servidor suporta entre as versões $1 e $2 do protocolo. "
+msgstr "O servidor suporta versões de protocolo entre $1 e $2. "
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
-"Tente reabilitar a lista de servidores públicos e checar sua conexão de "
-"internet."
+"Tente reabilitar a lista de servidores públicos e verifique sua conexão com "
+"a internet."
#: builtin/mainmenu/common.lua
msgid "We only support protocol version $1."
-msgstr "Nós apenas suportamos a versão $1 do protocolo."
+msgstr "Nós apenas suportamos a versão de protocolo $1."
#: builtin/mainmenu/common.lua
msgid "We support protocol versions between version $1 and $2."
-msgstr "Nós suportamos entre as versões $1 e $2 do protocolo."
+msgstr "Nós suportamos as versões de protocolo entre $1 e $2 ."
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
@@ -141,11 +141,11 @@ msgstr "Criar"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Baixe um subgame, como o minetest_game, do site minetest.net"
+msgstr "Baixe um subgame, como minetest_game, do site minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
-msgstr "Baixe um do site minetest.net"
+msgstr "Baixe um apartir do site minetest.net"
#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
msgid "Game"
@@ -175,7 +175,7 @@ msgstr "Nome do mundo"
#: builtin/mainmenu/dlg_create_world.lua
msgid "You have no subgames installed."
-msgstr "Você não possui nenhum subgame instalado."
+msgstr "Você não possui subgames instalados."
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Are you sure you want to delete \"$1\"?"
@@ -213,7 +213,7 @@ msgstr "\"$1\" não é uma flag válida."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "(No description of setting given)"
-msgstr "(Descrição de configuração não fornecida)"
+msgstr "(Não há uma descrição para esta configuração)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
@@ -221,7 +221,7 @@ msgstr "< Voltar para as configurações"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
-msgstr "Navegar"
+msgstr "Procurar"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Disabled"
@@ -253,7 +253,7 @@ msgstr "Jogos"
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
msgid "Mods"
-msgstr "Módulos"
+msgstr "Modulos (Mods)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Optionally the lacunarity can be appended with a leading comma."
@@ -274,7 +274,7 @@ msgstr "Por favor, insira um número válido."
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Possible values are: "
-msgstr "Os possíveis valores são: "
+msgstr "Valores possíveis são: "
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Restore Default"
@@ -302,12 +302,11 @@ msgid ""
"Install Mod: unsupported filetype \"$1\" or broken archive"
msgstr ""
"\n"
-"Instalação de módulo: o tipo de arquivo \"$1\" não é suportado ou o arquivo "
-"está corrompido"
+"Instalar Mod: tipo de arquivo \"$1\" não suportado ou corrompido"
#: builtin/mainmenu/modmgr.lua
msgid "Failed to install $1 to $2"
-msgstr "Não foi possível instalar $1 em $2"
+msgstr "Não foi possível instalar $1 para $2"
#: builtin/mainmenu/modmgr.lua
msgid "Install Mod: file: \"$1\""
@@ -326,7 +325,7 @@ msgstr ""
#: builtin/mainmenu/store.lua
msgid "Close store"
-msgstr "Fechar Mod Store"
+msgstr "Fechar loja"
#: builtin/mainmenu/store.lua
msgid "Downloading $1, please wait..."
@@ -346,7 +345,7 @@ msgstr "Classificação"
#: builtin/mainmenu/store.lua
msgid "Search"
-msgstr "Procurar"
+msgstr "Buscar"
#: builtin/mainmenu/store.lua
msgid "Shortname:"
@@ -358,7 +357,7 @@ msgstr "Instalado com sucesso:"
#: builtin/mainmenu/store.lua
msgid "Unsorted"
-msgstr "Desorganizado"
+msgstr "Sem categoria"
#: builtin/mainmenu/store.lua
msgid "re-Install"
@@ -394,7 +393,7 @@ msgstr "Informação do módulo:"
#: builtin/mainmenu/tab_mods.lua
msgid "No mod description available"
-msgstr "Nenhuma descrição disponível do módulo"
+msgstr "Nenhuma descrição do módulo disponível"
#: builtin/mainmenu/tab_mods.lua
msgid "Rename"
@@ -413,9 +412,8 @@ msgid "Uninstall selected modpack"
msgstr "Desinstalar o pacote de módulos selecionado"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "Endereço / Porta :"
+msgstr "Endereço / Porta"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -431,22 +429,19 @@ msgstr "Modo criativo"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Damage enabled"
-msgstr "Habilitar dano"
+msgstr "Dano habilitado"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Del. Favorite"
-msgstr "Favoritos:"
+msgstr "Deletar Favorito"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Favorite"
-msgstr "Favoritos:"
+msgstr "Favoritos"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Nome / Senha :"
+msgstr "Nome / Senha"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -532,14 +527,13 @@ msgstr "Antialiasing:"
#: builtin/mainmenu/tab_settings.lua
msgid "Are you sure to reset your singleplayer world?"
-msgstr "Você tem certeza que deseja resetar seu mundo?"
+msgstr "Você tem certeza que deseja resetar seu mundo um-jogador?"
#: builtin/mainmenu/tab_settings.lua
msgid "Bilinear Filter"
msgstr "Filtragem bi-linear"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
msgstr "Bump mapping"
@@ -580,18 +574,16 @@ msgid "Node Highlighting"
msgstr "Destaque nos Blocos"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
-msgstr "Destaque nos Blocos"
+msgstr "Bloco Delineado"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
msgstr "Nenhum"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "Tone mapping"
+msgstr "Mapeamento de Normais"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -606,9 +598,12 @@ msgid "Parallax Occlusion"
msgstr "Oclusão de paralaxe"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "Habilitar partículas"
+msgstr "Partículas"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Resetar mundo um-jogador"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -623,7 +618,6 @@ msgid "Simple Leaves"
msgstr "Folhas Simples"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Smooth Lighting"
msgstr "Iluminação suave"
@@ -717,7 +711,7 @@ msgstr "Carregando texturas..."
#: src/client.cpp
msgid "Rebuilding shaders..."
-msgstr "Recompilando shaders..."
+msgstr "Reconstruindo sombreadores..."
#: src/client/clientlauncher.cpp
msgid "Connection error (timed out?)"
@@ -742,15 +736,15 @@ msgstr ""
#: src/client/clientlauncher.cpp
msgid "Player name too long."
-msgstr "Seu nome de jogador é muito longo."
+msgstr "Nome de jogador muito longo."
#: src/client/clientlauncher.cpp
msgid "Provided world path doesn't exist: "
-msgstr "O caminho fornecido não existe: "
+msgstr "O caminho do mundo providenciado não existe. "
#: src/fontengine.cpp
msgid "needs_fallback_font"
-msgstr "necessita_fonte_alternativa"
+msgstr "needs_fallback_font"
#: src/game.cpp
msgid ""
@@ -920,7 +914,7 @@ msgstr "Console"
#: src/guiKeyChangeMenu.cpp
msgid "Double tap \"jump\" to toggle fly"
-msgstr "\"Pular\" duas vezes ativa o voo"
+msgstr "\"Pular\" duas vezes para ativar o voo"
#: src/guiKeyChangeMenu.cpp
msgid "Drop"
@@ -988,9 +982,13 @@ msgstr "Alternar noclip"
msgid "Use"
msgstr "Usar"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Zoom"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
-msgstr "press. uma tecla"
+msgstr "pressione uma tecla"
#: src/guiPasswordChange.cpp
msgid "Change"
@@ -1098,15 +1096,15 @@ msgstr "Insert"
#: src/keycode.cpp
msgid "Junja"
-msgstr "Tecla Junja"
+msgstr "Junja (tecla)"
#: src/keycode.cpp
msgid "Kana"
-msgstr "Tecla Kana"
+msgstr "Kana (tecla)"
#: src/keycode.cpp
msgid "Kanji"
-msgstr "Tecla Kanji"
+msgstr "Kanji (tecla)"
#: src/keycode.cpp
msgid "Left Button"
@@ -1304,10 +1302,6 @@ msgstr "Botão X 1"
msgid "X Button 2"
msgstr "Botão X 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Zoom"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1316,6 +1310,12 @@ msgid ""
"sets.\n"
"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
msgstr ""
+"(X,Y,Z) Espaço do fractal apartir centro do mundo em unidades de 'escala'.\n"
+"Usado para mover uma área adequada de spawn de baixo da terra perto de (0, "
+"0).\n"
+"O padrão é adequado para configurações de mandelbrot,Precisa ser editado "
+"para configurações de julia.\n"
+"Variam cerca de -2 a 2. Multiplica por \"escala\" para compensação de nós."
#: src/settings_translation_file.cpp
msgid ""
@@ -1374,21 +1374,23 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Absolute limit of emerge queues"
-msgstr "Limite absoluto de emergir filas"
+msgstr "Limite absoluto de filas emergentes"
#: src/settings_translation_file.cpp
msgid "Acceleration in air"
msgstr "Aceleração no ar"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Management interval"
-msgstr "Limite para blocos ativos"
+msgstr "Intervalo de Gestão de Blocos Ativos"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Modifier interval"
-msgstr "Limite para blocos ativos"
+msgstr "Intervalo do \"Active Block Modifier\" (ABMs)"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modificadores de Bloco Ativo (ABM)"
#: src/settings_translation_file.cpp
msgid "Active block range"
@@ -1476,22 +1478,24 @@ msgid "Automaticaly report to the serverlist."
msgstr "Informar lista de servidores automaticamente."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Chave de execução automática"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "Tecla para andar para trás"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Base terrain height"
-msgstr "Altura da base do terreno"
+msgstr "Altura base do terreno"
#: src/settings_translation_file.cpp
msgid "Basic"
msgstr "Básico"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic Privileges"
-msgstr "Privilégios por padrão"
+msgstr "Privilégios básicos"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
@@ -1512,6 +1516,11 @@ msgid "Build inside player"
msgstr "Construir com o jogador dentro do bloco"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Builtin"
+msgstr "Embutido"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Bump mapping"
@@ -1537,7 +1546,7 @@ msgstr "Ruído nas cavernas #2"
#: src/settings_translation_file.cpp
msgid "Cave width"
-msgstr ""
+msgstr "Largura da caverna"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1553,6 +1562,10 @@ msgid "Chat toggle key"
msgstr "Tecla comutadora de chat"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Comandos de Chat"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1624,7 +1637,7 @@ msgstr "Altura das nuvens"
#: src/settings_translation_file.cpp
msgid "Cloud radius"
-msgstr "Espessura das nuvens"
+msgstr "Raio das nuvens"
#: src/settings_translation_file.cpp
msgid "Clouds"
@@ -1644,21 +1657,21 @@ msgstr "Névoa colorida"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
-"Lista separada por vírgulas dos mods confiáveis que podem utilizar funções "
-"inseguras mesmo quando o a opção de Mod Seguro está ativada (via "
-"request_insecure_environment())."
+"Lista de mods, separados por vírgulas, que tem acesso a APIs HTTP, que\n"
+"os permitem enviar e baixar informações para/da internet."
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
-"Lista de mods, separados por vírgulas, que podem usar APIs de requisição "
-"HTTP, que\n"
-"os permitem enviar e baixar informações para/da internet."
+"Lista separada por vírgulas dos mods confiáveis que podem utilizar funções "
+"inseguras \n"
+"mesmo quando o a opção de Mod Seguro está ativada (via "
+"request_insecure_environment())."
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -1729,7 +1742,7 @@ msgstr "Controla o esparsamento/altura das colinas."
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "Controla a largura dos túneis, um valor menor cria túneis mais largos."
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1769,7 +1782,7 @@ msgstr "Cor do cursor (R,G,B)."
#: src/settings_translation_file.cpp
msgid "Crouch speed"
-msgstr "Velocidade para descer"
+msgstr "Velocidade de agachamento"
#: src/settings_translation_file.cpp
msgid "DPI"
@@ -1781,7 +1794,7 @@ msgstr "Dano"
#: src/settings_translation_file.cpp
msgid "Debug info toggle key"
-msgstr "Tecla para alternar modo de Debug"
+msgstr "Tecla para alternar modo de Depuração"
#: src/settings_translation_file.cpp
msgid "Debug log level"
@@ -1816,6 +1829,10 @@ msgid "Default privileges"
msgstr "Privilégios por padrão"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Formato de reporte padrão"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1829,7 +1846,7 @@ msgid ""
"A higher value results in smoother normal maps."
msgstr ""
"Define processo amostral de textura.\n"
-"Um valor mais alto resulta em mais suaves mapas normais."
+"Um valor mais alto resulta em mapas de normais mais suaves."
#: src/settings_translation_file.cpp
msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
@@ -1838,12 +1855,16 @@ msgstr ""
"ilimitado)."
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Atraso em enviar blocos depois da construção"
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "Dicas de ferramenta mostrando atraso. indicado em milissegundos."
#: src/settings_translation_file.cpp
msgid "Deprecated Lua API handling"
-msgstr "Tratamento da API Lua rejeitado"
+msgstr "Tratamento de API Lua rejeitada"
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
@@ -1870,14 +1891,6 @@ msgid "Desynchronize block animation"
msgstr "Dessincronizar animação do bloco"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "Dados detalhados do perfil do mod . Útil para desenvolvedores de mods."
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "Perfilamento detalhado do mod"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1892,6 +1905,21 @@ msgid "Disable anticheat"
msgstr "Habilitar Anti-Hack"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Desabilitar as seqüências de escape"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Desabilitar as sequências de escape, por exemplo, colorimento de bate-papo.\n"
+"Use isto se você quiser executar um servidor com clientes pre-0.4.14 e para "
+"desabilitar as sequências de escape geradas por modificadores."
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Não permitir logar sem senha"
@@ -1913,7 +1941,11 @@ msgstr "Tecla para largar item"
#: src/settings_translation_file.cpp
msgid "Dump the mapgen debug infos."
-msgstr "Mostrar informações de depuração do Mapgen."
+msgstr "Mostrar informações de depuração do Gerador de mapa."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Habilitar Joysticks"
#: src/settings_translation_file.cpp
msgid "Enable VBO"
@@ -2022,6 +2054,14 @@ msgstr ""
"Requer shaders a serem ativados."
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Intervalo de exibição dos dados das analizes do motor"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Metodos de entidade"
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2031,7 +2071,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "FPS in pause menu"
-msgstr "FPS em menu de pausa"
+msgstr "FPS no menu de pausa"
#: src/settings_translation_file.cpp
msgid "FSAA"
@@ -2086,11 +2126,23 @@ msgid "Field of view"
msgstr "Campo de visão"
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Campo de visão para o zoom"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Campo de visão em graus."
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Campo de visão em durante o zoom em graus\n"
+"Isso requer o privilegio \"zoom\" no servidor."
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2099,7 +2151,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Filler Depth"
-msgstr ""
+msgstr "Profundidade de enchimento"
#: src/settings_translation_file.cpp
msgid "Filmic tone mapping"
@@ -2143,7 +2195,7 @@ msgstr "Tecla de comutação de névoa"
#: src/settings_translation_file.cpp
msgid "Font path"
-msgstr "Caminho fonte"
+msgstr "Caminho da fonte"
#: src/settings_translation_file.cpp
msgid "Font shadow"
@@ -2167,7 +2219,7 @@ msgstr "Tamanho da fonte"
#: src/settings_translation_file.cpp
msgid "Format of screenshots."
-msgstr ""
+msgstr "Formato das screenshots."
#: src/settings_translation_file.cpp
msgid "Forward key"
@@ -2182,22 +2234,22 @@ msgid ""
"From how far blocks are generated for clients, stated in mapblocks (16 "
"nodes)."
msgstr ""
-"De quão longe blocos são gerados para os clientes, indicado em mapa de "
-"blocos (16 nós)."
+"De quão longe blocos são gerados para os clientes, indicado em chunks (16 "
+"blocos)."
#: src/settings_translation_file.cpp
msgid ""
"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
msgstr ""
-"De quão longe blocos são enviados aos clientes, indicado em mapas de blocos "
-"(16 nós)."
+"De quão longe blocos são enviados aos clientes, indicado em chunks (16 "
+"blocos)."
#: src/settings_translation_file.cpp
msgid ""
"From how far clients know about objects, stated in mapblocks (16 nodes)."
msgstr ""
-"De quão longe os clientes sabem sobre objetos, indicado em mapas blocos (16 "
-"nós)."
+"De quão longe os clientes sabem sobre objetos, indicado em chunks (16 "
+"blocos)."
#: src/settings_translation_file.cpp
msgid "Full screen"
@@ -2233,16 +2285,17 @@ msgstr "Geral"
#: src/settings_translation_file.cpp
msgid "Generate normalmaps"
-msgstr "Gerar normalmaps"
+msgstr "Gerar mapa de normais"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Chamadas de retorno Globais"
#: 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.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2252,7 +2305,7 @@ msgstr ""
"árvores\n"
"e grama do pântano, em todos os outros mapgens essa flag controla todas as "
"decorações.\n"
-"Flags que não são especificadas na string da flag não são alteradas por "
+"Flags que não são especificadas na string da flag não são alteradas por "
"padrão.\n"
"Flags começando com \"no\" (não) são usada para explicitamente desabilitá-"
"las."
@@ -2267,7 +2320,7 @@ msgstr "Gravidade"
#: src/settings_translation_file.cpp
msgid "HTTP Mods"
-msgstr "HTTP mods"
+msgstr "Modúlos HTTP"
#: src/settings_translation_file.cpp
msgid "HUD toggle key"
@@ -2289,6 +2342,20 @@ msgstr ""
"desenvolvedores de mods)."
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Tem o instrumento de registro em si:\n"
+"* Monitorar uma função vazia.\n"
+"Isto estima a sobrecarga, que o istrumento está adicionando (+1 Chamada de "
+"função).\n"
+"* Monitorar o amostrador que está sendo usado para atualizar as estatísticas."
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr "Altura da janela inicial."
@@ -2315,24 +2382,15 @@ msgid ""
"In active blocks objects are loaded and ABMs run."
msgstr ""
"Quão grande área de blocos estão sujeitos ao material do bloco ativo, "
-"indicado em mapas blocos (16 nós).\n"
+"indicado em mapblocks (16 nós).\n"
"Em blocos ativos objetos são carregados e ABMs são executadas."
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
-"Quanto o servidor aguardará antes de descarregar mapblocks não utilizados. "
+"Quanto o servidor aguardará antes de descarregar chunks não utilizados. \n"
"Um valor mais elevado é mais suave, mas vai usar mais memória RAM."
#: src/settings_translation_file.cpp
@@ -2444,6 +2502,46 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Cor de fundo do Bate-papo no jogo (R,G,B)."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Monitoração imbutida.\n"
+"Isto é usualmente apenas nessesário por contribuidores core/builtin"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Monitoração de comandos de chat quando registrados."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Monitorar de chamadas de retorno globais durante a registração.\n"
+"(qualquer coisa que você passar ao minetest.register_*() function)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+"Monitorar a ação de ação do Active Block Modifiers durante a registração."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+"Monitorar a ação de ação do Loading Block Modifiers durante a registração."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Monitorar os métodos das entidades durante a registração."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Monitorização"
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
"Intervalo para cada salvamento de alterações importantes no mundo, indicado "
@@ -2482,20 +2580,27 @@ msgstr ""
"Controles da escala de detalhes."
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Intervalo de repetição do botão do Joystick"
+
+#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "Sensibilidade do frustum do Joystick"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
-"Apenas para conjunto de Julia: Largura da constante hipercomplexa "
-"determinando o formato do conjunto.\n"
+"Apenas para a configuração de Julia: Componente W da constante hipercomplexa "
+"determinando o formato julia.\n"
"Não tem nenhum efeito em fractais 3D.\n"
-"Intervalo rugoso entre -2 e 2."
+"Intervalo aproximadamente entre -2 e 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: X component of hypercomplex constant determining julia "
"shape.\n"
@@ -2503,10 +2608,9 @@ msgid ""
msgstr ""
"Apenas para conjunto de Julia: Componente X da constante hipercomplexa "
"determinando o formato do conjunto.\n"
-"Intervalo rugoso entre -2 e 2."
+"Intervalo aproximadamente entre -2 e 2."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Julia set only: Y component of hypercomplex constant determining julia "
"shape.\n"
@@ -2514,7 +2618,7 @@ msgid ""
msgstr ""
"Apenas para conjunto de Julia: Componente Y da constante hipercomplexa "
"determinando o formato do conjunto.\n"
-"Intervalo rugoso entre -2 e 2."
+"Intervalo aproximadamente entre -2 e 2."
#: src/settings_translation_file.cpp
msgid ""
@@ -2528,7 +2632,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Jump key"
-msgstr "Pular"
+msgstr "Tecla para Pular"
#: src/settings_translation_file.cpp
msgid "Jumping speed"
@@ -2570,9 +2674,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Tecla para pular.\n"
-"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Tecla para pular. \n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2580,9 +2684,9 @@ msgid ""
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
-"Tecla para mover-se rápido no modo rápido.\n"
-"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Tecla para mover-se rápido no modo rápido. \n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2710,6 +2814,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Tecla para ativar/desativar o modo auto acionamento.\n"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2760,14 +2874,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
"Tecla para ativar/desativar a atualização da câmera. Usado somente para "
"desenvolvimento\n"
-"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-"html#a54da2a0e231901735e3da1b0edf72eb3"
+"Consulte http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e2319"
+"01735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2876,11 +2990,11 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "Período de tempo entre os ciclos de execução de ABMs"
#: src/settings_translation_file.cpp
msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "Período de tempo entre ciclos de execução de NodeTimer"
#: src/settings_translation_file.cpp
msgid ""
@@ -2954,6 +3068,24 @@ msgid "Liquid update tick"
msgstr "Período de atualização dos Líquidos"
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Carregar o analizador do jogo"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Carregar o analizador do jogo para coletar dados de analize do jogo\n"
+"Providencia o comando /profiler para acessar a analize compiliada.\n"
+"Muito util para desenvolvedores de mods e operadores de servidores."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Carregado Block Modifiers"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr "Menu principal gestor de games"
@@ -2981,7 +3113,6 @@ msgid "Map directory"
msgstr "Diretório do mapa"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen Valleys.\n"
"'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2989,75 +3120,65 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Atributos para o gerador de mapas específico para o Mapgen v6.\n"
-"Quando biomas de neve estão habilitados, pântanos ficam habilitados e a flag "
-"de pântanos é ignorada.\n"
-"Flags que não são especificadas na string da flag não são modificadas por "
+"Atributos para o gerador de mapas específico para o gerador de mundo Valleys."
+"\n"
+"'altitude_chill' faz elevações mais altas mais geladas, o que pode causar "
+"problemas em biomas.\n"
+"'humid_rivers' modifica a humidade ao redor de rios e em ares que a água "
+"tende a virar poças,\n"
+"Isto pode interferir como os biomas são delicadamente ajustados\n"
+"Flags que não são especificadas na linha da flag não são modificadas por "
"padrão.\n"
-"Flags começando com \"no\" (não) são usadas para explicitamente desabilitá-"
-"las."
+"Flags começando com \"no\" (não) são usadas para desabilitá-las "
+"explicitamente."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Atributos de mapgen específicos para Mapgen plano.\n"
-"Alguns lagos e colinas são ocasionalmente adicionados num mundo plano.\n"
-"Flags que não estão especificadas na string de flags não são modificados a "
-"partir do padrão.\n"
-"Flags começando com \"no\" (não) são usadas para desativá-los explicitamente."
+"Atributos de geração de mapas específicos para o gerador de mundo plano.\n"
+"Lagos ocasionais e colinas podem ser adicionados ao mundo plano.\n"
+"Flags que não estão especificadas na string da flag não são modificadas por "
+"padrão.\n"
+"Flags começando com \"no\" são usadas para desabilitá-las explicitamente."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Atributos para o gerador de mapas específico para o Mapgen v6.\n"
-"Quando biomas de neve estão habilitados, pântanos ficam habilitados e a flag "
-"de pântanos é ignorada.\n"
+"Atributos para o gerador de mapas específico para o gerador de mundo v6.\n"
+"Quando biomas de neve estão habilitadas, selvas são automaticamente "
+"habilitadas, a flag 'jungles' é ignorada.\n"
"Flags que não são especificadas na string da flag não são modificadas por "
"padrão.\n"
-"Flags começando com \"no\" (não) são usadas para explicitamente desabilitá-"
-"las."
+"Flags começando com \"no\" são usadas para desabilitá-las explicitamente."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"Atributos para o gerador de mapas específico para o Mapgen v6.\n"
-"Quando biomas de neve estão habilitados, pântanos ficam habilitados e a flag "
-"de pântanos é ignorada.\n"
-"Flags que não são especificadas na string da flag não são modificadas por "
+"Atributos de geração de mapas específicos para o gerador de mundo v7.\n"
+"A flag'ridges' controla os rios.\n"
+"Flags que não estão especificadas na string da flag não são modificadas por "
"padrão.\n"
-"Flags começando com \"no\" (não) são usadas para explicitamente desabilitá-"
-"las."
+"Flags começando com \"no\" são usadas para desabilitá-las explicitamente."
#: src/settings_translation_file.cpp
msgid "Map generation limit"
@@ -3073,7 +3194,7 @@ msgstr "Limite de mapblock"
#: src/settings_translation_file.cpp
msgid "Mapblock unload timeout"
-msgstr "Timeout de descarregamento do mapblock"
+msgstr "Tempo limite de descarregamento do mapblock"
#: src/settings_translation_file.cpp
msgid "Mapgen Valleys"
@@ -3097,349 +3218,371 @@ msgstr "Debug do mapgen"
#: src/settings_translation_file.cpp
msgid "Mapgen flags"
-msgstr "Flags do Mapgen"
+msgstr "Flags do gerador de mundo"
#: src/settings_translation_file.cpp
msgid "Mapgen flat"
-msgstr "Mapgen plano"
+msgstr "Gerador de mundo plano"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Threshold dos lagos no Mapgen plano"
+msgstr "Largura das cavernas no gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido \"cave 1\" do gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido \"cave2\" do gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat filler depth noise parameters"
msgstr ""
+"Parâmetros de ruído da profundidade de preenchimento plano do gerador de "
+"mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat flags"
-msgstr "Flags do Mapgen plano"
+msgstr "Flags do gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat ground level"
-msgstr "Nível do terreno para o Mapgen plano"
+msgstr "Nível do terreno para o gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill steepness"
-msgstr "Esparsamento das colinas no Mapgen plano"
+msgstr "Esparsamento das colinas no gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat hill threshold"
-msgstr "Threshold das colinas no Mapgen plano"
+msgstr "Threshold das colinas no gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat lake steepness"
-msgstr "Esparsamento de lagos no Mapgen plano"
+msgstr "Esparsamento de lagos no gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat lake threshold"
-msgstr "Threshold dos lagos no Mapgen plano"
+msgstr "Threshold dos lagos no gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat large cave depth"
-msgstr ""
+msgstr "Largura das cavernas grandes no gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen flat terrain noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de terreno do gerador de mundo plano"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal"
-msgstr "Fractal do Mapgen"
+msgstr "Gerador de mundo fractal"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal cave width"
-msgstr "Componente W da fatia do fractal do Mapgen"
+msgstr "Largura das cavernas do gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido \"cave1\" do gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetro de ruido do fractal do cave2 do gerador de mundo"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal filler depth noise parameters"
msgstr ""
+"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo "
+"fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal fractal"
-msgstr "Fractal do Mapgen fractal"
+msgstr "Fractal do gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal iterations"
-msgstr "Iterações no fractal do Mapgen"
+msgstr "Iterações gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia w"
-msgstr "Componente W do fractal Julia no Mapgen"
+msgstr "Componente W do gerador de mundo fractal julia"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia x"
-msgstr "Componente X do fractal julia no Mapgen"
+msgstr "Componente X do gerador de mundo fractal julia"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia y"
-msgstr "Componente Y do fractal julia no Mapgen"
+msgstr "Componente Y do gerador de mundo fractal julia"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal julia z"
-msgstr "Componente Z do fractal julia no Mapgen"
+msgstr "Componente Z do gerador de mundo fractal julia"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal offset"
-msgstr "Offset do fractal do Mapgen"
+msgstr "Espacamento do gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal scale"
-msgstr "Escala no fractal do Mapgen"
+msgstr "Escala do gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal seabed noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido do leito oceânico do gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal slice w"
-msgstr "Componente W da fatia do fractal do Mapgen"
+msgstr "Componente W da fatia do gerador de mundo fractal"
#: src/settings_translation_file.cpp
msgid "Mapgen heat blend noise parameters"
-msgstr ""
+msgstr "Parâmetros de mistura de ruido do gerador de mundo \"heat\""
#: src/settings_translation_file.cpp
msgid "Mapgen name"
-msgstr "Nome do mapgen"
+msgstr "Nome do gerador de mundo"
#: src/settings_translation_file.cpp
msgid "Mapgen v5"
-msgstr "Mapgen versão 5"
+msgstr "Gerador de mundo v5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 cave width"
-msgstr "Profundidade de cavernas grandes"
+msgstr "Largura das cavernas no gerador de mundo v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave1 do gerador de mundo v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave2 do gerador de mundo v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 factor noise parameters"
-msgstr ""
+msgstr "Parâmetros do fator de ruido do gerador de mundo v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 filler depth noise parameters"
msgstr ""
+"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 height noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de altura do gerador de mundo v5"
#: src/settings_translation_file.cpp
msgid "Mapgen v6"
-msgstr "Mapgen versão 6"
+msgstr "Gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 apple trees noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das macieiras no gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach frequency"
-msgstr ""
+msgstr "Frequência de praia do Mapgen v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 beach noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das praias no gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 biome noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de bioma do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 cave noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de caverna do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 desert frequency"
-msgstr ""
+msgstr "Frequência de deserto do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 flags"
-msgstr ""
+msgstr "Flags do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 height select noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de seleção de altura do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 humidity noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de umidade do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 mud noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de lama do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 steepness noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de inclinação do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 terrain altitude noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 terrain base noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido base do terreno do gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v6 trees noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das árvores no gerador de mundo v6"
#: src/settings_translation_file.cpp
msgid "Mapgen v7"
-msgstr "Mapgen versão 7"
+msgstr "Gerador de mundo v7"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 cave width"
-msgstr "Profundidade de cavernas grandes"
+msgstr "Largura das cavernas no gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave1 do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave2 noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido cave2 do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 filler depth noise parameters"
msgstr ""
+"Parâmetros de ruido da profundidade de preenchimento do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 flags"
-msgstr ""
+msgstr "Flags do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 height select noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido da seleção de altura do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 mount height noise parameters"
-msgstr ""
+msgstr "Parâmetros ruido da altura de montagem do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 mountain noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido das montanha do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 ridge noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de cume do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 ridge water noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de cume de água do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 terrain altitude noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de altitude do terreno do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 terrain base noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido base do terreno do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 terrain persistation noise parameters"
-msgstr ""
+msgstr "Parâmetros de ruido de persistencia do terreno do gerador de mundo v7"
#: src/settings_translation_file.cpp
msgid "Massive cave depth"
-msgstr ""
+msgstr "Profundidade de caverna enorme"
#: src/settings_translation_file.cpp
msgid "Massive cave noise"
-msgstr ""
+msgstr "Ruido de caverna enorme"
#: src/settings_translation_file.cpp
msgid "Massive caves form here."
-msgstr ""
+msgstr "Forma de cavernas enormes aqui."
#: src/settings_translation_file.cpp
msgid "Max block generate distance"
-msgstr ""
+msgstr "Distância máxima de geração de bloco"
#: src/settings_translation_file.cpp
msgid "Max block send distance"
-msgstr ""
+msgstr "Distância máxima de envio de bloco"
#: src/settings_translation_file.cpp
msgid "Max liquids processed per step."
-msgstr ""
+msgstr "Máximo de líquidos processados por etapa."
#: src/settings_translation_file.cpp
msgid "Max. clearobjects extra blocks"
-msgstr ""
+msgstr "Max. clearobjects blocos extras"
#: src/settings_translation_file.cpp
msgid "Max. packets per iteration"
-msgstr ""
+msgstr "Max. pacotes por iteração"
#: src/settings_translation_file.cpp
msgid "Maximum FPS"
-msgstr ""
+msgstr "FPS máximo"
#: src/settings_translation_file.cpp
msgid "Maximum FPS when game is paused."
-msgstr ""
+msgstr "Máximo FPS quando o jogo é pausado."
#: src/settings_translation_file.cpp
msgid "Maximum forceloaded blocks"
-msgstr ""
+msgstr "Máximo de blocos carregados forçadamente"
#: src/settings_translation_file.cpp
msgid "Maximum hotbar width"
+msgstr "Largura máxima da hotbar"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+"Número máximo de jogadores que podem se conectar simultaneamente no total."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
msgstr ""
+"Número máximo de blocos que podem ser simultaneamente enviados por cliente."
#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
+"Número máximo de blocos que podem ser enfileirados para o carregamento."
#: src/settings_translation_file.cpp
msgid ""
"Maximum number of blocks to be queued that are to be generated.\n"
"Set to blank for an appropriate amount to be chosen automatically."
msgstr ""
+"Número máximo de blocos para serem enfileirados que estão a ser gerados.\n"
+"Definido em branco para uma quantidade apropriada ser escolhida "
+"automaticamente."
#: src/settings_translation_file.cpp
msgid ""
"Maximum number of blocks to be queued that are to be loaded from file.\n"
"Set to blank for an appropriate amount to be chosen automatically."
msgstr ""
+"Número máximo de blocos para ser enfileirado que serão carregados do "
+"arquivo.\n"
+"Definido em branco para uma quantidade apropriada ser escolhida "
+"automaticamente."
#: src/settings_translation_file.cpp
msgid "Maximum number of forceloaded mapblocks."
-msgstr ""
+msgstr "Número máximo de chunks carregados forçadamente."
#: src/settings_translation_file.cpp
msgid ""
"Maximum number of mapblocks for client to be kept in memory.\n"
"Set to -1 for unlimited amount."
msgstr ""
+"Número máximo de mapblocks para o cliente para ser mantido na memória.\n"
+"Definido como -1 para quantidade ilimitada."
#: src/settings_translation_file.cpp
msgid ""
@@ -3447,40 +3590,48 @@ msgid ""
"try reducing it, but don't reduce it to a number below double of targeted\n"
"client number."
msgstr ""
+"Número máximo de pacotes enviados por etapa de envio, se você tem uma "
+"conexão lenta \n"
+"tente reduzir isso, mas não reduza a um número abaixo do dobro do número de "
+"cliente alvo."
#: src/settings_translation_file.cpp
msgid "Maximum number of players that can connect simultaneously."
-msgstr ""
+msgstr "Número máximo de jogadores que podem se conectar simultaneamente."
#: src/settings_translation_file.cpp
msgid "Maximum number of statically stored objects in a block."
-msgstr ""
+msgstr "Número máximo de objetos estaticamente armazenados em um bloco."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Limite maximo de objetos por bloco"
#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
+"Proporção máxima da janela atual a ser usada para hotbar.\n"
+"Útil se houver algo para ser exibido a direito ou esquerda do hotbar."
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
-msgstr ""
+msgid "Maximum simultaneous block sends per client"
+msgstr "Máximo de blocos enviados simultaneamente por cliente"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
-msgstr ""
+msgid "Maximum simultaneous block sends total"
+msgstr "Máximo de blocos totais enviados simultaneamente"
#: src/settings_translation_file.cpp
msgid "Maximum time in ms a file download (e.g. a mod download) may take."
msgstr ""
+"Tempo máximo em ms para download de arquivo (por exemplo, um arquivo ZIP de "
+"um modificador) pode tomar."
#: src/settings_translation_file.cpp
msgid "Maximum users"
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
+msgstr "Limite de usuários"
#: src/settings_translation_file.cpp
msgid "Menus"
@@ -3488,89 +3639,91 @@ msgstr "Opções para menus"
#: src/settings_translation_file.cpp
msgid "Mesh cache"
-msgstr ""
+msgstr "Cache de malha"
#: src/settings_translation_file.cpp
msgid "Message of the day"
-msgstr ""
+msgstr "Mensagem do dia"
#: src/settings_translation_file.cpp
msgid "Message of the day displayed to players connecting."
-msgstr ""
+msgstr "Mensagem do dia exibida aos jogadores ao conectar."
#: src/settings_translation_file.cpp
msgid "Method used to highlight selected object."
-msgstr ""
+msgstr "Método usado para destacar o objeto selecionado."
#: src/settings_translation_file.cpp
msgid "Minimap"
-msgstr ""
+msgstr "Minimapa"
#: src/settings_translation_file.cpp
msgid "Minimap key"
-msgstr ""
+msgstr "Tecla do Minimapa"
#: src/settings_translation_file.cpp
msgid "Minimap scan height"
-msgstr ""
+msgstr "Altura de escaneamento do minimapa"
#: src/settings_translation_file.cpp
msgid "Minimum texture size for filters"
-msgstr ""
+msgstr "Tamanho mínimo da textura para filtros"
#: src/settings_translation_file.cpp
msgid "Mipmapping"
msgstr "Mipmapping (filtro)"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
-msgstr ""
+msgstr "URL de detalhes da Modstore"
#: src/settings_translation_file.cpp
msgid "Modstore download URL"
-msgstr ""
+msgstr "URL de download da Modstore"
#: src/settings_translation_file.cpp
msgid "Modstore mods list URL"
-msgstr ""
+msgstr "URL da lista de modificadores da Modstore"
#: src/settings_translation_file.cpp
msgid "Monospace font path"
-msgstr ""
+msgstr "Caminho de fonte monoespaçada"
#: src/settings_translation_file.cpp
msgid "Monospace font size"
-msgstr ""
+msgstr "Tamanho da fonte monoespaçada"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity"
-msgstr ""
+msgstr "Sensibilidade do mouse"
#: src/settings_translation_file.cpp
msgid "Mouse sensitivity multiplier."
-msgstr ""
+msgstr "Multiplicador de sensibilidade do mouse."
#: src/settings_translation_file.cpp
msgid ""
"Multiplier for fall bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
+"Multiplicador para cair balançando.\n"
+"Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo."
#: src/settings_translation_file.cpp
msgid ""
"Multiplier for view bobbing.\n"
"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
msgstr ""
+"Multiplicador para sacudir a exibição.\n"
+"Por exemplo: 0 para não ver balançando; 1.0 para normal; 2.0 para duplo."
#: src/settings_translation_file.cpp
msgid ""
"Name of map generator to be used when creating a new world.\n"
"Creating a world in the main menu will override this."
msgstr ""
+"Nome do gerador de mapa a ser usado ao criar um novo mundo.\n"
+"Criação de um mundo no menu principal irá substituir isso."
#: src/settings_translation_file.cpp
msgid ""
@@ -3578,61 +3731,70 @@ msgid ""
"When running a server, clients connecting with this name are admins.\n"
"When starting from the main menu, this is overridden."
msgstr ""
+"Nome do jogador.\n"
+"Quando executando um servidor, os clientes com este nome são administradores."
+"\n"
+"Quando iniciado pelo menu principal, este é substituido."
#: src/settings_translation_file.cpp
msgid ""
"Name of the server, to be displayed when players join and in the serverlist."
msgstr ""
+"Nome do servidor, a ser exibido quando os jogadores abrem a lista de "
+"servidores."
#: src/settings_translation_file.cpp
msgid "Network"
-msgstr ""
+msgstr "Rede"
#: src/settings_translation_file.cpp
msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
+"Porta de rede para receber dados (UDP).\n"
+"Esse valor será substituído se for definido a partir do menu principal."
#: src/settings_translation_file.cpp
msgid "New users need to input this password."
-msgstr ""
+msgstr "Novos usuários precisam inserir esta senha."
#: src/settings_translation_file.cpp
msgid "Noclip"
-msgstr ""
+msgstr "Atravessar blocos"
#: src/settings_translation_file.cpp
msgid "Noclip key"
-msgstr ""
+msgstr "Tecla Noclip"
#: src/settings_translation_file.cpp
msgid "Node highlighting"
-msgstr ""
+msgstr "Destacamento do bloco"
#: src/settings_translation_file.cpp
msgid "NodeTimer interval"
-msgstr ""
+msgstr "Intervalo de NodeTimer"
#: src/settings_translation_file.cpp
msgid "Noise parameters for biome API temperature, humidity and biome blend."
msgstr ""
+"Parâmetros de ruido para a API de temperatura, umidade e mistura de bioma."
#: src/settings_translation_file.cpp
msgid "Noises"
-msgstr ""
+msgstr "Ruidos"
#: src/settings_translation_file.cpp
msgid "Normalmaps sampling"
-msgstr ""
+msgstr "Amostragem de normalmaps"
#: src/settings_translation_file.cpp
msgid "Normalmaps strength"
-msgstr ""
+msgstr "Intensidade de normalmaps"
#: src/settings_translation_file.cpp
msgid "Number of emerge threads"
-msgstr ""
+msgstr "Número de seguimentos de emersão"
#: src/settings_translation_file.cpp
msgid ""
@@ -3642,6 +3804,11 @@ msgid ""
"speed greatly\n"
"at the cost of slightly buggy caves."
msgstr ""
+"Número de seguimentos de emersão para usar. Deixe esse campo em branco, ou "
+"aumente esse número\n"
+"para usar vários segmentos. Em sistemas multiprocessadores, isto irá "
+"melhorar muito a velocidade do mapgen\n"
+"à custa de uns poucos bugs nas cavernas."
#: src/settings_translation_file.cpp
msgid ""
@@ -3649,102 +3816,121 @@ msgid ""
"This is a trade-off between sqlite transaction overhead and\n"
"memory consumption (4096=100MB, as a rule of thumb)."
msgstr ""
+"Número de blocos extras que pode ser carregados por /clearobjects ao mesmo "
+"tempo.\n"
+"Esta é uma troca entre sobrecarga de transação do sqlite e consumo de "
+"memória (4096 = 100 MB, como uma regra de ouro)."
#: src/settings_translation_file.cpp
msgid "Number of parallax occlusion iterations."
-msgstr ""
+msgstr "Número de iterações de oclusão de paralaxe."
#: src/settings_translation_file.cpp
msgid "Overall bias of parallax occlusion effect, usually scale/2."
-msgstr ""
+msgstr "Viés geral do efeito de oclusão de paralaxe, geralmente de escala/2."
#: src/settings_translation_file.cpp
msgid "Overall scale of parallax occlusion effect."
-msgstr ""
+msgstr "Escala global do efeito de oclusão de paralaxe."
#: src/settings_translation_file.cpp
msgid "Parallax occlusion"
-msgstr ""
+msgstr "Oclusão de paralaxe"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion Scale"
-msgstr ""
+msgstr "Escala de Oclusão de paralaxe"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion bias"
-msgstr ""
+msgstr "Viés de oclusão de paralaxe"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion iterations"
-msgstr ""
+msgstr "Iterações de oclusão de paralaxe"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion mode"
-msgstr ""
+msgstr "Modo de oclusão de paralaxe"
#: src/settings_translation_file.cpp
msgid "Parallax occlusion strength"
-msgstr ""
+msgstr "Insinsidade de oclusão de paralaxe"
#: src/settings_translation_file.cpp
msgid "Path to TrueTypeFont or bitmap."
-msgstr ""
+msgstr "Caminho para TrueTypeFont ou bitmap."
#: src/settings_translation_file.cpp
msgid "Path to save screenshots at."
-msgstr ""
+msgstr "Caminho para onde salvar screenshots."
#: src/settings_translation_file.cpp
msgid "Path to texture directory. All textures are first searched from here."
msgstr ""
+"Caminho para o diretório de texturas. Todas as texturas são pesquisadas "
+"primeiro daqui."
#: src/settings_translation_file.cpp
msgid "Physics"
-msgstr ""
+msgstr "Física"
#: src/settings_translation_file.cpp
msgid ""
"Player is able to fly without being affected by gravity.\n"
"This requires the \"fly\" privilege on the server."
msgstr ""
+"O jogador é capaz de voar sem ser afetado pela gravidade.\n"
+"Isso requer o privilégio \"fly\" no servidor."
#: src/settings_translation_file.cpp
msgid "Player name"
-msgstr ""
+msgstr "Nome do Jogador"
#: src/settings_translation_file.cpp
msgid "Player transfer distance"
-msgstr ""
+msgstr "Distância de transferência do jogador"
#: src/settings_translation_file.cpp
msgid "Player versus Player"
-msgstr ""
+msgstr "Jogador contra Jogador"
#: src/settings_translation_file.cpp
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
msgstr ""
+"Porta para conectar (UDP).\n"
+"Note que o campo Porta no menu principal substitui essa configuração."
#: src/settings_translation_file.cpp
msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
+"Impede que mods façam coisas inseguras como executar comandos do shell."
#: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
msgstr ""
+"Intervalo de impressão de dados do analizador (em segundos). 0 = "
+"desabilitado. Útil para desenvolvedores."
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr ""
+msgid "Privileges that players with basic_privs can grant"
+msgstr "Privilégios que jogadores com basic_privs podem conceder"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr "Analizador"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
-msgstr ""
+msgstr "Tecla de alternância do Analizador"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr ""
+msgid "Profiling"
+msgstr "Analizando"
#: src/settings_translation_file.cpp
msgid ""
@@ -3752,14 +3938,17 @@ msgid ""
"Values larger than 26 will start to produce sharp cutoffs at cloud area "
"corners."
msgstr ""
+"Raio da área de nuvem afirmada em número de 64 nós de quadrados de nuvem.\n"
+"Valores maiores que 26 vão começar a produzir cortes afiados nos cantos de "
+"área de nuvem."
#: src/settings_translation_file.cpp
msgid "Raises terrain to make valleys around the rivers"
-msgstr ""
+msgstr "Eleva o terreno para fazer vales em torno dos rios"
#: src/settings_translation_file.cpp
msgid "Random input"
-msgstr ""
+msgstr "Entrada aleatória"
#: src/settings_translation_file.cpp
msgid "Range select key"
@@ -3767,15 +3956,19 @@ msgstr "Tecla para modo de visão ilimitado"
#: src/settings_translation_file.cpp
msgid "Remote media"
-msgstr ""
+msgstr "Mídia remota"
#: src/settings_translation_file.cpp
msgid "Remote port"
-msgstr ""
+msgstr "Porta remota"
#: src/settings_translation_file.cpp
msgid "Replaces the default main menu with a custom one."
-msgstr ""
+msgstr "Substitui o menu principal padrão por um personalizado."
+
+#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Diretorio de reporte"
#: src/settings_translation_file.cpp
msgid "Right key"
@@ -3783,41 +3976,42 @@ msgstr "Tecla direita"
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
-msgstr ""
+msgstr "Intervalo de repetição do clique direito"
#: src/settings_translation_file.cpp
msgid "River Depth"
-msgstr ""
+msgstr "Profundidade do Rio"
#: src/settings_translation_file.cpp
msgid "River Noise"
-msgstr ""
+msgstr "Ruido do Rio"
#: src/settings_translation_file.cpp
msgid "River Size"
-msgstr ""
+msgstr "Tamanho do Rio"
#: src/settings_translation_file.cpp
msgid "River noise -- rivers occur close to zero"
-msgstr ""
+msgstr "Ruido do rio -- rios ocorrem perto de zero"
#: src/settings_translation_file.cpp
msgid "Rollback recording"
-msgstr ""
+msgstr "Gravação de reversão"
#: src/settings_translation_file.cpp
msgid "Round minimap"
-msgstr ""
+msgstr "Minimapa redondo"
#: src/settings_translation_file.cpp
msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "Salvar o mapa recebido pelo cliente no disco."
#: src/settings_translation_file.cpp
msgid "Saving map received from server"
-msgstr ""
+msgstr "Salvado mapa recebido do servidor"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Scale gui by a user specified value.\n"
"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n"
@@ -3825,14 +4019,19 @@ msgid ""
"pixels when scaling down, at the cost of blurring some\n"
"edge pixels when images are scaled by non-integer sizes."
msgstr ""
+"Escala de GUI por um valor especificado pelo usuário.\n"
+"Use um filtro nearest-neighbor-anti-alias para escala do GUI.\n"
+"Isso irá suavizar algumas das arestas e misturar pixels \n"
+"quando a escalado baixo, ao custo de borrar alguns pixels de borda \n"
+"quando as imagens são dimensionadas em tamanhos não-inteiros."
#: src/settings_translation_file.cpp
msgid "Screen height"
-msgstr ""
+msgstr "Altura da tela"
#: src/settings_translation_file.cpp
msgid "Screen width"
-msgstr ""
+msgstr "Largura da tela"
#: src/settings_translation_file.cpp
msgid "Screenshot"
@@ -3840,17 +4039,15 @@ msgstr "Captura de tela"
#: src/settings_translation_file.cpp
msgid "Screenshot folder"
-msgstr ""
+msgstr "Pasta de screenshot"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "Captura de tela"
+msgstr "Formato da Captura de tela"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "Captura de tela"
+msgstr "Qualidade da Captura de tela;"
#: src/settings_translation_file.cpp
msgid ""
@@ -3858,26 +4055,29 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"Qualidade de imagem. Usado somente para o formato JPEG.\n"
+"1 significa pior qualidade; 100 significa melhor qualidade.\n"
+"Use 0 para qualidade padrão."
#: src/settings_translation_file.cpp
msgid "Security"
-msgstr ""
+msgstr "Segurança"
#: src/settings_translation_file.cpp
msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
-msgstr ""
+msgstr "Consulte http://www.sqlite.org/pragma.html#pragma_synchronous"
#: src/settings_translation_file.cpp
msgid "Selection box border color (R,G,B)."
-msgstr ""
+msgstr "Cor da borda da caixa de seleção (R, G, B)."
#: src/settings_translation_file.cpp
msgid "Selection box color"
-msgstr ""
+msgstr "Cor da caixa de seleção"
#: src/settings_translation_file.cpp
msgid "Selection box width"
-msgstr ""
+msgstr "Largura da caixa de seleção"
#: src/settings_translation_file.cpp
msgid "Server / Singleplayer"
@@ -3909,64 +4109,77 @@ msgstr "URL da lista de servidores"
#: src/settings_translation_file.cpp
msgid "Serverlist file"
-msgstr "arquivo da lista de servidores"
+msgstr "Arquivo da lista de servidores"
#: src/settings_translation_file.cpp
msgid ""
"Set the language. Leave empty to use the system language.\n"
"A restart is required after changing this."
msgstr ""
+"Defina o idioma. Deixe vazio para usar a linguagem do sistema.\n"
+"Apos mudar isso uma reinicialização é necessária."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving leaves.\n"
"Requires shaders to be enabled."
msgstr ""
+"Definido como true habilita balanço folhas.\n"
+"Requer sombreadores serem ativados."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving plants.\n"
"Requires shaders to be enabled."
msgstr ""
+"Definido como true permite balanço de plantas.\n"
+"Requer sombreadores serem ativados."
#: src/settings_translation_file.cpp
msgid ""
"Set to true enables waving water.\n"
"Requires shaders to be enabled."
msgstr ""
+"Definido como true permite ondulação da água.\n"
+"Requer sombreadores seres ativados."
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
+"Sombreadores permitem efeitos visuais avançados e podem aumentar a "
+"performance em algumas placas de vídeo.\n"
+"Só funcionam com o backend de vídeo OpenGL."
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Forma do minimapa. Ativado = redondo, Desativado = quadrado."
#: src/settings_translation_file.cpp
msgid "Show debug info"
-msgstr ""
+msgstr "Mostrar informações de depuração"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Mostrar as caixas de seleção entidades"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
-msgstr ""
+msgstr "Mensagem de desligamento"
#: src/settings_translation_file.cpp
msgid ""
"Size of chunks to be generated at once by mapgen, stated in mapblocks (16 "
"nodes)."
msgstr ""
+"Tamanho das parcelas a ser gerada de uma vez pelo mapgen, definido em "
+"mapblocks (16 nodes)."
#: src/settings_translation_file.cpp
msgid "Slope and fill work together to modify the heights"
-msgstr ""
+msgstr "Inclinação e preenchimento trabalham juntos para modificar as alturas"
#: src/settings_translation_file.cpp
msgid "Smooth lighting"
@@ -3974,17 +4187,20 @@ msgstr "Iluminação suave"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
+"Suaviza o movimento da câmera quando olhando ao redor. Também chamado de "
+"olhar ou suavização do mouse.\n"
+"Útil para gravar vídeos."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
-msgstr ""
+msgstr "Suaviza a rotação da câmera no modo cinemático. 0 para desativar."
#: src/settings_translation_file.cpp
msgid "Smooths rotation of camera. 0 to disable."
-msgstr ""
+msgstr "Suaviza a rotação da câmera. 0 para desativar."
#: src/settings_translation_file.cpp
msgid "Sneak key"
@@ -3992,7 +4208,7 @@ msgstr "Esgueirar"
#: src/settings_translation_file.cpp
msgid "Sound"
-msgstr ""
+msgstr "Som"
#: src/settings_translation_file.cpp
msgid ""
@@ -4001,34 +4217,39 @@ msgid ""
"(obviously, remote_media should end with a slash).\n"
"Files that are not present will be fetched the usual way."
msgstr ""
+"Especifica a URL no qual os clientes buscam a mídia ao em vez de usar o UDP."
+"\n"
+"$filename deve ser acessível a partir de $remote_media$filename via cURL \n"
+"(obviamente, remote_media deve terminar com uma barra \"/\").\n"
+"Arquivos que não estão presentes serão obtidos da maneira usual por UDP."
#: src/settings_translation_file.cpp
msgid "Static spawnpoint"
-msgstr ""
+msgstr "Ponto de spawn estático"
#: src/settings_translation_file.cpp
msgid "Strength of generated normalmaps."
-msgstr ""
+msgstr "Intensidade de normalmaps gerados."
#: src/settings_translation_file.cpp
msgid "Strength of parallax."
-msgstr ""
+msgstr "Intensidade de paralaxe."
#: src/settings_translation_file.cpp
msgid "Strict protocol checking"
-msgstr ""
+msgstr "Verificação rígida de protocolo"
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "Suporte a servidores mais antigos"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
-msgstr ""
+msgstr "SQLite síncrono"
#: src/settings_translation_file.cpp
msgid "Terrain Height"
-msgstr ""
+msgstr "Altura do terreno"
#: src/settings_translation_file.cpp
msgid ""
@@ -4036,6 +4257,9 @@ msgid ""
"Controls proportion of world area covered by hills.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Limite de ruido de terreno para colinas.\n"
+"Proporção de controles da área de mundo coberta pelas colinas.\n"
+"Ajuste no sentido 0,0 para uma proporção maior."
#: src/settings_translation_file.cpp
msgid ""
@@ -4043,32 +4267,63 @@ msgid ""
"Controls proportion of world area covered by lakes.\n"
"Adjust towards 0.0 for a larger proportion."
msgstr ""
+"Limite de ruido de terreno para Lagos.\n"
+"Proporção de controles da área de mundo coberta por lagos.\n"
+"Ajuste no sentido 0,0 para uma proporção maior."
#: src/settings_translation_file.cpp
msgid "Texture path"
-msgstr "Pacotes de texturas"
+msgstr "Diretorio da textura"
#: src/settings_translation_file.cpp
msgid "The altitude at which temperature drops by 20C"
+msgstr "A altitude na qual temperatura cai para 20C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
msgstr ""
+"O formato padrão no qual as analises estão sendo salvas,\n"
+"Quando chamado `/profiler save [formato]` sem formato."
#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
+msgstr "A profundidade de terra ou outro enchimento"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
msgstr ""
+"O caminho de arquivo relativo ao sua pasta do mundo no qual as analises "
+"serão salvas.\n"
#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
-msgstr ""
+msgstr "A interface de rede no qual o servidor escuta (aguarda conexão)."
#: src/settings_translation_file.cpp
msgid ""
"The privileges that new users automatically get.\n"
"See /privs in game for a full list on your server and mod configuration."
msgstr ""
+"Os privilégios que novos usuários obtém automaticamente.\n"
+"Consulte /privs no jogo para obter uma lista completa na configuração do seu "
+"servidor e dos modificadores."
#: src/settings_translation_file.cpp
msgid "The rendering back-end for Irrlicht."
+msgstr "A rederização back-end para Irrlicht."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
msgstr ""
+"A sensibilidade dos eixos do joystick para movimentar o \n"
+"frustum de exibição no jogo."
#: src/settings_translation_file.cpp
msgid ""
@@ -4077,6 +4332,11 @@ msgid ""
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
"set to the nearest valid value."
msgstr ""
+"A intensidade (escuridão) de sombreamento da oclusão de ambiente no bloco.\n"
+"Inferior é mais escura, superior é mais clara. O intervalo válido de valores "
+"para esta\n"
+"configuração é 0.25 a 4.0. Se o valor está fora do intervalo ele será \n"
+"definido o valor válido mais próximo."
#: src/settings_translation_file.cpp
msgid ""
@@ -4084,38 +4344,57 @@ msgid ""
"capacity until an attempt is made to decrease its size by dumping old queue\n"
"items. A value of 0 disables the functionality."
msgstr ""
+"O tempo (em segundos) que a fila de líquidos pode crescer além da capacidade "
+"\n"
+"de processamento até que é feita uma tentativa para diminuir o seu tamanho "
+"pelo despejo \n"
+"de antigas filas de itens. Um valor 0 desativa a funcionalidade."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"O tempo em segundos que leva entre eventos repetidos \n"
+"quando pressionando uma combinação de botão no joystick."
#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
+"O tempo em segundos entre repetidos cliques direitos ao segurar o botão "
+"direito do mouse."
#: src/settings_translation_file.cpp
msgid "This font will be used for certain languages."
-msgstr ""
+msgstr "Esta fonte será usada para determinados idiomas."
#: src/settings_translation_file.cpp
msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "Tempo entre ciclos de gestão do bloco ativo"
#: src/settings_translation_file.cpp
msgid ""
"Time in seconds for item entity (dropped items) to live.\n"
"Setting it to -1 disables the feature."
msgstr ""
+"Tempo em segundos para manter entidade de item (itens caídos/dropados).\n"
+"Definindo-o como -1 desabilita o recurso."
#: src/settings_translation_file.cpp
msgid "Time send interval"
-msgstr ""
+msgstr "Intervalo de tempo de envio"
#: src/settings_translation_file.cpp
msgid "Time speed"
-msgstr ""
+msgstr "Velocidade de tempo"
#: src/settings_translation_file.cpp
msgid "Timeout for client to remove unused map data from memory."
msgstr ""
+"Tempo de espera para o cliente remover dados de mapa não utilizados da "
+"memória."
#: src/settings_translation_file.cpp
msgid ""
@@ -4124,14 +4403,18 @@ msgid ""
"This determines how long they are slowed down after placing or removing a "
"node."
msgstr ""
+"Para reduzir o lag, transferências de blocos são desaceleradas quando um "
+"jogador está construindo algo.\n"
+"Isto determina por quanto tempo eles são desacelerados após a colocação ou "
+"remoção de um node."
#: src/settings_translation_file.cpp
msgid "Toggle camera mode key"
-msgstr ""
+msgstr "Tecla de alternância do modo de câmera"
#: src/settings_translation_file.cpp
msgid "Tooltip delay"
-msgstr ""
+msgstr "Atraso de dica de ferramenta"
#: src/settings_translation_file.cpp
msgid "Trilinear filtering"
@@ -4143,38 +4426,41 @@ msgid ""
"False = 128\n"
"Useable to make minimap smoother on slower machines."
msgstr ""
+"True = 256\n"
+"False = 128\n"
+"Útil para suavizar o minimapa em máquinas mais lentas."
#: src/settings_translation_file.cpp
msgid "Trusted mods"
-msgstr ""
+msgstr "Modulos confiáveis"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "URL para a lista de servidores exibida na guia Multiplayer."
#: src/settings_translation_file.cpp
msgid "Unlimited player transfer distance"
-msgstr ""
+msgstr "Distância de transferência do jogador ilimitada"
#: src/settings_translation_file.cpp
msgid "Unload unused server data"
-msgstr ""
+msgstr "Descarregar os dados do servidor não utilizados"
#: src/settings_translation_file.cpp
msgid "Use 3D cloud look instead of flat."
-msgstr ""
+msgstr "Usar nuvens 3D em vez de planas."
#: src/settings_translation_file.cpp
msgid "Use a cloud animation for the main menu background."
-msgstr ""
+msgstr "Usar uma animação de nuvem para o fundo do menu principal."
#: src/settings_translation_file.cpp
msgid "Use anisotropic filtering when viewing at textures from an angle."
-msgstr ""
+msgstr "Usar filtragem anisotrópica quando visualizar texturas de um ângulo."
#: src/settings_translation_file.cpp
msgid "Use bilinear filtering when scaling textures."
-msgstr ""
+msgstr "Usar filtragem bilinear ao dimensionamento de texturas."
#: src/settings_translation_file.cpp
msgid "Use key"
@@ -4183,72 +4469,72 @@ msgstr "press. uma tecla"
#: src/settings_translation_file.cpp
msgid "Use mip mapping to scale textures. May slightly increase performance."
msgstr ""
+"Use mapeamento MIP para texturas de escala. Pode aumentar ligeiramente o "
+"desempenho."
#: src/settings_translation_file.cpp
msgid "Use trilinear filtering when scaling textures."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "Útil para desenvolvedores de mods."
+msgstr "Use a filtragem trilinear ao dimensionamento de texturas."
#: src/settings_translation_file.cpp
msgid "V-Sync"
-msgstr ""
+msgstr "Sincronização Vertical"
#: src/settings_translation_file.cpp
msgid "VBO"
-msgstr ""
+msgstr "VBO"
#: src/settings_translation_file.cpp
msgid "Valley Depth"
-msgstr ""
+msgstr "Profundidade do vale"
#: src/settings_translation_file.cpp
msgid "Valley Fill"
-msgstr ""
+msgstr "Preenchimento do vale"
#: src/settings_translation_file.cpp
msgid "Valley Profile"
-msgstr ""
+msgstr "Perfil do vale"
#: src/settings_translation_file.cpp
msgid "Valley Slope"
-msgstr ""
+msgstr "Encosta do vale"
#: src/settings_translation_file.cpp
msgid "Valleys C Flags"
-msgstr ""
+msgstr "Flags C de vales"
#: src/settings_translation_file.cpp
msgid "Vertical screen synchronization."
-msgstr ""
+msgstr "Sincronização vertical da tela."
#: src/settings_translation_file.cpp
msgid "Video driver"
-msgstr ""
+msgstr "Driver de vídeo"
#: src/settings_translation_file.cpp
msgid "View bobbing"
-msgstr ""
+msgstr "Visualização de balanço"
#: src/settings_translation_file.cpp
msgid ""
"View distance in nodes.\n"
"Min = 20"
msgstr ""
+"Distância de visão (em nós).\n"
+"Minimo = 20"
#: src/settings_translation_file.cpp
msgid "View range decrease key"
-msgstr ""
+msgstr "Tecla de diminuição do raio de exibição"
#: src/settings_translation_file.cpp
msgid "View range increase key"
-msgstr ""
+msgstr "Tecla de aumento do intervalo de exibição"
#: src/settings_translation_file.cpp
msgid "Viewing range"
-msgstr ""
+msgstr "Intervalo de visualização"
#: src/settings_translation_file.cpp
msgid "Volume"
@@ -4261,10 +4547,14 @@ msgid ""
"Has no effect on 3D fractals.\n"
"Range roughly -2 to 2."
msgstr ""
+"Coordenada W da fatia 3D gerada de um fractal 4D.\n"
+"Determina qual fatia 3D da forma 4D é gerada.\n"
+"Não tem efeito sobre fractais 3D.\n"
+"Intervalo de aproximadamente -2 a 2."
#: src/settings_translation_file.cpp
msgid "Walking speed"
-msgstr ""
+msgstr "Velocidade de caminhada"
#: src/settings_translation_file.cpp
msgid "Water Features"
@@ -4272,15 +4562,15 @@ msgstr "Coisas relacionadas a Ãgua"
#: src/settings_translation_file.cpp
msgid "Water level"
-msgstr ""
+msgstr "Nível de água"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
-msgstr ""
+msgstr "Nível de superfície de água do mundo."
#: src/settings_translation_file.cpp
msgid "Waving Nodes"
-msgstr ""
+msgstr "Nós que balancam"
#: src/settings_translation_file.cpp
msgid "Waving leaves"
@@ -4288,23 +4578,23 @@ msgstr "Balanço das árvores"
#: src/settings_translation_file.cpp
msgid "Waving plants"
-msgstr ""
+msgstr "Balanço das plantas"
#: src/settings_translation_file.cpp
msgid "Waving water"
-msgstr ""
+msgstr "Balanço da água"
#: src/settings_translation_file.cpp
msgid "Waving water height"
-msgstr ""
+msgstr "Altura de balanço da água"
#: src/settings_translation_file.cpp
msgid "Waving water length"
-msgstr ""
+msgstr "Comprimento de balanço da água"
#: src/settings_translation_file.cpp
msgid "Waving water speed"
-msgstr ""
+msgstr "Velocidade de balanço da água"
#: src/settings_translation_file.cpp
msgid ""
@@ -4312,14 +4602,21 @@ msgid ""
"filtered in software, but some images are generated directly\n"
"to hardware (e.g. render-to-texture for nodes in inventory)."
msgstr ""
+"Quando gui_scaling_filter é true, todas as imagens de GUI precisam ser\n"
+"filtrado no software, porém algumas imagens são geradas diretamente ao\n"
+"hardware (por exemplo render-to-texture para nodes no inventário)."
#: src/settings_translation_file.cpp
msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
+"Quando gui_scaling_filter_txr2img é true, copie essas imagens\n"
+"de hardware para software para dimensionamento. Quando false,\n"
+"voltará para o velho método de dimensionamento, para drivers de\n"
+"vídeo que não suportem propriedades baixas de texturas voltam do hardware."
#: src/settings_translation_file.cpp
msgid ""
@@ -4331,6 +4628,16 @@ msgid ""
"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n"
"enabled."
msgstr ""
+"Ao usar filtros bilineares/trilinear/anisotrópica, texturas de baixa "
+"resolução\n"
+"podem ficar borradas, então automaticamente aumenta a escala deles com a "
+"interpolação\n"
+"de nearest-neighbor para preservar os pixels nítidos. Isto define o tamanho\n"
+"mínimo da textura para as texturas melhoradas; valores mais altos parecem\n"
+"mais nítidas, mas requerem mais memória. Poências de 2 são recomendadas.\n"
+"Essa configuração superior a 1 não pode ter um efeito visível, a menos que a "
+"\n"
+"filtragem bilineares/trilinear/anisotrópica estejam habilitadas."
#: src/settings_translation_file.cpp
msgid ""
@@ -4341,40 +4648,59 @@ msgid ""
"- Those groups have an offset of -32, -32 nodes from the origin.\n"
"- Only groups which are within the map_generation_limit are generated"
msgstr ""
+"Limite de geração de mapa.\n"
+"Note:\n"
+"- Limitado a 31000 (valores superiores não têm efeito)\n"
+"- O gerador funciona em grupos de 80x80x80 cubos (5x5x5 MapBlocks)\n"
+"- Esses grupos têm um deslocamento de -32, -32 nodes em relação à "
+"origem.\n"
+"- Apenas grupos dentro do limite definido map_gerenation_limit são gerados"
#: src/settings_translation_file.cpp
msgid ""
"Whether freetype fonts are used, requires freetype support to be compiled in."
msgstr ""
+"Se forem utilizadas fontes freetype, requer suporte a freetype para ser "
+"compilado."
#: src/settings_translation_file.cpp
msgid "Whether node texture animations should be desynchronized per mapblock."
msgstr ""
+"Se as animações de textura do nodes devem ser dessincronizadas por mapblock."
#: src/settings_translation_file.cpp
msgid ""
"Whether players are shown to clients without any range limit.\n"
"Deprecated, use the setting player_transfer_distance instead."
msgstr ""
+"Se os jogadores são mostrados para os clientes sem qualquer limite de "
+"distância.\n"
+"Caso não desejar, use a configuração player_transfer_distance."
#: src/settings_translation_file.cpp
msgid "Whether to allow players to damage and kill each other."
-msgstr ""
+msgstr "Se deseja permitir aos jogadores causar dano e matar uns aos outros."
#: src/settings_translation_file.cpp
msgid ""
"Whether to ask clients to reconnect after a (Lua) crash.\n"
"Set this to true if your server is set up to restart automatically."
msgstr ""
+"Se deseja perguntar aos clientes para reconectarem depois de uma queda "
+"(Lua).\n"
+"Defina como true se o servidor está configurado para reiniciar "
+"automaticamente."
#: src/settings_translation_file.cpp
msgid "Whether to fog out the end of the visible area."
-msgstr ""
+msgstr "Se for usar névoa no fim da área visível."
#: src/settings_translation_file.cpp
msgid ""
"Whether to show the client debug info (has the same effect as hitting F5)."
msgstr ""
+"Se deseja mostrar informação de depuração ao cliente (tem o mesmo efeito "
+"como teclar F5)."
#: src/settings_translation_file.cpp
msgid ""
@@ -4383,6 +4709,11 @@ msgid ""
"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
"Disabling this option will protect your password better."
msgstr ""
+"Se vai suportar os servidores mais antigos antes da versão de protocolo 25.\n"
+"Habilite se você deseja se conectar a servidores anteriores a 0.4.12.\n"
+"Servidores começando com 0.4.13 vão funcionar, servidores 0.4.12-dev podem "
+"ou não funcionar.\n"
+"Desabilitar esta opção irá proteger sua senha melhor."
#: src/settings_translation_file.cpp
msgid "Width component of the initial window size."
@@ -4390,131 +4721,170 @@ msgstr "Largura da janela inicial."
#: src/settings_translation_file.cpp
msgid "Width of the selectionbox's lines around nodes."
-msgstr ""
+msgstr "Largura das linhas do bloco de seleção em torno de nodes."
#: src/settings_translation_file.cpp
msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
+"Diretório de mundo (tudo no mundo está armazenado aqui).\n"
+"Não é necessário se for iniciado a partir do menu principal."
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
-msgstr ""
+msgstr "Componente Y de terreno plano."
#: src/settings_translation_file.cpp
msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "Y de limite superior de grandes números pseudoaleatórios de cavernas."
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
-msgstr ""
+msgstr "Tempo limite de download de arquivo via cURL"
#: src/settings_translation_file.cpp
msgid "cURL parallel limit"
-msgstr ""
+msgstr "limite paralelo de cURL"
#: src/settings_translation_file.cpp
msgid "cURL timeout"
-msgstr ""
+msgstr "Tempo limite de cURL"
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
+#~ msgid "Detailed mod profile data. Useful for mod developers."
#~ msgstr ""
-#~ "Habilita recurso permitindo que o nível da água seja um pouco menor, "
-#~ "portando não preenche todo o espaço disponível para bloco.\n"
-#~ "Note que isso não está bem otimizado e que suavização da iluminação na "
-#~ "superfície da água não funciona bem com esse recurso."
+#~ "Dados detalhados do perfil do mod . Útil para desenvolvedores de mods."
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr ""
-#~ "Habilitar destaque de bloco selecionado (desabilita o modo de destaque "
-#~ "selectionbox [Padrão])."
+#~ msgid "Detailed mod profiling"
+#~ msgstr "Perfilamento detalhado do mod"
#~ msgid ""
-#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
-#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
#~ msgstr ""
-#~ "Julia definido: (X, Y, Z) deslocamentos do centro mundo.\n"
-#~ "Variam aproximadamente -2 a 2, multiplique por j_scale para deslocamentos "
-#~ "em nós."
+#~ "Quantos blocos podem ser enviados simultaneamente para todo o servidor."
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Tecla para diminuir o intervalo de visualização. Modifica o intervalo "
-#~ "mínimo de visualização.\n"
-#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "Quantos blocos podem ser enviados simultaneamente por cliente."
+
+#~ msgid "Useful for mod developers."
+#~ msgstr "Útil para desenvolvedores de mods."
+
+#~ msgid "No of course not!"
+#~ msgstr "Claro que não!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "Lista de servidores públicos"
+
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Gerar Normalmaps"
+
+#~ msgid "No!!!"
+#~ msgstr "Não!!!"
#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
+#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
+#~ "issues.\n"
+#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
+#~ "water would tend to pool. It may interfere with delicately adjusted "
+#~ "biomes."
#~ msgstr ""
-#~ "Tecla para aumentar o intervalo de visualização. Modifica o mínimo "
-#~ "intervalo de visualização.\n"
-#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ "Atributos de mapgen específicos para vales (Mapgen Valleys).\n"
+#~ "Flags que não estão especificadas na string de flags não são modificados "
+#~ "a partir do padrão.\n"
+#~ "Flags começando com \"no\" (não) são usadas para desativá-los "
+#~ "explicitamente.\n"
+#~ "\"altitude_chill\" torna terrenos de elevada altitude mais frios, o que "
+#~ "pode causar algumas falhas nos biomas.\n"
+#~ "\"humid_rivers\" modifica a umidade ao redor dos rios e em áreas onde a "
+#~ "água tende a ser represada em poças. Pode interferir em biomas que são "
+#~ "sensíveis a mudanças."
-#~ msgid "Preload inventory textures"
-#~ msgstr "pré-carregando texturas de inventário"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Desabilitar PMs"
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Baixar"
+#~ msgid "If enabled, "
+#~ msgstr "habilitado"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "Botão esquerdo: Move todos os itens. Botão direito: Move um item"
+#~ msgid "Game Name"
+#~ msgstr "Nome do jogo"
-#~ msgid "is required by:"
-#~ msgstr "é necessário para:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Não foi possível copiar o mod \"$1\" para o jogo \"$2\""
-#~ msgid "Configuration saved. "
-#~ msgstr "A configuração foi salva. "
+#~ msgid "GAMES"
+#~ msgstr "JOGOS"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Atenção: A configuração não está consistente."
+#~ msgid "Mods:"
+#~ msgstr "Módulos:"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Não foi possível criar o mundo: O nome contém caracteres inválidos"
+#~ msgid "new game"
+#~ msgstr "novo jogo"
-#~ msgid "Show Public"
-#~ msgstr "Exibir públicos"
+#~ msgid "EDIT GAME"
+#~ msgstr "EDITAR JOGO"
-#~ msgid "Show Favorites"
-#~ msgstr "Exibir favoritos"
+#~ msgid "Remove selected mod"
+#~ msgstr "Remover o módulo selecionado"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Deixe o endereço em branco para iniciar um servidor local."
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Adicionar módulo"
-#~ msgid "Create world"
-#~ msgstr "Criar o mundo"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENTE"
-#~ msgid "Address required."
-#~ msgstr "É necessário um endereço."
+#~ msgid "START SERVER"
+#~ msgstr "SERVIDOR"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Não foi possível excluir o mundo: Nenhum foi selecionado"
+#~ msgid "Name"
+#~ msgstr "Nome"
-#~ msgid "Files to be deleted"
-#~ msgstr "Arquivos a serem excluídos"
+#~ msgid "Password"
+#~ msgstr "Senha"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Não foi possivel criar o mundo: Não foi encontrado nenhum jogo"
+#~ msgid "SETTINGS"
+#~ msgstr "CONFIGURAÇÕES"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Não foi possível configurar o mundo: Nada foi selecionado"
+#~ msgid "Preload item visuals"
+#~ msgstr "Precarga de elementos visuais"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Não foi possível excluir todos os arquivos do mundo"
+#~ msgid "Finite Liquid"
+#~ msgstr "Líquido finito"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "UM JOGADOR"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "TEXTURAS"
+
+#~ msgid "MODS"
+#~ msgstr "MÓDULOS"
+
+#~ msgid "Add mod:"
+#~ msgstr "Adicionar módulo:"
+
+#~ msgid "Local install"
+#~ msgstr "Instalação local"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Atenção: Alguns mods ainda não foram configurados.\n"
+#~ "E eles serão ativados por padrão, quando você salvar a configuração."
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Atenção: Alguns mods configurados não foram encontrados.\n"
+#~ "Suas definições serão removidas quando você salvar a configuração."
#~ msgid ""
#~ "Default Controls:\n"
@@ -4541,131 +4911,135 @@ msgstr ""
#~ "- ESC: este menu\n"
#~ "- T: bate-papo\n"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Atenção: Alguns mods configurados não foram encontrados.\n"
-#~ "Suas definições serão removidas quando você salvar a configuração."
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Atenção: Alguns mods ainda não foram configurados.\n"
-#~ "E eles serão ativados por padrão, quando você salvar a configuração."
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Não foi possível excluir todos os arquivos do mundo"
-#~ msgid "Local install"
-#~ msgstr "Instalação local"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Não foi possível configurar o mundo: Nada foi selecionado"
-#~ msgid "Add mod:"
-#~ msgstr "Adicionar módulo:"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Não foi possivel criar o mundo: Não foi encontrado nenhum jogo"
-#~ msgid "MODS"
-#~ msgstr "MÓDULOS"
+#~ msgid "Files to be deleted"
+#~ msgstr "Arquivos a serem excluídos"
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "TEXTURAS"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Não foi possível excluir o mundo: Nenhum foi selecionado"
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "UM JOGADOR"
+#~ msgid "Address required."
+#~ msgstr "É necessário um endereço."
-#~ msgid "Finite Liquid"
-#~ msgstr "Líquido finito"
+#~ msgid "Create world"
+#~ msgstr "Criar o mundo"
-#~ msgid "Preload item visuals"
-#~ msgstr "Precarga de elementos visuais"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Deixe o endereço em branco para iniciar um servidor local."
-#~ msgid "SETTINGS"
-#~ msgstr "CONFIGURAÇÕES"
+#~ msgid "Show Favorites"
+#~ msgstr "Exibir favoritos"
-#~ msgid "Password"
-#~ msgstr "Senha"
+#~ msgid "Show Public"
+#~ msgstr "Exibir públicos"
-#~ msgid "Name"
-#~ msgstr "Nome"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Não foi possível criar o mundo: O nome contém caracteres inválidos"
-#~ msgid "START SERVER"
-#~ msgstr "SERVIDOR"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Atenção: A configuração não está consistente."
-#~ msgid "CLIENT"
-#~ msgstr "CLIENTE"
+#~ msgid "Configuration saved. "
+#~ msgstr "A configuração foi salva. "
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Adicionar módulo"
+#~ msgid "is required by:"
+#~ msgstr "é necessário para:"
-#~ msgid "Remove selected mod"
-#~ msgstr "Remover o módulo selecionado"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "Botão esquerdo: Move todos os itens. Botão direito: Move um item"
-#~ msgid "EDIT GAME"
-#~ msgstr "EDITAR JOGO"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Baixar"
-#~ msgid "new game"
-#~ msgstr "novo jogo"
+#~ msgid "Preload inventory textures"
+#~ msgstr "pré-carregando texturas de inventário"
-#~ msgid "Mods:"
-#~ msgstr "Módulos:"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Tecla para aumentar o intervalo de visualização. Modifica o mínimo "
+#~ "intervalo de visualização.\n"
+#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "GAMES"
-#~ msgstr "JOGOS"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Tecla para diminuir o intervalo de visualização. Modifica o intervalo "
+#~ "mínimo de visualização.\n"
+#~ "Consulte http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Não foi possível copiar o mod \"$1\" para o jogo \"$2\""
+#~ msgid ""
+#~ "Julia set: (X,Y,Z) offsets from world centre.\n"
+#~ "Range roughly -2 to 2, multiply by j_scale for offsets in nodes."
+#~ msgstr ""
+#~ "Julia definido: (X, Y, Z) deslocamentos do centro mundo.\n"
+#~ "Variam aproximadamente -2 a 2, multiplique por j_scale para deslocamentos "
+#~ "em nós."
-#~ msgid "Game Name"
-#~ msgstr "Nome do jogo"
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr ""
+#~ "Habilitar destaque de bloco selecionado (desabilita o modo de destaque "
+#~ "selectionbox [Padrão])."
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "habilitado"
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Habilita recurso permitindo que o nível da água seja um pouco menor, "
+#~ "portando não preenche todo o espaço disponível para bloco.\n"
+#~ "Note que isso não está bem otimizado e que suavização da iluminação na "
+#~ "superfície da água não funciona bem com esse recurso."
#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Desabilitar PMs"
-
#~ msgid ""
#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
+#~ "Flags starting with 'no' are used to explicitly disable them."
#~ msgstr ""
-#~ "Atributos de geração de mapas específicos para o Mapgen v7.\n"
-#~ "'ridges' são os rios.\n"
-#~ "Flags que não estão especificadas na string da flag não são modificadas "
-#~ "por padrão.\n"
-#~ "Flags começando com \"no\" são usadas para explicitamente desabilitá-las."
+#~ "Atributos para o gerador de mapas específico para o Mapgen v6.\n"
+#~ "Quando biomas de neve estão habilitados, pântanos ficam habilitados e a "
+#~ "flag de pântanos é ignorada.\n"
+#~ "Flags que não são especificadas na string da flag não são modificadas por "
+#~ "padrão.\n"
+#~ "Flags começando com \"no\" (não) são usadas para explicitamente "
+#~ "desabilitá-las."
+#, fuzzy
#~ msgid ""
-#~ "Map generation attributes specific to Mapgen Valleys.\n"
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
#~ "Flags that are not specified in the flag string are not modified from the "
#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them.\n"
-#~ "\"altitude_chill\" makes higher elevations colder, which may cause biome "
-#~ "issues.\n"
-#~ "\"humid_rivers\" modifies the humidity around rivers and in areas where "
-#~ "water would tend to pool. It may interfere with delicately adjusted "
-#~ "biomes."
+#~ "Flags starting with 'no' are used to explicitly disable them."
#~ msgstr ""
-#~ "Atributos de mapgen específicos para vales (Mapgen Valleys).\n"
+#~ "Atributos de mapgen específicos para Mapgen plano.\n"
+#~ "Alguns lagos e colinas são ocasionalmente adicionados num mundo plano.\n"
#~ "Flags que não estão especificadas na string de flags não são modificados "
#~ "a partir do padrão.\n"
#~ "Flags começando com \"no\" (não) são usadas para desativá-los "
-#~ "explicitamente.\n"
-#~ "\"altitude_chill\" torna terrenos de elevada altitude mais frios, o que "
-#~ "pode causar algumas falhas nos biomas.\n"
-#~ "\"humid_rivers\" modifica a umidade ao redor dos rios e em áreas onde a "
-#~ "água tende a ser represada em poças. Pode interferir em biomas que são "
-#~ "sensíveis a mudanças."
-
-#~ msgid "No!!!"
-#~ msgstr "Não!!!"
-
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Gerar Normalmaps"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Lista de servidores públicos"
-
-#~ msgid "No of course not!"
-#~ msgstr "Claro que não!"
+#~ "explicitamente."
diff --git a/po/ro/minetest.po b/po/ro/minetest.po
index ac4bf7937..a9efb035f 100644
--- a/po/ro/minetest.po
+++ b/po/ro/minetest.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: 2016-03-17 15:28+0000\n"
"Last-Translator: Lordmusic Player <lordmusicplro1@gmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/minetest/"
@@ -624,6 +624,11 @@ msgid "Particles"
msgstr "Activează tot"
#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "Singleplayer"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Setări"
@@ -1004,6 +1009,10 @@ msgstr "Intră pe noclip"
msgid "Use"
msgstr "Aleargă"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Mărire"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "apasă o tastă"
@@ -1320,10 +1329,6 @@ msgstr "X Butonul 1"
msgid "X Button 2"
msgstr "X Butonul 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Mărire"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1391,6 +1396,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1466,6 +1475,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "ÃŽnapoi"
@@ -1501,6 +1514,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Bumpmapping"
msgstr "Mip Mapping"
@@ -1544,6 +1561,11 @@ msgid "Chat toggle key"
msgstr "Modifică tastele"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Comandă"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1620,14 +1642,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1784,6 +1806,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1800,6 +1826,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1830,14 +1860,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1850,6 +1872,18 @@ msgid "Disable anticheat"
msgstr "Activează particulele"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
@@ -1876,6 +1910,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Activează MP"
@@ -1962,6 +2000,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2023,11 +2069,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2163,12 +2219,14 @@ msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2200,6 +2258,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2228,15 +2295,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2331,6 +2389,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2366,6 +2458,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2526,6 +2626,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2561,7 +2668,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2713,6 +2820,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2747,8 +2869,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2758,8 +2878,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2770,8 +2888,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2781,8 +2897,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3163,6 +3277,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3204,17 +3326,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3226,10 +3352,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Meniu"
@@ -3272,10 +3394,6 @@ msgid "Mipmapping"
msgstr "Mip Mapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3480,11 +3598,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3492,7 +3616,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3529,6 +3653,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Report path"
+msgstr "Selectează"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Right key"
msgstr "Meniu Drepata"
@@ -3697,7 +3826,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3735,7 +3864,7 @@ msgstr "Lumină mai bună"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3816,10 +3945,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3835,6 +3976,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3850,6 +3997,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3954,11 +4107,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Dezvoltatori de bază"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4087,7 +4235,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4188,87 +4336,91 @@ msgid "cURL timeout"
msgstr ""
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Se încarcă..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Dezvoltatori de bază"
+
+#~ msgid "No of course not!"
+#~ msgstr "Nu, sigur că nu!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "Listă de servere publică"
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Descarcă"
+#~ msgid "If disabled "
+#~ msgstr "Dezactivează MP"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Click stânga: Mută toate obiectele, Click dreapta: Mută un singur obiect"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "activat"
-#~ msgid "Local install"
-#~ msgstr "Instalare locală"
+#~ msgid "Game Name"
+#~ msgstr "Numele jocului"
-#~ msgid "Add mod:"
-#~ msgstr "Adăugaţi mod:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Nu se poate copia modul \"$1\" în jocul \"$2\""
-#~ msgid "MODS"
-#~ msgstr "MODURI"
+#~ msgid "GAMES"
+#~ msgstr "JOCURI"
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "PACHETE DE TEXTURÄ‚"
+#~ msgid "Mods:"
+#~ msgstr "Moduri:"
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "SINGLE PLAYER"
+#~ msgid "new game"
+#~ msgstr "joc nou"
-#~ msgid "Finite Liquid"
-#~ msgstr "Lichid finit"
+#~ msgid "EDIT GAME"
+#~ msgstr "MODIFICÄ‚ JOCUL"
-#~ msgid "Preload item visuals"
-#~ msgstr "Pre-încarcă imaginile obiectelor"
+#~ msgid "Remove selected mod"
+#~ msgstr "Șterge modul selectat"
-#~ msgid "SETTINGS"
-#~ msgstr "SETÄ‚RI"
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Adaugă modul"
-#~ msgid "Password"
-#~ msgstr "Parolă"
+#~ msgid "CLIENT"
+#~ msgstr "CLIENT"
+
+#~ msgid "START SERVER"
+#~ msgstr "DESCHIDE SERVERUL"
#~ msgid "Name"
#~ msgstr "Nume"
-#~ msgid "START SERVER"
-#~ msgstr "DESCHIDE SERVERUL"
+#~ msgid "Password"
+#~ msgstr "Parolă"
-#~ msgid "CLIENT"
-#~ msgstr "CLIENT"
+#~ msgid "SETTINGS"
+#~ msgstr "SETÄ‚RI"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Adaugă modul"
+#~ msgid "Preload item visuals"
+#~ msgstr "Pre-încarcă imaginile obiectelor"
-#~ msgid "Remove selected mod"
-#~ msgstr "Șterge modul selectat"
+#~ msgid "Finite Liquid"
+#~ msgstr "Lichid finit"
-#~ msgid "EDIT GAME"
-#~ msgstr "MODIFICÄ‚ JOCUL"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "SINGLE PLAYER"
-#~ msgid "new game"
-#~ msgstr "joc nou"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "PACHETE DE TEXTURÄ‚"
-#~ msgid "Mods:"
-#~ msgstr "Moduri:"
+#~ msgid "MODS"
+#~ msgstr "MODURI"
-#~ msgid "GAMES"
-#~ msgstr "JOCURI"
+#~ msgid "Add mod:"
+#~ msgstr "Adăugaţi mod:"
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Nu se poate copia modul \"$1\" în jocul \"$2\""
+#~ msgid "Local install"
+#~ msgstr "Instalare locală"
-#~ msgid "Game Name"
-#~ msgstr "Numele jocului"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Click stânga: Mută toate obiectele, Click dreapta: Mută un singur obiect"
#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "activat"
+#~ msgid "Downloading"
+#~ msgstr "Descarcă"
#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Dezactivează MP"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "Listă de servere publică"
-
-#~ msgid "No of course not!"
-#~ msgstr "Nu, sigur că nu!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Se încarcă..."
diff --git a/po/ru/minetest.po b/po/ru/minetest.po
index d28193911..e5b806432 100644
--- a/po/ru/minetest.po
+++ b/po/ru/minetest.po
@@ -7,18 +7,18 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-04-18 23:08+0000\n"
-"Last-Translator: Stas Kies <stask85@gmail.com>\n"
-"Language-Team: Russian <https://hosted.weblate.org/projects/minetest/"
-"minetest/ru/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-19 10:06+0000\n"
+"Last-Translator: Nikolay <nikolay0054@factmodule.ru>\n"
+"Language-Team: Russian "
+"<https://hosted.weblate.org/projects/minetest/minetest/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
-"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.6-dev\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
+"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.10\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -54,7 +54,7 @@ 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. "
@@ -102,8 +102,9 @@ msgid ""
"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
"chararacters [a-z0-9_] are allowed."
msgstr ""
-"Ошибка при попытке Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð° \"$1\" поÑкольку он Ñодержит недопуÑтимые "
-"Ñимволы. ДопуÑкаетÑÑ Ð¸Ñпользование Ñимволов от Aa-Zz и от 0-9."
+"Ошибка при включении мода \"$1\", поÑкольку он Ñодержит недопуÑтимые "
+"Ñимволы. ДопуÑкаетÑÑ Ð¸Ñпользование Ñтрочных букв латинÑкого алфавита, цифр, "
+"и знака подчёркиваниÑ."
#: builtin/mainmenu/dlg_config_world.lua
msgid "Hide Game"
@@ -140,7 +141,7 @@ msgstr "Создать"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download a subgame, such as minetest_game, from minetest.net"
-msgstr "Скачайте мини-игры, такие как minetest_game, на minetest.net"
+msgstr "Скачивайте мини-игры, такие как minetest_game, на minetest.net"
#: builtin/mainmenu/dlg_create_world.lua
msgid "Download one from minetest.net"
@@ -192,7 +193,7 @@ msgstr "Modmgr: невозможно удалить \"$1\""
#: builtin/mainmenu/dlg_delete_mod.lua
msgid "Modmgr: invalid modpath \"$1\""
-msgstr "Modmgr: неправильный путь \"$1\""
+msgstr "Modmgr: неправильный путь к \"$1\""
#: builtin/mainmenu/dlg_delete_world.lua
msgid "Delete World \"$1\"?"
@@ -216,7 +217,7 @@ msgstr "(ОтÑутÑтвует опиÑание наÑтройки)"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
-msgstr "< Ðазад к Ñтранице ÐаÑтройки"
+msgstr "< Ðазад к Ñтранице ÐаÑтроек"
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Browse"
@@ -408,9 +409,8 @@ msgid "Uninstall selected modpack"
msgstr "Удалить выбранный мод-пак"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "ÐÐ´Ñ€ÐµÑ / Порт:"
+msgstr "ÐÐ´Ñ€ÐµÑ / Порт"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -426,22 +426,19 @@ msgstr "Режим творчеÑтва"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Damage enabled"
-msgstr "Разрешить увечьÑ"
+msgstr "Ущерб включен"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Del. Favorite"
-msgstr "Избранное:"
+msgstr "Удалить фаворит"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Favorite"
-msgstr "Избранное:"
+msgstr "фаворит"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "Ð˜Ð¼Ñ / Пароль:"
+msgstr "Ð˜Ð¼Ñ / Пароль"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -463,7 +460,7 @@ msgstr "Режим творчеÑтва"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_singleplayer.lua
msgid "Enable Damage"
-msgstr "Разрешить увечьÑ"
+msgstr "Включить Урон"
#: builtin/mainmenu/tab_server.lua
msgid "Name/Password"
@@ -483,7 +480,7 @@ msgstr "Порт"
#: builtin/mainmenu/tab_server.lua
msgid "Public"
-msgstr "Публичные"
+msgstr "Публичный"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
msgid "Select World:"
@@ -534,7 +531,6 @@ msgid "Bilinear Filter"
msgstr "Ð‘Ð¸Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
msgstr "Бампмаппинг"
@@ -585,9 +581,8 @@ msgid "None"
msgstr "Ðичего"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "Mip-текÑтурирование (Мип-маппинг)"
+msgstr "Mip-текÑтурирование"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -602,9 +597,12 @@ msgid "Parallax Occlusion"
msgstr "Parallax Occlusion"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "Включить чаÑтицы"
+msgstr "ЧаÑтицы"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¾Ð´Ð¸Ð½Ð¾Ñ‡Ð½Ð¾Ð¹ игры"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -985,6 +983,10 @@ msgstr "Включить noclip"
msgid "Use"
msgstr "ИÑпользовать"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "МаÑштаб"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "нажмите клавишу"
@@ -1301,10 +1303,6 @@ msgstr "Доп. кнопка 1"
msgid "X Button 2"
msgstr "Доп. кнопка 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "МаÑштаб"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1387,6 +1385,11 @@ msgid "Active Block Modifier interval"
msgstr "ДальноÑÑ‚ÑŒ взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "ДальноÑÑ‚ÑŒ взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸"
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr "ДальноÑÑ‚ÑŒ взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸"
@@ -1473,6 +1476,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "ÐвтоматичеÑки добавлÑÑ‚ÑŒ в ÑпиÑок Ñерверов."
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Кнопка автобега"
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "клавиша обратно"
@@ -1507,6 +1514,10 @@ msgid "Build inside player"
msgstr "Разрешить Ñтавить блоки на меÑте игрока"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Ð’Ñтроен"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Бампмаппинг"
@@ -1549,6 +1560,11 @@ msgid "Chat toggle key"
msgstr "Кнопка Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð°"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команда"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1620,16 +1636,23 @@ msgid "Colored fog"
msgstr "Цветной туман"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
+"СпиÑок доверенных модов, через запÑтую, которым разрешён доÑтуп к HTTP API, "
+"что позволÑет им отправлÑÑ‚ÑŒ и принимать данные в/из Ñети Интернет."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
+"СпиÑок доверенных модов, через запÑтую, которым разрешён доÑтуп к "
+"небезопаÑным функциÑм, даже в безопаÑном режиме (Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ "
+"request_insecure_environment())."
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -1661,7 +1684,7 @@ msgstr "Кнопка вызова конÑоли"
#: src/settings_translation_file.cpp
msgid "Continuous forward"
-msgstr ""
+msgstr "ÐÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð°Ñ Ñ…Ð¾Ð´ÑŒÐ±Ð°"
#: src/settings_translation_file.cpp
msgid "Continuous forward movement (only used for testing)."
@@ -1781,6 +1804,10 @@ msgid "Default privileges"
msgstr "Стандартные права"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1799,10 +1826,14 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Delay showing tooltips, stated in milliseconds."
+msgid "Delay in sending blocks after building"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr "Задержка показа подÑказок, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð² миллиÑекундах."
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Deprecated Lua API handling"
msgstr "УÑтаревшее Lua API управление"
@@ -1833,14 +1864,6 @@ msgid "Desynchronize block animation"
msgstr "РаÑÑинхронизировать анимацию блоков"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1852,6 +1875,18 @@ msgid "Disable anticheat"
msgstr "Отключить анти-чит"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "Запретить пуÑтой пароль"
@@ -1876,6 +1911,10 @@ msgid "Dump the mapgen debug infos."
msgstr "Дамп отладочной информации генератора мира."
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Включить мультиплеер"
@@ -1923,8 +1962,9 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Enables animation of inventory items."
-msgstr ""
+msgstr "Включить анимацию предметов в инвентаре."
#: src/settings_translation_file.cpp
msgid ""
@@ -1960,6 +2000,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1979,18 +2027,22 @@ msgid "Fall bobbing"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Fallback font"
msgstr "Fallback шрифт"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Fallback font shadow"
-msgstr ""
+msgstr "Fallback тень шрифта"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Fallback font shadow alpha"
-msgstr ""
+msgstr "Fallback прозрачноÑÑ‚ÑŒ тени шрифта"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Fallback font size"
msgstr "Fallback размер шрифта"
@@ -2016,7 +2068,7 @@ msgid ""
"Fast movement (via use key).\n"
"This requires the \"fast\" privilege on the server."
msgstr ""
-"БыÑтрое перемещение (Ñ Ð¸Ñпользование клавиши).\n"
+"БыÑтрое перемещение (Ñ Ð¸Ñпользованием клавиши).\n"
"Это требует привилегию \"fast\" на Ñервере."
#: src/settings_translation_file.cpp
@@ -2024,12 +2076,26 @@ msgid "Field of view"
msgstr "Поле зрениÑ"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "Поле зрениÑ"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "Поле Ð·Ñ€ÐµÐ½Ð¸Ñ Ð² градуÑах."
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"БыÑтрое перемещение (Ñ Ð¸Ñпользованием клавиши).\n"
+"Это требует привилегию \"fast\" на Ñервере."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2056,8 +2122,9 @@ msgid "Filtering"
msgstr "ФильтрациÑ"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Fixed map seed"
-msgstr "Конкретное ÑÐµÐ¼Ñ Ð¼Ð¸Ñ€Ð°"
+msgstr "ФикÑированное зерно мира"
#: src/settings_translation_file.cpp
msgid "Fly key"
@@ -2101,13 +2168,12 @@ msgid "Font size"
msgstr "Размер шрифта"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Format of screenshots."
-msgstr "Путь Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñкриншотов."
+msgstr "Формат Ñкриншотов."
#: src/settings_translation_file.cpp
msgid "Forward key"
-msgstr "Вперед"
+msgstr "Клавиша вперёд"
#: src/settings_translation_file.cpp
msgid "Freetype fonts"
@@ -2166,16 +2232,29 @@ msgid "Generate normalmaps"
msgstr "Генерировать карты нормалей"
#: src/settings_translation_file.cpp
+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.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Параметры глобального генератора карты.\n"
+"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за "
+"иÑключением деревьев\n"
+" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет "
+"вÑем оформлением.\n"
+"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, "
+"light, decorations\n"
+"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n"
+"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n"
+"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ."
#: src/settings_translation_file.cpp
msgid "Graphics"
@@ -2201,18 +2280,35 @@ msgid ""
"- log: mimic and log backtrace of deprecated call (default for debug).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
+"Обработка Ð´Ð»Ñ ÑƒÑтаревших вызовов lua api:\n"
+"- legacy: (иногда уÑпешно) имитирует прежнее поведение (по умолчанию Ð´Ð»Ñ "
+"релиза).\n"
+"- log: имитирует и журналирует backtrace(траÑÑировку?Ñлед?) уÑтаревших "
+"вызовов (по умолчанию Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸).\n"
+"- error: прерывание при иÑпользовании уÑтаревших вызовов (рекомендовано "
+"Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð² модов)."
#: src/settings_translation_file.cpp
-msgid "Height component of the initial window size."
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Height component of the initial window size."
+msgstr "Ð’Ñ‹Ñота Ñодержимого (отноÑительно?) иÑходного размера окна"
+
+#: src/settings_translation_file.cpp
msgid "Height on which clouds are appearing."
-msgstr ""
+msgstr "Ð’Ñ‹Ñота, на которой поÑвлÑÑŽÑ‚ÑÑ Ð¾Ð±Ð»Ð°ÐºÐ°."
#: src/settings_translation_file.cpp
msgid "High-precision FPU"
-msgstr ""
+msgstr "Ð’Ñ‹Ñокоточный FPU"
#: src/settings_translation_file.cpp
msgid "Homepage of server, to be displayed in the serverlist."
@@ -2220,33 +2316,32 @@ msgstr "ДомашнÑÑ Ñтраница Ñервера, отображаема
#: src/settings_translation_file.cpp
msgid "How deep to make rivers"
-msgstr ""
+msgstr "Глубина рек"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"How large area of blocks are subject to the active block stuff, stated in "
"mapblocks (16 nodes).\n"
"In active blocks objects are loaded and ABMs run."
msgstr ""
+"Размер площади из блоков, ÑоÑтавлÑющей активный блок, раÑположенный в "
+"mapblocks (16 nodes).↵\n"
+"Ð’ активных блоках объекты загружаютÑÑ Ð¸ ABMs запуÑкаетÑÑ."
#: src/settings_translation_file.cpp
-msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
+"Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñервера до выгрузки неиÑпользуемых mapblocks.\n"
+"Ð’Ñ‹Ñокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ плавные, но иÑпользуют больше RAM."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "How wide to make rivers"
-msgstr ""
+msgstr "УÑтановка ширины рек"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -2262,39 +2357,57 @@ msgid "IPv6 support."
msgstr "IPv6 поддержка."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"If FPS would go higher than this, limit it by sleeping\n"
"to not waste CPU power for no benefit."
msgstr ""
+"ЕÑли FPS превыÑит Ñто значение, ограничить его проÑтоем,\n"
+"чтобы не тратить мощноÑÑ‚ÑŒ процеÑÑора впуÑтую."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"If disabled \"use\" key is used to fly fast if both fly and fast mode are "
"enabled."
msgstr ""
+"ЕÑли выключено, кнопка \"use\"(\"иÑпользовать\"?) иÑпользуетÑÑ Ð´Ð»Ñ Ð±Ñ‹Ñтрого "
+"полёта, еÑли одновременно включены быÑтрый режим и режим полёта."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"If enabled together with fly mode, player is able to fly through solid "
"nodes.\n"
"This requires the \"noclip\" privilege on the server."
msgstr ""
+"ЕÑли включено одновременно Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð¾Ð¼ полёта, игрок может летать через "
+"твердые nodes(узлы?вершины?). Это требует привилегий \"noclip\" на Ñервере."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
"and descending."
msgstr ""
+"ЕÑли включено, клавиша \"use\"(\"иÑпользовать\"?) вмеÑто \"sneak"
+"\"(\"подкраÑÑ‚ÑŒÑÑ\"?) будет иÑпользоватьÑÑ Ð´Ð»Ñ climbing down and descending."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"If enabled, actions are recorded for rollback.\n"
"This option is only read when server starts."
msgstr ""
+"ЕÑли включено, дейÑÑ‚Ð²Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑываютÑÑ Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ñ‚Ð°.\n"
+"Этот параметр ÑчитываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при запуÑке Ñервера."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid "If enabled, disable cheat prevention in multiplayer."
msgstr ""
+"ЕÑли включено, отключаетÑÑ prevention(предупреждение?предотвращение?) "
+"читерÑтва в мультиплеере."
#: src/settings_translation_file.cpp
msgid ""
@@ -2338,6 +2451,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "Цвет фона внутриигровой конÑоли (R, G, B)."
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr "Интервал ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð²Ð°Ð¶Ð½Ñ‹Ñ… изменений в мире, уÑтановленный в Ñекундах."
@@ -2372,6 +2519,16 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "Интервал повторного клика правой кнопкой."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "ЧувÑтвительноÑÑ‚ÑŒ мыши"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2583,6 +2740,17 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Клавиша Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° быÑтрого перемещениÑ.\n"
+"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
@@ -2633,11 +2801,15 @@ msgstr ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
+"Клавиша Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²Ð»ÐµÐ²Ð¾.\n"
+"Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
#: src/settings_translation_file.cpp
msgid ""
@@ -2805,6 +2977,22 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "ДальноÑÑ‚ÑŒ взаимодейÑÑ‚Ð²Ð¸Ñ Ñ Ð±Ð»Ð¾ÐºÐ°Ð¼Ð¸"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2831,6 +3019,7 @@ msgid "Map directory"
msgstr "Каталог ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ñ€Ñ‚"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen Valleys.\n"
"'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2838,46 +3027,81 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Параметры глобального генератора карты.\n"
+"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за "
+"иÑключением деревьев\n"
+" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет "
+"вÑем оформлением.\n"
+"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, "
+"light, decorations\n"
+"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n"
+"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n"
+"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Параметры глобального генератора карты.\n"
+"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за "
+"иÑключением деревьев\n"
+" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет "
+"вÑем оформлением.\n"
+"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, "
+"light, decorations\n"
+"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n"
+"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n"
+"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Параметры глобального генератора карты.\n"
+"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за "
+"иÑключением деревьев\n"
+" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет "
+"вÑем оформлением.\n"
+"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, "
+"light, decorations\n"
+"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n"
+"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n"
+"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ."
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
+"Параметры глобального генератора карты.\n"
+"Ð’ генераторе карт v6 флаг 'decorations' управлÑет вÑем оформлением за "
+"иÑключением деревьев\n"
+" и junglegras(травы джунглей?), в оÑтальных генераторах Ñтот флаг управлÑет "
+"вÑем оформлением.\n"
+"Стандартные флаги, уÑтановленные в engine(инÑтрументе?) Ñледующие: caves, "
+"light, decorations\n"
+"Строка флагов изменÑет Ñтандартные наÑтройки engine(инÑтрумента?).\n"
+"Флаги, не указанные в Ñтроке флагов, по умолчанию не изменÑÑŽÑ‚ÑÑ.\n"
+"Флаги, начинающиеÑÑ Ñ 'no' иÑпользуютÑÑ Ð´Ð»Ñ Ð¸Ñ… Ñвного отключениÑ."
#: src/settings_translation_file.cpp
msgid "Map generation limit"
@@ -3248,6 +3472,15 @@ msgid "Maximum hotbar width"
msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° хотбара"
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "КоличеÑтво блоков, передаваемых одновременно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиента."
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3289,17 +3522,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3311,10 +3548,6 @@ msgid "Maximum users"
msgstr "МакÑимальное количеÑтво пользователей"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Меню"
@@ -3358,10 +3591,6 @@ msgid "Mipmapping"
msgstr "Mip-текÑтурирование (Мип-маппинг)"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3413,7 +3642,6 @@ msgstr ""
"Создание мира из главного меню переопределит Ñто."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Name of the player.\n"
"When running a server, clients connecting with this name are admins.\n"
@@ -3437,6 +3665,8 @@ msgid ""
"Network port to listen (UDP).\n"
"This value will be overridden when starting from the main menu."
msgstr ""
+"Сетевой порт Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑÐ»ÑƒÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ (UDP).\n"
+"Этот параметр будет переопределён, еÑли запуÑкать Ñервер Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ меню."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -3468,7 +3698,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Noises"
-msgstr ""
+msgstr "Шумы"
#: src/settings_translation_file.cpp
msgid "Normalmaps sampling"
@@ -3552,13 +3782,12 @@ msgid "Physics"
msgstr "Физика"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Player is able to fly without being affected by gravity.\n"
"This requires the \"fly\" privilege on the server."
msgstr ""
"Игрок может летать без влиÑÐ½Ð¸Ñ Ð³Ñ€Ð°Ð²Ð¸Ñ‚Ð°Ñ†Ð¸Ð¸.\n"
-"Это требует привилегии fly на Ñервере."
+"Это требует привилегии \"fly\" на Ñервере."
#: src/settings_translation_file.cpp
msgid "Player name"
@@ -3570,24 +3799,35 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Player versus Player"
-msgstr "PvP"
+msgstr "Игрок против Игрока"
#: src/settings_translation_file.cpp
msgid ""
"Port to connect to (UDP).\n"
"Note that the port field in the main menu overrides this setting."
msgstr ""
+"Порт, к которому подключитьÑÑ (UDP).\n"
+"Имейте ввиду, что поле ввода порта в главном меню переопределÑет Ñту "
+"наÑтройку."
#: src/settings_translation_file.cpp
msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
+"Ðе допуÑкать модам выполнение небезопаÑных вещей, например выполнение "
+"конÑольных команд."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3595,7 +3835,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3632,6 +3872,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr "ЗаменÑÑ‚ÑŒ главное меню на пользовательÑкое."
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Путь к шрифту"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° меню"
@@ -3662,15 +3907,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Round minimap"
-msgstr ""
+msgstr "ÐšÑ€ÑƒÐ³Ð»Ð°Ñ Ð¼Ð¸Ð½Ð¸ÐºÐ°Ñ€Ñ‚Ð°"
#: src/settings_translation_file.cpp
msgid "Save the map received by the client on disk."
-msgstr ""
+msgstr "Сохранение карты, полученной от клиента на диÑк."
#: src/settings_translation_file.cpp
msgid "Saving map received from server"
-msgstr ""
+msgstr "Сохранение карты, полученной Ñ Ñервера"
#: src/settings_translation_file.cpp
msgid ""
@@ -3700,19 +3945,23 @@ msgstr "Каталог Ñо Ñкриншотами"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Screenshot format"
-msgstr "Каталог Ñо Ñкриншотами"
+msgstr "Формат Ñкриншота"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Screenshot quality"
-msgstr "Cкриншот"
+msgstr "КачеÑтво Ñкриншота"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Screenshot quality. Only used for JPEG format.\n"
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"КачеÑтво Ñкриншота. ИÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ в формате JPEG.\n"
+"1 означает плохое качеÑтво; 100 означает хорошее качеÑтво.\n"
+"ИÑпользуйте 0 Ð´Ð»Ñ Ð½Ð°Ñтроек по умолчанию."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -3764,12 +4013,11 @@ msgstr "Порт Ñервера"
#: src/settings_translation_file.cpp
msgid "Serverlist URL"
-msgstr "СпиÑок публичных Ñерверов"
+msgstr "ÐÐ´Ñ€ÐµÑ ÑпиÑка Ñерверов"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Serverlist file"
-msgstr "СпиÑок публичных Ñерверов"
+msgstr "Файл ÑпиÑка Ñерверов"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -3810,7 +4058,7 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3820,16 +4068,15 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Shape of the minimap. Enabled = round, disabled = square."
-msgstr ""
+msgstr "Форма миникарты. Включено = круг, выключено = квадрат."
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Show debug info"
-msgstr "Показывать отладочную информацию."
+msgstr "Показывать отладочную информацию"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
-msgstr ""
+msgstr "Показывать выделение Ñнтити"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -3857,7 +4104,7 @@ msgstr "ÐœÑгкое оÑвещение"
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
"Сглаживать Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹ при ходьбе и поворотах.\n"
@@ -3891,6 +4138,11 @@ msgid ""
"(obviously, remote_media should end with a slash).\n"
"Files that are not present will be fetched the usual way."
msgstr ""
+"Указывает URL Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ клиент будет качать медиа-файлы вмеÑто "
+"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ UDP.\n"
+"$filename должен быть доÑтупен по адреÑу $remote_demia$filename через cURL\n"
+"(remote_media должен заканчиватьÑÑ Ñлешем).\n"
+"Файлы, которых не будет, будут Ñкачены обычным путём."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -3912,7 +4164,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "Поддержка Ñтарых Ñерверов"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
@@ -3920,7 +4172,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Terrain Height"
-msgstr ""
+msgstr "Ð’Ñ‹Ñота меÑтноÑти"
#: src/settings_translation_file.cpp
msgid ""
@@ -3946,15 +4198,28 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"Стандартный формат, в котором профили будут Ñохранены,\n"
+"когда вызывают '/profiler save [формат]' без формата."
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "The network interface that the server listens on."
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "The network interface that the server listens on."
+msgstr "Сетевой интерфейÑ, который Ñлушает Ñервер."
+
+#: src/settings_translation_file.cpp
msgid ""
"The privileges that new users automatically get.\n"
"See /privs in game for a full list on your server and mod configuration."
@@ -3968,6 +4233,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3984,13 +4255,20 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr "Задержка в Ñекундах между кликами при зажатой правой кнопке мыши."
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr "Задержка в Ñекундах между кликами при зажатой правой кнопке мыши."
#: src/settings_translation_file.cpp
msgid "This font will be used for certain languages."
-msgstr ""
+msgstr "Этот шрифт будет иÑпользован Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñзыков."
#: src/settings_translation_file.cpp
msgid "Time in between active block management cycles"
@@ -4063,7 +4341,7 @@ msgstr "Доверенные моды"
#: src/settings_translation_file.cpp
msgid "URL to the server list displayed in the Multiplayer Tab."
-msgstr ""
+msgstr "URL ÑпиÑка Ñерверов, отображающийÑÑ Ð²Ð¾ вкладке Мультиплеер."
#: src/settings_translation_file.cpp
msgid "Unlimited player transfer distance"
@@ -4113,11 +4391,6 @@ msgstr "ИÑпользовать трилинейную фильтрацию дÐ
#: src/settings_translation_file.cpp
#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Разработчики в отÑтавке"
-
-#: src/settings_translation_file.cpp
-#, fuzzy
msgid "V-Sync"
msgstr "V-Sync"
@@ -4164,6 +4437,8 @@ msgid ""
"View distance in nodes.\n"
"Min = 20"
msgstr ""
+"ДальноÑÑ‚ÑŒ отриÑовки в нодах.\n"
+"Минимум = 20"
#: src/settings_translation_file.cpp
#, fuzzy
@@ -4204,11 +4479,11 @@ msgstr "ТекÑтуры предметов..."
#: src/settings_translation_file.cpp
msgid "Water level"
-msgstr ""
+msgstr "Уровень воды"
#: src/settings_translation_file.cpp
msgid "Water surface level of the world."
-msgstr ""
+msgstr "Уровень поверхноÑти воды мира."
#: src/settings_translation_file.cpp
#, fuzzy
@@ -4253,7 +4528,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4361,110 +4636,117 @@ msgstr ""
msgid "cURL timeout"
msgstr "cURL тайм-аут"
+#, fuzzy
#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "Включите немного более низкую поверхноÑÑ‚ÑŒ воды, чтобы она\n"
-#~ "не заполнÑла блок полноÑтью. Учтите, что Ñто не ÑовÑем оптимизировано,\n"
-#~ "и мÑгкое оÑвещение на поверхноÑти воды не работает Ñ Ñтим."
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "КоличеÑтво блоков, передаваемых одновременно Ð´Ð»Ñ Ð²Ñего Ñервера."
-#~ msgid ""
-#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона. ИзменÑет минимальную дальноÑÑ‚ÑŒ "
-#~ "отображениÑ.\n"
-#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#, fuzzy
+#~ msgid "Useful for mod developers."
+#~ msgstr "Разработчики в отÑтавке"
-#~ msgid ""
-#~ "Key for increasing the viewing range. Modifies the minimum viewing "
-#~ "range.\n"
-#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgstr ""
-#~ "Клавиша Ð£Ð²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона. ИзменÑет минимальную дальноÑÑ‚ÑŒ "
-#~ "отображениÑ.\n"
-#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
-#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgid "No of course not!"
+#~ msgstr "Ðет, конечно нет!"
-#, fuzzy
-#~ msgid "New style water"
-#~ msgstr "Ðовый Ñтиль воды"
+#~ msgid "Public Serverlist"
+#~ msgstr "СпиÑок публичных Ñерверов"
-#~ msgid "Preload inventory textures"
-#~ msgstr "Предзагрузка текÑтур..."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Генерировать карты нормалей"
-#, fuzzy
-#~ msgid "Viewing range minimum"
-#~ msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° дальноÑти отриÑовки."
+#~ msgid "No!!!"
+#~ msgstr "Ðет!"
-#, fuzzy
-#~ msgid "Wanted FPS"
-#~ msgstr "Ожидаемый FPS"
+#~ msgid "\""
+#~ msgstr "\""
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¾Ð´Ð¸Ð½Ð¾Ñ‡Ð½Ð¾Ð¹ игры"
+#~ msgid "If disabled "
+#~ msgstr "ЕÑли выключено "
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "КоÑффициент маÑштаба интерфейÑа: "
+#~ msgid "If enabled, "
+#~ msgstr "ЕÑли включено "
-#~ msgid "Touch free target"
-#~ msgstr "Свободный выбор цели"
+#~ msgid "Rendering:"
+#~ msgstr "Рендеринг:"
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Загрузить"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "ПерезапуÑтите Minetest Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "ЛКМ: ПеремеÑтить вÑе предметы, ПКМ: ПеремеÑтить один предмет"
+#~ msgid "Game Name"
+#~ msgstr "Ðазвание"
-#~ msgid "is required by:"
-#~ msgstr "требуетÑÑ Ð´Ð»Ñ:"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "Gamemgr: Ðе могу Ñкопировать мод \"$1\" в игру \"$2\""
-#~ msgid "Configuration saved. "
-#~ msgstr "ÐаÑтройки Ñохранены. "
+#~ msgid "GAMES"
+#~ msgstr "ИГРЫ"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "Предупреждение: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ. "
+#~ msgid "Mods:"
+#~ msgstr "Моды:"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Ðевозможно Ñоздать мир: Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы"
+#~ msgid "new game"
+#~ msgstr "Создать игру"
-#~ msgid "Show Public"
-#~ msgstr "Публичные"
+#~ msgid "EDIT GAME"
+#~ msgstr "РЕДÐКТИРОВÐÐИЕ"
-#~ msgid "Show Favorites"
-#~ msgstr "Избранные"
+#~ msgid "Remove selected mod"
+#~ msgstr "Удалить мод"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "ОÑтавьте Ð°Ð´Ñ€ÐµÑ Ð¿ÑƒÑтым Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка локального Ñервера."
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- Добавить мод"
-#~ msgid "Create world"
-#~ msgstr "Создать мир"
+#~ msgid "CLIENT"
+#~ msgstr "КЛИЕÐТ"
-#~ msgid "Address required."
-#~ msgstr "Ðужно ввеÑти адреÑ."
+#~ msgid "START SERVER"
+#~ msgstr "СЕРВЕР"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Ðевозможно удалить мир: Ðичего не выбрано"
+#~ msgid "Name"
+#~ msgstr "ИмÑ"
-#~ msgid "Files to be deleted"
-#~ msgstr "Следующие файлы будут удалены"
+#~ msgid "Password"
+#~ msgstr "Пароль"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Ðевозможно Ñоздать мир: Ðи одной игры не найдено"
+#~ msgid "SETTINGS"
+#~ msgstr "ÐÐСТРОЙКИ"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Ðевозможно наÑтроить мир: ничего не выбрано"
+#~ msgid "Preload item visuals"
+#~ msgstr "Предзагрузка изображений"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Ошибка при удалении файлов мира"
+#~ msgid "Finite Liquid"
+#~ msgstr "Конечные жидкоÑти"
+
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "ОДИÐОЧÐÐЯ ИГРÐ"
+
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "ПÐКЕТЫ ТЕКСТУР"
+
+#~ msgid "MODS"
+#~ msgstr "МОДЫ"
+
+#~ msgid "Add mod:"
+#~ msgstr "Добавить мод:"
+
+#~ msgid "Local install"
+#~ msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑƒÑтановка"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "Предупреждение: Ðекоторые моды еще не наÑтроены.\n"
+#~ "Их Ñтандартные наÑтройки будут уÑтановлены, когда вы Ñохраните "
+#~ "конфигурацию. "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "Предупреждение: Ðекоторые моды не найдены.\n"
+#~ "Их наÑтройки будут удалены, когда вы Ñохраните конфигурацию. "
#~ msgid ""
#~ "Default Controls:\n"
@@ -4491,104 +4773,104 @@ msgstr "cURL тайм-аут"
#~ "- ESC: Ñто меню\n"
#~ "- T: чат\n"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "Предупреждение: Ðекоторые моды не найдены.\n"
-#~ "Их наÑтройки будут удалены, когда вы Ñохраните конфигурацию. "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "Предупреждение: Ðекоторые моды еще не наÑтроены.\n"
-#~ "Их Ñтандартные наÑтройки будут уÑтановлены, когда вы Ñохраните "
-#~ "конфигурацию. "
-
-#~ msgid "Local install"
-#~ msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑƒÑтановка"
-
-#~ msgid "Add mod:"
-#~ msgstr "Добавить мод:"
-
-#~ msgid "MODS"
-#~ msgstr "МОДЫ"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "ПÐКЕТЫ ТЕКСТУР"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "ОДИÐОЧÐÐЯ ИГРÐ"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Ошибка при удалении файлов мира"
-#~ msgid "Finite Liquid"
-#~ msgstr "Конечные жидкоÑти"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Ðевозможно наÑтроить мир: ничего не выбрано"
-#~ msgid "Preload item visuals"
-#~ msgstr "Предзагрузка изображений"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Ðевозможно Ñоздать мир: Ðи одной игры не найдено"
-#~ msgid "SETTINGS"
-#~ msgstr "ÐÐСТРОЙКИ"
+#~ msgid "Files to be deleted"
+#~ msgstr "Следующие файлы будут удалены"
-#~ msgid "Password"
-#~ msgstr "Пароль"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Ðевозможно удалить мир: Ðичего не выбрано"
-#~ msgid "Name"
-#~ msgstr "ИмÑ"
+#~ msgid "Address required."
+#~ msgstr "Ðужно ввеÑти адреÑ."
-#~ msgid "START SERVER"
-#~ msgstr "СЕРВЕР"
+#~ msgid "Create world"
+#~ msgstr "Создать мир"
-#~ msgid "CLIENT"
-#~ msgstr "КЛИЕÐТ"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "ОÑтавьте Ð°Ð´Ñ€ÐµÑ Ð¿ÑƒÑтым Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка локального Ñервера."
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- Добавить мод"
+#~ msgid "Show Favorites"
+#~ msgstr "Избранные"
-#~ msgid "Remove selected mod"
-#~ msgstr "Удалить мод"
+#~ msgid "Show Public"
+#~ msgstr "Публичные"
-#~ msgid "EDIT GAME"
-#~ msgstr "РЕДÐКТИРОВÐÐИЕ"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Ðевозможно Ñоздать мир: Ð˜Ð¼Ñ Ñодержит недопуÑтимые Ñимволы"
-#~ msgid "new game"
-#~ msgstr "Создать игру"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "Предупреждение: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ. "
-#~ msgid "Mods:"
-#~ msgstr "Моды:"
+#~ msgid "Configuration saved. "
+#~ msgstr "ÐаÑтройки Ñохранены. "
-#~ msgid "GAMES"
-#~ msgstr "ИГРЫ"
+#~ msgid "is required by:"
+#~ msgstr "требуетÑÑ Ð´Ð»Ñ:"
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "Gamemgr: Ðе могу Ñкопировать мод \"$1\" в игру \"$2\""
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "ЛКМ: ПеремеÑтить вÑе предметы, ПКМ: ПеремеÑтить один предмет"
-#~ msgid "Game Name"
-#~ msgstr "Ðазвание"
+#, fuzzy
+#~ msgid "Downloading"
+#~ msgstr "Загрузить"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "ПерезапуÑтите Minetest Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹"
+#~ msgid "Touch free target"
+#~ msgstr "Свободный выбор цели"
-#~ msgid "Rendering:"
-#~ msgstr "Рендеринг:"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "КоÑффициент маÑштаба интерфейÑа: "
-#~ msgid "If enabled, "
-#~ msgstr "ЕÑли включено "
+#, fuzzy
+#~ msgid "Wanted FPS"
+#~ msgstr "Ожидаемый FPS"
-#~ msgid "If disabled "
-#~ msgstr "ЕÑли выключено "
+#, fuzzy
+#~ msgid "Viewing range minimum"
+#~ msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° дальноÑти отриÑовки."
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "Preload inventory textures"
+#~ msgstr "Предзагрузка текÑтур..."
-#~ msgid "No!!!"
-#~ msgstr "Ðет!"
+#, fuzzy
+#~ msgid "New style water"
+#~ msgstr "Ðовый Ñтиль воды"
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Генерировать карты нормалей"
+#~ msgid ""
+#~ "Key for increasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Клавиша Ð£Ð²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона. ИзменÑет минимальную дальноÑÑ‚ÑŒ "
+#~ "отображениÑ.\n"
+#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "Public Serverlist"
-#~ msgstr "СпиÑок публичных Ñерверов"
+#~ msgid ""
+#~ "Key for decreasing the viewing range. Modifies the minimum viewing "
+#~ "range.\n"
+#~ "See http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
+#~ msgstr ""
+#~ "Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ диапазона. ИзменÑет минимальную дальноÑÑ‚ÑŒ "
+#~ "отображениÑ.\n"
+#~ "Смотрите http://irrlicht.sourceforge.net/docu/namespaceirr."
+#~ "html#a54da2a0e231901735e3da1b0edf72eb3"
-#~ msgid "No of course not!"
-#~ msgstr "Ðет, конечно нет!"
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "Включите немного более низкую поверхноÑÑ‚ÑŒ воды, чтобы она\n"
+#~ "не заполнÑла блок полноÑтью. Учтите, что Ñто не ÑовÑем оптимизировано,\n"
+#~ "и мÑгкое оÑвещение на поверхноÑти воды не работает Ñ Ñтим."
diff --git a/po/sr_Cyrl/minetest.po b/po/sr_Cyrl/minetest.po
new file mode 100644
index 000000000..eea83a67c
--- /dev/null
+++ b/po/sr_Cyrl/minetest.po
@@ -0,0 +1,4234 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: minetest\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-07-13 09:50+0000\n"
+"Last-Translator: lisacvuk <lisacvukhome@gmail.com>\n"
+"Language-Team: Serbian (cyrillic) <https://hosted.weblate.org/projects/"
+"minetest/minetest/sr_Cyrl/>\n"
+"Language: sr_Cyrl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.8-dev\n"
+
+#: builtin/fstk/ui.lua
+msgid "An error occured in a Lua script, such as a mod:"
+msgstr "Догодила Ñе грешка у Lua Ñкрипти, у моду:"
+
+#: builtin/fstk/ui.lua
+msgid "An error occured:"
+msgstr "Догодила Ñе грешка:"
+
+#: builtin/fstk/ui.lua
+msgid "Main menu"
+msgstr "Главни мени"
+
+#: builtin/fstk/ui.lua builtin/mainmenu/store.lua
+msgid "Ok"
+msgstr "Уреду"
+
+#: builtin/fstk/ui.lua
+msgid "Reconnect"
+msgstr "Поновно повезивање"
+
+#: builtin/fstk/ui.lua
+msgid "The server has requested a reconnect:"
+msgstr "Сервер тражи поновно повезивање:"
+
+#: builtin/mainmenu/common.lua src/game.cpp
+msgid "Loading..."
+msgstr "Учитавање..."
+
+#: builtin/mainmenu/common.lua
+msgid "Protocol version mismatch. "
+msgstr "ÐеÑлагање верзија протокола. "
+
+#: builtin/mainmenu/common.lua
+msgid "Server enforces protocol version $1. "
+msgstr "Сервер примењује $1 верзију протокола. "
+
+#: builtin/mainmenu/common.lua
+msgid "Server supports protocol versions between $1 and $2. "
+msgstr "Сервер подржава верзије протокола између $1 и $2. "
+
+#: builtin/mainmenu/common.lua
+msgid "Try reenabling public serverlist and check your internet connection."
+msgstr ""
+"Покушајте да поновно укључите лиÑту Ñервера и проверите вашу интернет "
+"конекцију."
+
+#: builtin/mainmenu/common.lua
+msgid "We only support protocol version $1."
+msgstr "Ми подржавамо Ñамо $1 верзију протокола."
+
+#: builtin/mainmenu/common.lua
+msgid "We support protocol versions between version $1 and $2."
+msgstr "Ми подржавамо верзије протокола између верзије $1 и $2."
+
+#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
+#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_rename_modpack.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
+#: src/keycode.cpp
+msgid "Cancel"
+msgstr "Прекини"
+
+#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
+msgid "Depends:"
+msgstr "ЗавиÑи од:"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Disable MP"
+msgstr "Онемогући мод-паковање"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Enable MP"
+msgstr "Омогући мод-паковање"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Enable all"
+msgstr "Укључи Ñве"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid ""
+"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
+"chararacters [a-z0-9_] are allowed."
+msgstr ""
+"ÐеуÑпело укључивање мода \"$1\" зато што Ñадржи неподржане Ñимболе.Само "
+"Ñимболи [a-z0-9_] Ñу дозвољени."
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Hide Game"
+msgstr "Сакриј игру"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Hide mp content"
+msgstr "Сакриј Ñадржину мод-паковања"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Mod:"
+msgstr "Мод:"
+
+#: builtin/mainmenu/dlg_config_world.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
+msgid "Save"
+msgstr "Сачувај"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "World:"
+msgstr "Свет:"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "enabled"
+msgstr "укључено"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "A world named \"$1\" already exists"
+msgstr "Свет \"$1\" већ поÑтоји"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Create"
+msgstr "Ðаправи"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Download a subgame, such as minetest_game, from minetest.net"
+msgstr "Преузми подигру, као што је minetest_game, Ñа minetest.net"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Download one from minetest.net"
+msgstr "Преузми један Ñа minetest.net"
+
+#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
+msgid "Game"
+msgstr "Игра"
+
+#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
+msgid "Mapgen"
+msgstr "Генератор мапе"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "No worldname given or no game selected"
+msgstr "Име није дато или ниједна игра није изабрана"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Seed"
+msgstr "Семе"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Warning: The minimal development test is meant for developers."
+msgstr "Упозорење: Минимални развојни теÑÑ‚ је намењен развијачима."
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "World name"
+msgstr "Име Ñвета"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "You have no subgames installed."
+msgstr "Ðема инÑталираних подигара."
+
+#: builtin/mainmenu/dlg_delete_mod.lua
+msgid "Are you sure you want to delete \"$1\"?"
+msgstr "Да ли Ñте Ñигурни да желите да обришете \"$1\"?"
+
+#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+#: src/keycode.cpp
+msgid "Delete"
+msgstr "Обриши"
+
+#: builtin/mainmenu/dlg_delete_mod.lua
+msgid "Modmgr: failed to delete \"$1\""
+msgstr "Modmgr: неуÑпело бриÑање \"$1\""
+
+#: builtin/mainmenu/dlg_delete_mod.lua
+msgid "Modmgr: invalid modpath \"$1\""
+msgstr "Modmgr: локација мода \"$1\" није валидна"
+
+#: builtin/mainmenu/dlg_delete_world.lua
+msgid "Delete World \"$1\"?"
+msgstr "Обриши Ñвет \"$1\"?"
+
+#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
+msgid "Accept"
+msgstr "Прихвати"
+
+#: builtin/mainmenu/dlg_rename_modpack.lua
+msgid "Rename Modpack:"
+msgstr "Преименуј мод-паковање:"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "\"$1\" is not a valid flag."
+msgstr "\"$1\" није валидна ознака."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "(No description of setting given)"
+msgstr "(Ðије дат Ð¾Ð¿Ð¸Ñ Ð¿Ð¾Ñтавке)"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "< Back to Settings page"
+msgstr "< Ðазад на Ñтрану Ñа поÑтавкама"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Browse"
+msgstr "Прегледај"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Disabled"
+msgstr "Онемогућено"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Edit"
+msgstr "Промени"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Enabled"
+msgstr "Омогућено"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Format is 3 numbers separated by commas and inside brackets."
+msgstr "Формат Ñу три броја унутар заграда раздвојени зарезима."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid ""
+"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
+"<octaves>, <persistence>"
+msgstr ""
+"Формат: <офÑет>, <Ñкала>, (<раÑпонX>, <раÑпонY>, <раÑпонZ>), <Ñеме>, "
+"<октаве>, <упорноÑÑ‚>"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Games"
+msgstr "Игре"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
+msgid "Mods"
+msgstr "Модови"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Optionally the lacunarity can be appended with a leading comma."
+msgstr ""
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Please enter a comma seperated list of flags."
+msgstr "Молим Ð²Ð°Ñ ÑƒÐ½ÐµÑите лиÑту ознака раздвојену зарезима."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Please enter a valid integer."
+msgstr "Молим Ð²Ð°Ñ ÑƒÐ½ÐµÑите валидан број."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Please enter a valid number."
+msgstr "Молим Ð²Ð°Ñ ÑƒÐ½ÐµÑите валидан број."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Possible values are: "
+msgstr "Могуће вредноÑти Ñу: "
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Restore Default"
+msgstr "Поврати уобичајено"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Select path"
+msgstr "Одабери локацију"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Show technical names"
+msgstr "Прикажи техничка имена"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "The value must be greater than $1."
+msgstr "ВредноÑÑ‚ мора бити већа од $1."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "The value must be lower than $1."
+msgstr "ВредноÑÑ‚ мора бити мања од $1."
+
+#: builtin/mainmenu/modmgr.lua
+msgid ""
+"\n"
+"Install Mod: unsupported filetype \"$1\" or broken archive"
+msgstr ""
+"\n"
+"ИнÑталирај мод: неподржан тип фајла \"$1\" или оштећена архива"
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Failed to install $1 to $2"
+msgstr "ÐеуÑпела инÑталација $1 у $2"
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Install Mod: file: \"$1\""
+msgstr "ИнÑталирај мод: фајл: \"$1\""
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Install Mod: unable to find real modname for: $1"
+msgstr "ИнÑталирај мод: не може Ñе пронаћи право име за: $1"
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Install Mod: unable to find suitable foldername for modpack $1"
+msgstr ""
+"ИнÑталирај мод: не може Ñе пронаћи одговарајуће име за фаÑциклу мод-паковања "
+"$1"
+
+#: builtin/mainmenu/store.lua
+msgid "Close store"
+msgstr "Затвори Ñкладиште"
+
+#: builtin/mainmenu/store.lua
+msgid "Downloading $1, please wait..."
+msgstr "Преузима Ñе $1, молим Ð²Ð°Ñ Ñачекајте..."
+
+#: builtin/mainmenu/store.lua
+msgid "Install"
+msgstr "ИнÑталирај"
+
+#: builtin/mainmenu/store.lua
+msgid "Page $1 of $2"
+msgstr "Страна $1 од $2"
+
+#: builtin/mainmenu/store.lua
+msgid "Rating"
+msgstr "Оцена"
+
+#: builtin/mainmenu/store.lua
+msgid "Search"
+msgstr "Тражи"
+
+#: builtin/mainmenu/store.lua
+msgid "Shortname:"
+msgstr "Краће име:"
+
+#: builtin/mainmenu/store.lua
+msgid "Successfully installed:"
+msgstr "УÑпешно инÑталиран:"
+
+#: builtin/mainmenu/store.lua
+msgid "Unsorted"
+msgstr "ÐераÑпоређено"
+
+#: builtin/mainmenu/store.lua
+msgid "re-Install"
+msgstr "поново инÑталирај"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Active Contributors"
+msgstr "Ðктивни Ñарадници"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Core Developers"
+msgstr "Главни развијачи"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Credits"
+msgstr "ЗаÑлуге"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Previous Contributors"
+msgstr "Предходни Ñарадници"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Previous Core Developers"
+msgstr "Предходни главни развијачи"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Installed Mods:"
+msgstr "ИнÑталирани модови:"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Mod information:"
+msgstr "Информације о моду:"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "No mod description available"
+msgstr "Ðије доÑтупан Ð¾Ð¿Ð¸Ñ Ð¼Ð¾Ð´Ð°"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Rename"
+msgstr "Преименуј"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Select Mod File:"
+msgstr "Изаберите фајл мода:"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Uninstall selected mod"
+msgstr "Уклони изабрани мод"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Uninstall selected modpack"
+msgstr "Уклони одабрано мод-паковање"
+
+#: builtin/mainmenu/tab_multiplayer.lua
+msgid "Address / Port"
+msgstr "ÐдреÑа / Порт"
+
+#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
+msgid "Client"
+msgstr "Клијент"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Connect"
+msgstr "Прикључи Ñе"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Creative mode"
+msgstr "Слободни мод"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Damage enabled"
+msgstr "Оштећење омогућено"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Del. Favorite"
+msgstr "Обриши Омиљени"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Favorite"
+msgstr "Омиљени"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Name / Password"
+msgstr "Име / Шифра"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "PvP enabled"
+msgstr "Туча омогућена"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Bind Address"
+msgstr "Вежи адреÑу"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "Configure"
+msgstr "ПодеÑи"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
+#: builtin/mainmenu/tab_singleplayer.lua
+msgid "Creative Mode"
+msgstr "Слободни мод"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
+#: builtin/mainmenu/tab_singleplayer.lua
+msgid "Enable Damage"
+msgstr "Омогући оштећење"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Name/Password"
+msgstr "Име/Шифра"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "New"
+msgstr "Ðови"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "No world created or selected!"
+msgstr "Ðиједан Ñвет није направљен или изабран!"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Port"
+msgstr "Порт"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Public"
+msgstr "Јавни"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "Select World:"
+msgstr "Одабери Ñвет:"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Server"
+msgstr "Сервер"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Server Port"
+msgstr "СерверÑки порт"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Start Game"
+msgstr "Почни игру"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "2x"
+msgstr "2x"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "3D Clouds"
+msgstr "3Д Облаци"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "4x"
+msgstr "4x"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "8x"
+msgstr "8x"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Advanced Settings"
+msgstr "Ðапредне поÑтавке"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Antialiasing:"
+msgstr "Гланчање текÑтура:"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Are you sure to reset your singleplayer world?"
+msgstr "Да ли Ñте Ñигурни да желите да реÑетујете ваш Ñвет?"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Bilinear Filter"
+msgstr "Билинеарни филтер"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Bump Mapping"
+msgstr "Bump-Мапирање"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Change keys"
+msgstr "Промени дугмад"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Connected Glass"
+msgstr "Спојено Ñтакло"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Fancy Leaves"
+msgstr "Елегантно лишће"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Mipmap"
+msgstr "Мипмап"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Mipmap + Aniso. Filter"
+msgstr "Mipmap + Ðнизотропни филтер"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "No"
+msgstr "Ðе"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "No Filter"
+msgstr "Без филтера"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "No Mipmap"
+msgstr "Без Mipmap-а"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Node Highlighting"
+msgstr "ИÑтицање блокова"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Node Outlining"
+msgstr "Обцртавање блокова"
+
+#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
+msgid "None"
+msgstr "Ðишта"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Normal Mapping"
+msgstr "Ðормал-мапирање"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Opaque Leaves"
+msgstr "Ðепровидно лишће"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Opaque Water"
+msgstr "Ðепрозирна вода"
+
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Parallax Occlusion"
+msgstr "Parallax Occlusion Мапирање"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Particles"
+msgstr "ЧеÑтице"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "РеÑетуј Ñвет"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Settings"
+msgstr "ПоÑтавке"
+
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Shaders"
+msgstr "Шејдери"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Simple Leaves"
+msgstr "ЈедноÑтавно лишће"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Smooth Lighting"
+msgstr "Глатко оÑветљење"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Texturing:"
+msgstr "Филтери за текÑтуре:"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "To enable shaders the OpenGL driver needs to be used."
+msgstr "Да би Ñе омогућили шејдери мора Ñе кориÑтити OpenGL драјвер."
+
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Tone Mapping"
+msgstr "ТонÑко Мапирање"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Touchthreshold (px)"
+msgstr "Праг додиривања (px)"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Trilinear Filter"
+msgstr "Трилинеарни филтер"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Waving Leaves"
+msgstr "Лепршајуће лишће"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Waving Plants"
+msgstr "Лепршајуће биљке"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Waving Water"
+msgstr "ВеÑлајућа вода"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Yes"
+msgstr "Да"
+
+#: builtin/mainmenu/tab_simple_main.lua
+msgid "Config mods"
+msgstr "ПодеÑи модове"
+
+#: builtin/mainmenu/tab_simple_main.lua
+msgid "Main"
+msgstr "Главно"
+
+#: builtin/mainmenu/tab_simple_main.lua
+msgid "Start Singleplayer"
+msgstr "Започни игру за једног играча"
+
+#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
+msgid "Play"
+msgstr "Играј"
+
+#: builtin/mainmenu/tab_singleplayer.lua
+msgid "Singleplayer"
+msgstr "Један играч"
+
+#: builtin/mainmenu/tab_texturepacks.lua
+msgid "No information available"
+msgstr "Ðема доÑтупних информација"
+
+#: builtin/mainmenu/tab_texturepacks.lua
+msgid "Select texture pack:"
+msgstr "Одабери Ñет текÑтура:"
+
+#: builtin/mainmenu/tab_texturepacks.lua
+msgid "Texturepacks"
+msgstr "Сетови текÑтура"
+
+#: src/client.cpp
+msgid "Connection timed out."
+msgstr "Конекцији је иÑтекло време."
+
+#: src/client.cpp
+msgid "Done!"
+msgstr "Готово!"
+
+#: src/client.cpp
+msgid "Initializing nodes"
+msgstr "Припремам блокове"
+
+#: src/client.cpp
+msgid "Initializing nodes..."
+msgstr "Припремам блокове..."
+
+#: src/client.cpp
+msgid "Loading textures..."
+msgstr "Учитавам текÑтуре..."
+
+#: src/client.cpp
+msgid "Rebuilding shaders..."
+msgstr "Обнављам шејдере..."
+
+#: src/client/clientlauncher.cpp
+msgid "Connection error (timed out?)"
+msgstr "Грешка у конекцији (иÑтекло време?)"
+
+#: src/client/clientlauncher.cpp
+msgid "Could not find or load game \""
+msgstr "Ðемогу пронаћи или учитати игру \""
+
+#: src/client/clientlauncher.cpp
+msgid "Invalid gamespec."
+msgstr "Ðеважећи gamespec."
+
+#: src/client/clientlauncher.cpp
+msgid "Main Menu"
+msgstr "Главни мени"
+
+#: src/client/clientlauncher.cpp
+msgid "No world selected and no address provided. Nothing to do."
+msgstr ""
+"Ðиједан Ñвет није изабран и ниједна адреÑа није дата. Ðемогу ништа да урадим."
+
+#: src/client/clientlauncher.cpp
+msgid "Player name too long."
+msgstr "Име играча је предуачко."
+
+#: src/client/clientlauncher.cpp
+msgid "Provided world path doesn't exist: "
+msgstr "Дата локација Ñвета не поÑтоји: "
+
+#: src/fontengine.cpp
+msgid "needs_fallback_font"
+msgstr ""
+
+#: src/game.cpp
+msgid ""
+"\n"
+"Check debug.txt for details."
+msgstr ""
+"\n"
+"Проверите debug.txt за више детаља."
+
+#: src/game.cpp
+msgid "Change Keys"
+msgstr "ПодеÑи контроле"
+
+#: src/game.cpp
+msgid "Change Password"
+msgstr "Промени шифру"
+
+#: src/game.cpp
+msgid "Connecting to server..."
+msgstr "Повезујем Ñе на Ñервер..."
+
+#: src/game.cpp
+msgid "Continue"
+msgstr "ÐаÑтави"
+
+#: src/game.cpp
+msgid "Creating client..."
+msgstr "Правим клијента..."
+
+#: src/game.cpp
+msgid "Creating server..."
+msgstr "Правим Ñервер..."
+
+#: src/game.cpp
+msgid ""
+"Default Controls:\n"
+"- WASD: move\n"
+"- Space: jump/climb\n"
+"- Shift: sneak/go down\n"
+"- Q: drop item\n"
+"- I: inventory\n"
+"- Mouse: turn/look\n"
+"- Mouse left: dig/punch\n"
+"- Mouse right: place/use\n"
+"- Mouse wheel: select item\n"
+"- T: chat\n"
+msgstr ""
+"Уобичајене контроле:\n"
+"- WASD: кретање\n"
+"- Space: Ñкакање/пењање\n"
+"- Shift: шуњање/Ñилажење\n"
+"- Q: баци Ñтавку\n"
+"- I: инвентар\n"
+"- Миш: окретање/гледање\n"
+"- Леви клик миша: копање/ударање\n"
+"- ДеÑни клик миша: поÑтављање/коришћење\n"
+"- Точкић миша: одабирање Ñтавке\n"
+"- T: причање\n"
+
+#: src/game.cpp
+msgid ""
+"Default Controls:\n"
+"No menu visible:\n"
+"- single tap: button activate\n"
+"- double tap: place/use\n"
+"- slide finger: look around\n"
+"Menu/Inventory visible:\n"
+"- double tap (outside):\n"
+" -->close\n"
+"- touch stack, touch slot:\n"
+" --> move stack\n"
+"- touch&drag, tap 2nd finger\n"
+" --> place single item to slot\n"
+msgstr ""
+"Подразумеване контроле:\n"
+"Ðи један приказан мени:\n"
+"- један тап: копај\n"
+"- дупли тап: поÑтави блок/кориÑти\n"
+"- превуци прÑтом: гледај около\n"
+"Мени/Инвертар приказан:\n"
+"- дупли тап (изван):\n"
+" -->ИÑкључи\n"
+"- додирни Ñтвари, додирни празно меÑто:\n"
+" --> помери Ñтвари\n"
+"- држи и превлачи, тапни другим прÑтом:\n"
+" --> пребаци Ñамо једну Ñтвар из групе\n"
+
+#: src/game.cpp
+msgid "Exit to Menu"
+msgstr "Изађи у мени"
+
+#: src/game.cpp
+msgid "Exit to OS"
+msgstr "Изађи из програма"
+
+#: src/game.cpp
+msgid "Item definitions..."
+msgstr "Дефиниције предмета..."
+
+#: src/game.cpp
+msgid "KiB/s"
+msgstr "КиБ/Ñ"
+
+#: src/game.cpp
+msgid "Media..."
+msgstr "Медија..."
+
+#: src/game.cpp
+msgid "MiB/s"
+msgstr "МиБ/Ñ"
+
+#: src/game.cpp
+msgid "Node definitions..."
+msgstr "Дефиниције блокова..."
+
+#: src/game.cpp
+msgid "Resolving address..."
+msgstr "Разлучујем адреÑу..."
+
+#: src/game.cpp
+msgid "Respawn"
+msgstr "Врати Ñе у живот"
+
+#: src/game.cpp
+msgid "Shutting down..."
+msgstr "ИÑкључивање..."
+
+#: src/game.cpp
+msgid "Sound Volume"
+msgstr "Јачина звука"
+
+#: src/game.cpp
+msgid "You died."
+msgstr "Умро/ла Ñи."
+
+#: src/game.cpp src/guiFormSpecMenu.cpp
+msgid "ok"
+msgstr "уреду"
+
+#: src/guiFormSpecMenu.cpp
+msgid "Enter "
+msgstr "Уреду "
+
+#: src/guiFormSpecMenu.cpp
+msgid "Proceed"
+msgstr "ÐаÑтави"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "\"Use\" = climb down"
+msgstr "\"КориÑти\" = Силажење"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Backward"
+msgstr "Ðазад"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Chat"
+msgstr "Чет"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Command"
+msgstr "Команда"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Console"
+msgstr "Конзола"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Double tap \"jump\" to toggle fly"
+msgstr "Дупли Ñкок за летење"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Drop"
+msgstr "Бацање"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Forward"
+msgstr "Ðапред"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Inventory"
+msgstr "Инвентар"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Jump"
+msgstr "Скакање"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Key already in use"
+msgstr "Дугме Ñе већ кориÑти"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgstr ""
+"Подешавање контрола.(Ðко овај мени нешто поквари, обришите Ñтвари из "
+"minetest.conf)"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Left"
+msgstr "Лево"
+
+#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
+msgid "Print stacks"
+msgstr "Прикажи stack-ове"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Range select"
+msgstr "Одабир домета"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Right"
+msgstr "ДеÑно"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Sneak"
+msgstr "Шуњање"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle Cinematic"
+msgstr "Укључи/ИÑкључи Cinematic мод"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle fast"
+msgstr "Укључи/ИÑкључи трчање"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle fly"
+msgstr "Укључи/ИÑкључи летење"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle noclip"
+msgstr "Укључи/иÑкључи пролажење кроз препреке"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Use"
+msgstr "Коришћење"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Зумирај"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "press key"
+msgstr "притиÑните дугме"
+
+#: src/guiPasswordChange.cpp
+msgid "Change"
+msgstr "Промени"
+
+#: src/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Потврди шифру"
+
+#: src/guiPasswordChange.cpp
+msgid "New Password"
+msgstr "Ðова шифра"
+
+#: src/guiPasswordChange.cpp
+msgid "Old Password"
+msgstr "Стара шифра"
+
+#: src/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "Шифре Ñе не поклапају!"
+
+#: src/guiVolumeChange.cpp
+msgid "Exit"
+msgstr "Изађи"
+
+#: src/guiVolumeChange.cpp
+msgid "Sound Volume: "
+msgstr "Јачина звука: "
+
+#: src/keycode.cpp
+msgid "Apps"
+msgstr "Ðпликације"
+
+#: src/keycode.cpp
+msgid "Attn"
+msgstr "Ðттн"
+
+#: src/keycode.cpp
+msgid "Back"
+msgstr "Ðазад"
+
+#: src/keycode.cpp
+msgid "Capital"
+msgstr "Главно"
+
+#: src/keycode.cpp
+msgid "Clear"
+msgstr "ОчиÑти"
+
+#: src/keycode.cpp
+msgid "Comma"
+msgstr "Зарез"
+
+#: src/keycode.cpp
+msgid "Control"
+msgstr "Контрола"
+
+#: src/keycode.cpp
+msgid "Convert"
+msgstr "Конвертуј"
+
+#: src/keycode.cpp
+msgid "CrSel"
+msgstr "ЦрСел"
+
+#: src/keycode.cpp
+msgid "Down"
+msgstr "Доле"
+
+#: src/keycode.cpp
+msgid "End"
+msgstr "Крај"
+
+#: src/keycode.cpp
+msgid "Erase OEF"
+msgstr ""
+
+#: src/keycode.cpp
+msgid "Escape"
+msgstr "Побегни"
+
+#: src/keycode.cpp
+msgid "ExSel"
+msgstr ""
+
+#: src/keycode.cpp
+msgid "Execute"
+msgstr "Изврши"
+
+#: src/keycode.cpp
+msgid "Final"
+msgstr "Крајњи"
+
+#: src/keycode.cpp
+msgid "Help"
+msgstr "Помоћ"
+
+#: src/keycode.cpp
+msgid "Home"
+msgstr "Кућа"
+
+#: src/keycode.cpp
+msgid "Insert"
+msgstr "Убаци"
+
+#: src/keycode.cpp
+msgid "Junja"
+msgstr ""
+
+#: src/keycode.cpp
+msgid "Kana"
+msgstr ""
+
+#: src/keycode.cpp
+msgid "Kanji"
+msgstr ""
+
+#: src/keycode.cpp
+msgid "Left Button"
+msgstr "Лево дугме"
+
+#: src/keycode.cpp
+msgid "Left Control"
+msgstr "Леви Control"
+
+#: src/keycode.cpp
+msgid "Left Menu"
+msgstr "Леви мени"
+
+#: src/keycode.cpp
+msgid "Left Shift"
+msgstr "Леви Shift"
+
+#: src/keycode.cpp
+msgid "Left Windows"
+msgstr "Леви Windows"
+
+#: src/keycode.cpp
+msgid "Menu"
+msgstr "Мени"
+
+#: src/keycode.cpp
+msgid "Middle Button"
+msgstr "Средње дугме"
+
+#: src/keycode.cpp
+msgid "Minus"
+msgstr "МинуÑ"
+
+#: src/keycode.cpp
+msgid "Mode Change"
+msgstr "Промена мода"
+
+#: src/keycode.cpp
+msgid "Next"
+msgstr "Следеће"
+
+#: src/keycode.cpp
+msgid "Nonconvert"
+msgstr "Ðе конвертуј"
+
+#: src/keycode.cpp
+msgid "Num Lock"
+msgstr "Закључавање нумеричке таÑтатуре"
+
+#: src/keycode.cpp
+msgid "Numpad *"
+msgstr "Ðумеричка таÑтатура *"
+
+#: src/keycode.cpp
+msgid "Numpad +"
+msgstr "Ðумеричка таÑтатура +"
+
+#: src/keycode.cpp
+msgid "Numpad -"
+msgstr "Ðумеричка таÑтатура -"
+
+#: src/keycode.cpp
+msgid "Numpad /"
+msgstr "Ðумеричка таÑтатура /"
+
+#: src/keycode.cpp
+msgid "Numpad 0"
+msgstr "Ðумеричка таÑтатура 0"
+
+#: src/keycode.cpp
+msgid "Numpad 1"
+msgstr "Ðумеричка таÑтатура 1"
+
+#: src/keycode.cpp
+msgid "Numpad 2"
+msgstr "Ðумеричка таÑтатура 2"
+
+#: src/keycode.cpp
+msgid "Numpad 3"
+msgstr "Ðумеричка таÑтатура 3"
+
+#: src/keycode.cpp
+msgid "Numpad 4"
+msgstr "Ðумеричка таÑтатура 4"
+
+#: src/keycode.cpp
+msgid "Numpad 5"
+msgstr "Ðумеричка таÑтатура 5"
+
+#: src/keycode.cpp
+msgid "Numpad 6"
+msgstr "Ðумеричка таÑтатура 6"
+
+#: src/keycode.cpp
+msgid "Numpad 7"
+msgstr "Ðумеричка таÑтатура 7"
+
+#: src/keycode.cpp
+msgid "Numpad 8"
+msgstr "Ðумеричка таÑтатура 8"
+
+#: src/keycode.cpp
+msgid "Numpad 9"
+msgstr "Ðумеричка таÑтатура 9"
+
+#: src/keycode.cpp
+msgid "OEM Clear"
+msgstr "ОЕМ очиÑти"
+
+#: src/keycode.cpp
+msgid "PA1"
+msgstr ""
+
+#: src/keycode.cpp
+msgid "Pause"
+msgstr "ЗауÑтави"
+
+#: src/keycode.cpp
+msgid "Period"
+msgstr "Тачка"
+
+#: src/keycode.cpp
+msgid "Plus"
+msgstr "ПлуÑ"
+
+#: src/keycode.cpp
+msgid "Print"
+msgstr "Прикажи"
+
+#: src/keycode.cpp
+msgid "Prior"
+msgstr "Пре"
+
+#: src/keycode.cpp
+msgid "Return"
+msgstr "Повратак"
+
+#: src/keycode.cpp
+msgid "Right Button"
+msgstr "ДеÑно дугме"
+
+#: src/keycode.cpp
+msgid "Right Control"
+msgstr "ДеÑни Control"
+
+#: src/keycode.cpp
+msgid "Right Menu"
+msgstr "ДеÑни мени"
+
+#: src/keycode.cpp
+msgid "Right Shift"
+msgstr "ДеÑни Shift"
+
+#: src/keycode.cpp
+msgid "Right Windows"
+msgstr "ДеÑни Windows"
+
+#: src/keycode.cpp
+msgid "Scroll Lock"
+msgstr "Закључавање Ñкроловања"
+
+#: src/keycode.cpp
+msgid "Select"
+msgstr "Одабери"
+
+#: src/keycode.cpp
+msgid "Shift"
+msgstr "Шифт"
+
+#: src/keycode.cpp
+msgid "Sleep"
+msgstr "Спавај"
+
+#: src/keycode.cpp
+msgid "Snapshot"
+msgstr ""
+
+#: src/keycode.cpp
+msgid "Space"
+msgstr "ПроÑтор"
+
+#: src/keycode.cpp
+msgid "Tab"
+msgstr "Таб"
+
+#: src/keycode.cpp
+msgid "Up"
+msgstr "Горе"
+
+#: src/keycode.cpp
+msgid "X Button 1"
+msgstr "X Дугме 1"
+
+#: src/keycode.cpp
+msgid "X Button 2"
+msgstr "X Дугме 2"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
+"Used to move a suitable spawn area of low land close to (0, 0).\n"
+"The default is suitable for mandelbrot sets, it needs to be edited for julia "
+"sets.\n"
+"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
+msgstr ""
+"(X,Y,Z) офÑет фрактала од центра Ñвета у мерној јединици 'Ñкала'.\n"
+"КориÑти Ñе за пребацивање Ñтартне позиције што ближе (0, 0).\n"
+"Подразумевани је добар за манделброт Ñетове, али мора Ñе намеÑтити за јулија "
+"Ñетове.\n"
+"Даљина је око -2 до 2. Помножити Ñа 'Ñкалом' да би Ñе добио офÑет у "
+"блоковима."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"0 = parallax occlusion with slope information (faster).\n"
+"1 = relief mapping (slower, more accurate)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "3D clouds"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "3D mode"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"3D support.\n"
+"Currently supported:\n"
+"- none: no 3d output.\n"
+"- anaglyph: cyan/magenta color 3d.\n"
+"- interlaced: odd/even line based polarisation screen support.\n"
+"- topbottom: split screen top/bottom.\n"
+"- sidebyside: split screen side by side.\n"
+"- pageflip: quadbuffer based 3d."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"A chosen map seed for a new map, leave empty for random.\n"
+"Will be overridden when creating a new world in the main menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "A message to be displayed to all clients when the server crashes."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "A message to be displayed to all clients when the server shuts down."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Absolute limit of emerge queues"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Acceleration in air"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Management interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifier interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Active block range"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Active object send range"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Address to connect to.\n"
+"Leave this blank to start a local server.\n"
+"Note that the address field in the main menu overrides this setting."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
+"screens."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
+"This setting is for the client only and is ignored by the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Advanced"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Altitude Chill"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Always fly and fast"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Ambient occlusion gamma"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Amplifies the valleys"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Anisotropic filtering"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Announce server"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Announce to this serverlist.\n"
+"If you want to announce your ipv6 address, use serverlist_url = v6.servers."
+"minetest.net."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Approximate (X,Y,Z) scale of fractal in nodes."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Ask to reconnect after crash"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Automaticaly report to the serverlist."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Backward key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Base terrain height"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Basic"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Basic Privileges"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Bilinear filtering"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Bind address"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Bits per pixel (aka color depth) in fullscreen mode."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Build inside player"
+msgstr "Градња унутар играча"
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Bumpmapping"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Camera smoothing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Camera smoothing in cinematic mode"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Camera update toggle key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Cave noise #1"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Cave noise #2"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Cave width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Caves and tunnels form at the intersection of the two noises"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Chat key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Chat toggle key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команда"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Choice of 18 fractals from 9 formulas.\n"
+"1 = 4D \"Roundy\" mandelbrot set.\n"
+"2 = 4D \"Roundy\" julia set.\n"
+"3 = 4D \"Squarry\" mandelbrot set.\n"
+"4 = 4D \"Squarry\" julia set.\n"
+"5 = 4D \"Mandy Cousin\" mandelbrot set.\n"
+"6 = 4D \"Mandy Cousin\" julia set.\n"
+"7 = 4D \"Variation\" mandelbrot set.\n"
+"8 = 4D \"Variation\" julia set.\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n"
+"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n"
+"11 = 3D \"Christmas Tree\" mandelbrot set.\n"
+"12 = 3D \"Christmas Tree\" julia set.\n"
+"13 = 3D \"Mandelbulb\" mandelbrot set.\n"
+"14 = 3D \"Mandelbulb\" julia set.\n"
+"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n"
+"16 = 3D \"Cosine Mandelbulb\" julia set.\n"
+"17 = 4D \"Mandelbulb\" mandelbrot set.\n"
+"18 = 4D \"Mandelbulb\" julia set."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Chunk size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Cinematic mode"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Cinematic mode key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Clean transparent textures"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Client and Server"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Climbing speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Cloud height"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Cloud radius"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Clouds"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Clouds are a client side effect."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Clouds in menu"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Colored fog"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Command key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Connect glass"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Connect to external media server"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Connects glass if supported by node."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Console alpha"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Console color"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Console key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Continuous forward"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Continuous forward movement (only used for testing)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Controls"
+msgstr "Контроле"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Controls length of day/night cycle.\n"
+"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
+"unchanged."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Controls size of deserts and beaches in Mapgen v6.\n"
+"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Controls steepness/depth of lake depressions."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Controls steepness/height of hills."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Controls width of tunnels, a smaller value creates wider tunnels."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Crash message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Creates unpredictable lava features in caves.\n"
+"These can make mining difficult. Zero disables them. (0-10)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Creates unpredictable water features in caves.\n"
+"These can make mining difficult. Zero disables them. (0-10)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair alpha"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair alpha (opaqueness, between 0 and 255)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair color"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair color (R,G,B)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Crouch speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "DPI"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Damage"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Debug info toggle key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Debug log level"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Dedicated server step"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Default acceleration"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Default game"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Default game when creating a new world.\n"
+"This will be overridden when creating a world from the main menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Default password"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Default privileges"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Default timeout for cURL, stated in milliseconds.\n"
+"Only has an effect if compiled with cURL."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Defines sampling step of texture.\n"
+"A higher value results in smoother normal maps."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Deprecated Lua API handling"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Depth below which you'll find large caves."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Depth below which you'll find massive caves."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Descending speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Description of server, to be displayed when players join and in the "
+"serverlist."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Desynchronize block animation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Disable anticheat"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Disallow empty passwords"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Domain name of server, to be displayed in the serverlist."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Double tap jump for fly"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Double-tapping the jump key toggles fly mode."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Drop item key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Dump the mapgen debug infos."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enable VBO"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enable mod security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enable players getting damage and dying."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enable random user input (only used for testing)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable to disallow old clients from connecting.\n"
+"Older clients are compatible in the sense that they will not crash when "
+"connecting\n"
+"to new servers, but they may not support all new features that you are "
+"expecting."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable usage of remote media server (if provided by server).\n"
+"Remote servers offer a significantly faster way to download media (e.g. "
+"textures)\n"
+"when connecting to the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable/disable running an IPv6 server. An IPv6 server may be restricted\n"
+"to IPv6 clients, depending on system configuration.\n"
+"Ignored if bind_address is set."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enables animation of inventory items."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enables bumpmapping for textures. Normalmaps need to be supplied by the "
+"texture pack\n"
+"or need to be auto-generated.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enables caching of facedir rotated meshes."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enables filmic tone mapping"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Enables minimap."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enables on the fly normalmap generation (Emboss effect).\n"
+"Requires bumpmapping to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enables parallax occlusion mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Experimental option, might cause visible spaces between blocks\n"
+"when set to higher number than 0."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "FPS in pause menu"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "FSAA"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fall bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font shadow"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font shadow alpha"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fast key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fast mode acceleration"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fast mode speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fast movement"
+msgstr "Брзо кретање"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Fast movement (via use key).\n"
+"This requires the \"fast\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Field of view"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Field of view in degrees."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Играч је у могућноÑти д лети без утицаја гравитације.\n"
+"Ово захтева \"fly\" привилегију на Ñерверима."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"File in client/serverlist/ that contains your favorite servers displayed in "
+"the Multiplayer Tab."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Filler Depth"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Filmic tone mapping"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Filtered textures can blend RGB values with fully-transparent neighbors,\n"
+"which PNG optimizers usually discard, sometimes resulting in a dark or\n"
+"light edge to transparent textures. Apply this filter to clean that up\n"
+"at texture load time."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Filtering"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fixed map seed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fly key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Flying"
+msgstr "Летење"
+
+#: src/settings_translation_file.cpp
+msgid "Fog"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fog toggle key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Font path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow alpha"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow alpha (opaqueness, between 0 and 255)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow offset, if 0 then shadow will not be drawn."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Font size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Format of screenshots."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Forward key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Freetype fonts"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"From how far blocks are generated for clients, stated in mapblocks (16 "
+"nodes)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"From how far clients know about objects, stated in mapblocks (16 nodes)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Full screen"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Full screen BPP"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Fullscreen mode."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "GUI scaling"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "GUI scaling filter"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "GUI scaling filter txr2img"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Gamma"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Generate normalmaps"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Global map generation attributes.\n"
+"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
+"and junglegrass, in all other mapgens this flag controls all decorations.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Graphics"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Gravity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HTTP Mods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "HUD toggle key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Handling for deprecated lua api calls:\n"
+"- legacy: (try to) mimic old behaviour (default for release).\n"
+"- log: mimic and log backtrace of deprecated call (default for debug).\n"
+"- error: abort on usage of deprecated call (suggested for mod developers)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Height on which clouds are appearing."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "High-precision FPU"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Homepage of server, to be displayed in the serverlist."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "How deep to make rivers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"How large area of blocks are subject to the active block stuff, stated in "
+"mapblocks (16 nodes).\n"
+"In active blocks objects are loaded and ABMs run."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"How much the server will wait before unloading unused mapblocks.\n"
+"Higher value is smoother, but will use more RAM."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "How wide to make rivers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "IPv6"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "IPv6 server"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "IPv6 support."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If FPS would go higher than this, limit it by sleeping\n"
+"to not waste CPU power for no benefit."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If disabled \"use\" key is used to fly fast if both fly and fast mode are "
+"enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled together with fly mode, player is able to fly through solid "
+"nodes.\n"
+"This requires the \"noclip\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
+"and descending."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, actions are recorded for rollback.\n"
+"This option is only read when server starts."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "If enabled, disable cheat prevention in multiplayer."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, invalid world data won't cause the server to shut down.\n"
+"Only enable this if you know what you are doing."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "If enabled, new players cannot join with an empty password."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, you can place blocks at the position (feet + eye level) where "
+"you stand.\n"
+"This is helpful when working with nodeboxes in small areas."
+msgstr ""
+"Ðко је укључено, можете Ñтављати блокове унутар позиције где Ñтојите.\n"
+"Ово је кориÑно при раду Ñа nodebox-евима у малим меÑтима."
+
+#: src/settings_translation_file.cpp
+msgid "If this is set, players will always (re)spawn at the given position."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Ignore world errors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "In-Game"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "In-game chat console background color (R,G,B)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Interval of saving important changes in the world, stated in seconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Interval of sending time of day to clients."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Inventory items animations"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Inventory key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Invert mouse"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Invert vertical mouse movement."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Item entity TTL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Iterations of the recursive function.\n"
+"Controls the amount of fine detail."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: W component of hypercomplex constant determining julia "
+"shape.\n"
+"Has no effect on 3D fractals.\n"
+"Range roughly -2 to 2."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: X component of hypercomplex constant determining julia "
+"shape.\n"
+"Range roughly -2 to 2."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: Y component of hypercomplex constant determining julia "
+"shape.\n"
+"Range roughly -2 to 2."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: Z component of hypercomplex constant determining julia "
+"shape.\n"
+"Range roughly -2 to 2."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Jump key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Jumping speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for decreasing the viewing range.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for dropping the currently selected item.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for increasing the viewing range.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for jumping.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving fast in fast mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player backward.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player forward.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player left.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player right.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the chat console.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the chat window to type commands.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the chat window.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the inventory.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for printing debug stacks. Used for development.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for sneaking.\n"
+"Also used for climbing down and descending in water if aux1_descends is "
+"disabled.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for switching between first- and third-person camera.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for taking screenshots.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling cinematic mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling display of minimap.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling fast mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling flying.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling noclip mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the camera update. Only used for development\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of debug info.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the HUD.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the chat.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the fog.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the profiler. Used for development.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling unlimited view range.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Key use for climbing/descending"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Language"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Large cave depth"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Lava Features"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Leaves style"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Leaves style:\n"
+"- Fancy: all faces visible\n"
+"- Simple: only outer faces, if defined special_tiles are used\n"
+"- Opaque: disable transparency"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Left key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Length of a server tick and the interval at which objects are generally "
+"updated over network."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Length of time between ABM execution cycles"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Length of time between NodeTimer execution cycles"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Level of logging to be written to debug.txt:\n"
+"- <nothing> (no logging)\n"
+"- none (messages with no level)\n"
+"- error\n"
+"- warning\n"
+"- action\n"
+"- info\n"
+"- verbose"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Limit of emerge queues on disk"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Limit of emerge queues to generate"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Limits number of parallel HTTP requests. Affects:\n"
+"- Media fetch if server uses remote_media setting.\n"
+"- Serverlist download and server announcement.\n"
+"- Downloads performed by main menu (e.g. mod manager).\n"
+"Only has an effect if compiled with cURL."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Liquid fluidity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Liquid fluidity smoothing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Liquid loop max"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Liquid queue purge time"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Liquid sink"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Liquid update interval in seconds."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Liquid update tick"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Main menu game manager"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Main menu mod manager"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Main menu script"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Map directory"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen Valleys.\n"
+"'altitude_chill' makes higher elevations colder, which may cause biome "
+"issues.\n"
+"'humid_rivers' modifies the humidity around rivers and in areas where water "
+"would tend to pool,\n"
+"it may interfere with delicately adjusted biomes.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen flat.\n"
+"Occasional lakes and hills can be added to the flat world.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen v6.\n"
+"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
+"flag is ignored.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen v7.\n"
+"The 'ridges' flag controls the rivers.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Map generation limit"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Map save interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapblock limit"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapblock unload timeout"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen Valleys"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen biome heat noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen biome humidity blend noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen biome humidity noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen debug"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flags"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat cave width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat cave1 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat cave2 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat filler depth noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat flags"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat ground level"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat hill steepness"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat hill threshold"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat lake steepness"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat lake threshold"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat large cave depth"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat terrain noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal cave width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal cave1 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal cave2 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal filler depth noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal fractal"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal iterations"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia w"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia x"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia y"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia z"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal offset"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal scale"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal seabed noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal slice w"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen heat blend noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen name"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 cave width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 cave1 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 cave2 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 factor noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 filler depth noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 height noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 apple trees noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 beach frequency"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 beach noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 biome noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 cave noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 desert frequency"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 flags"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 height select noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 humidity noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 mud noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 steepness noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 terrain altitude noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 terrain base noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 trees noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 cave width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 cave1 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 cave2 noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 filler depth noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 flags"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 height select noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 mount height noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 mountain noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 ridge noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 ridge water noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 terrain altitude noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 terrain base noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 terrain persistation noise parameters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Massive cave depth"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Massive cave noise"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Massive caves form here."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Max block generate distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Max block send distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Max liquids processed per step."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Max. clearobjects extra blocks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Max. packets per iteration"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum FPS"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum FPS when game is paused."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum forceloaded blocks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum hotbar width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that can be queued for loading."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of blocks to be queued that are to be generated.\n"
+"Set to blank for an appropriate amount to be chosen automatically."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of blocks to be queued that are to be loaded from file.\n"
+"Set to blank for an appropriate amount to be chosen automatically."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of forceloaded mapblocks."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of mapblocks for client to be kept in memory.\n"
+"Set to -1 for unlimited amount."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of packets sent per send step, if you have a slow connection\n"
+"try reducing it, but don't reduce it to a number below double of targeted\n"
+"client number."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of players that can connect simultaneously."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of statically stored objects in a block."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum proportion of current window to be used for hotbar.\n"
+"Useful if there's something to be displayed right or left of hotbar."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum simultaneous block sends per client"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum simultaneous block sends total"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum users"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Menus"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mesh cache"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Message of the day"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Message of the day displayed to players connecting."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Method used to highlight selected object."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Minimap"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Minimap key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Minimap scan height"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Minimum texture size for filters"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mipmapping"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Modstore details URL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Modstore download URL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Modstore mods list URL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Monospace font path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Monospace font size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mouse sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Mouse sensitivity multiplier."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Multiplier for fall bobbing.\n"
+"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Multiplier for view bobbing.\n"
+"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Name of map generator to be used when creating a new world.\n"
+"Creating a world in the main menu will override this."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Name of the player.\n"
+"When running a server, clients connecting with this name are admins.\n"
+"When starting from the main menu, this is overridden."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Name of the server, to be displayed when players join and in the serverlist."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Network"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Network port to listen (UDP).\n"
+"This value will be overridden when starting from the main menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "New users need to input this password."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Noclip"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Noclip key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Node highlighting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "NodeTimer interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Noise parameters for biome API temperature, humidity and biome blend."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Noises"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Normalmaps sampling"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Normalmaps strength"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Number of emerge threads"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Number of emerge threads to use. Make this field blank, or increase this "
+"number\n"
+"to use multiple threads. On multiprocessor systems, this will improve mapgen "
+"speed greatly\n"
+"at the cost of slightly buggy caves."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Number of extra blocks that can be loaded by /clearobjects at once.\n"
+"This is a trade-off between sqlite transaction overhead and\n"
+"memory consumption (4096=100MB, as a rule of thumb)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Number of parallax occlusion iterations."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Overall bias of parallax occlusion effect, usually scale/2."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Overall scale of parallax occlusion effect."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion Scale"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion bias"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion iterations"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion mode"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion strength"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Path to TrueTypeFont or bitmap."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Path to save screenshots at."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Path to texture directory. All textures are first searched from here."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Physics"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Player is able to fly without being affected by gravity.\n"
+"This requires the \"fly\" privilege on the server."
+msgstr ""
+"Играч је у могућноÑти д лети без утицаја гравитације.\n"
+"Ово захтева \"fly\" привилегију на Ñерверима."
+
+#: src/settings_translation_file.cpp
+msgid "Player name"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Player transfer distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Player versus Player"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Port to connect to (UDP).\n"
+"Note that the port field in the main menu overrides this setting."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Prevent mods from doing insecure things like running shell commands."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Privileges that players with basic_privs can grant"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Profiler toggle key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Profiling"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Radius of cloud area stated in number of 64 node cloud squares.\n"
+"Values larger than 26 will start to produce sharp cutoffs at cloud area "
+"corners."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Raises terrain to make valleys around the rivers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Random input"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Range select key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Remote media"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Remote port"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Replaces the default main menu with a custom one."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Одабери локацију"
+
+#: src/settings_translation_file.cpp
+msgid "Right key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Rightclick repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "River Depth"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "River Noise"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "River Size"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "River noise -- rivers occur close to zero"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Rollback recording"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Round minimap"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Save the map received by the client on disk."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Saving map received from server"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Scale gui by a user specified value.\n"
+"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n"
+"This will smooth over some of the rough edges, and blend\n"
+"pixels when scaling down, at the cost of blurring some\n"
+"edge pixels when images are scaled by non-integer sizes."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Screen height"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Screen width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot folder"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot quality"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Screenshot quality. Only used for JPEG format.\n"
+"1 means worst quality; 100 means best quality.\n"
+"Use 0 for default quality."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Security"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Selection box border color (R,G,B)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Selection box color"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Selection box width"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Server / Singleplayer"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Server URL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Server address"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Server description"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Server name"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Server port"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Serverlist URL"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Serverlist file"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the language. Leave empty to use the system language.\n"
+"A restart is required after changing this."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true enables waving leaves.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true enables waving plants.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true enables waving water.\n"
+"Requires shaders to be enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Shaders allow advanced visual effects and may increase performance on some "
+"video cards.\n"
+"Thy only work with the OpenGL video backend."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shape of the minimap. Enabled = round, disabled = square."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Show debug info"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Show entity selection boxes"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Shutdown message"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Size of chunks to be generated at once by mapgen, stated in mapblocks (16 "
+"nodes)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Slope and fill work together to modify the heights"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Smooth lighting"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
+"Useful for recording videos."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Smooths rotation of camera. 0 to disable."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Sneak key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Sound"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Specifies URL from which client fetches media instead of using UDP.\n"
+"$filename should be accessible from $remote_media$filename via cURL\n"
+"(obviously, remote_media should end with a slash).\n"
+"Files that are not present will be fetched the usual way."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Static spawnpoint"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Strength of generated normalmaps."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Strength of parallax."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Strict protocol checking"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Support older servers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Synchronous SQLite"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Terrain Height"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Terrain noise threshold for hills.\n"
+"Controls proportion of world area covered by hills.\n"
+"Adjust towards 0.0 for a larger proportion."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Terrain noise threshold for lakes.\n"
+"Controls proportion of world area covered by lakes.\n"
+"Adjust towards 0.0 for a larger proportion."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Texture path"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "The altitude at which temperature drops by 20C"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "The depth of dirt or other filler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "The network interface that the server listens on."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The privileges that new users automatically get.\n"
+"See /privs in game for a full list on your server and mod configuration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "The rendering back-end for Irrlicht."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The strength (darkness) of node ambient-occlusion shading.\n"
+"Lower is darker, Higher is lighter. The valid range of values for this\n"
+"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
+"set to the nearest valid value."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time (in seconds) that the liquids queue may grow beyond processing\n"
+"capacity until an attempt is made to decrease its size by dumping old queue\n"
+"items. A value of 0 disables the functionality."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated right clicks when holding the "
+"right mouse button."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "This font will be used for certain languages."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Time in between active block management cycles"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Time in seconds for item entity (dropped items) to live.\n"
+"Setting it to -1 disables the feature."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Time send interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Time speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Timeout for client to remove unused map data from memory."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"To reduce lag, block transfers are slowed down when a player is building "
+"something.\n"
+"This determines how long they are slowed down after placing or removing a "
+"node."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Toggle camera mode key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Tooltip delay"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Trilinear filtering"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"True = 256\n"
+"False = 128\n"
+"Useable to make minimap smoother on slower machines."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Trusted mods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "URL to the server list displayed in the Multiplayer Tab."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Unlimited player transfer distance"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Unload unused server data"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Use 3D cloud look instead of flat."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Use a cloud animation for the main menu background."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Use anisotropic filtering when viewing at textures from an angle."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Use bilinear filtering when scaling textures."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Use key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Use mip mapping to scale textures. May slightly increase performance."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Use trilinear filtering when scaling textures."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "V-Sync"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "VBO"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Valley Depth"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Valley Fill"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Valley Profile"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Valley Slope"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Valleys C Flags"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Vertical screen synchronization."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Video driver"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "View bobbing"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"View distance in nodes.\n"
+"Min = 20"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "View range decrease key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "View range increase key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Viewing range"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Volume"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"W co-ordinate of the generated 3D slice of a 4D fractal.\n"
+"Determines which 3D slice of the 4D shape is generated.\n"
+"Has no effect on 3D fractals.\n"
+"Range roughly -2 to 2."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Walking speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Water Features"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Water level"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Water surface level of the world."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Waving Nodes"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Waving leaves"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Waving plants"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Waving water"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Waving water height"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Waving water length"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Waving water speed"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"When gui_scaling_filter is true, all GUI images need to be\n"
+"filtered in software, but some images are generated directly\n"
+"to hardware (e.g. render-to-texture for nodes in inventory)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"When gui_scaling_filter_txr2img is true, copy those images\n"
+"from hardware to software for scaling. When false, fall back\n"
+"to the old scaling method, for video drivers that don't\n"
+"properly support downloading textures back from hardware."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n"
+"can be blurred, so automatically upscale them with nearest-neighbor\n"
+"interpolation to preserve crisp pixels. This sets the minimum texture size\n"
+"for the upscaled textures; higher values look sharper, but require more\n"
+"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n"
+"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n"
+"enabled."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Where the map generator stops.\n"
+"Please note:\n"
+"- Limited to 31000 (setting above has no effect)\n"
+"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n"
+"- Those groups have an offset of -32, -32 nodes from the origin.\n"
+"- Only groups which are within the map_generation_limit are generated"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether freetype fonts are used, requires freetype support to be compiled in."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Whether node texture animations should be desynchronized per mapblock."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether players are shown to clients without any range limit.\n"
+"Deprecated, use the setting player_transfer_distance instead."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Whether to allow players to damage and kill each other."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether to ask clients to reconnect after a (Lua) crash.\n"
+"Set this to true if your server is set up to restart automatically."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Whether to fog out the end of the visible area."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether to show the client debug info (has the same effect as hitting F5)."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether to support older servers before protocol version 25.\n"
+"Enable if you want to connect to 0.4.12 servers and before.\n"
+"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
+"Disabling this option will protect your password better."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Width component of the initial window size."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Width of the selectionbox's lines around nodes."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"World directory (everything in the world is stored here).\n"
+"Not needed if starting from the main menu."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Y of flat ground."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Y of upper limit of large pseudorandom caves."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "cURL file download timeout"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "cURL parallel limit"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "cURL timeout"
+msgstr ""
diff --git a/po/sw/minetest.po b/po/sw/minetest.po
new file mode 100644
index 000000000..abf0da24d
--- /dev/null
+++ b/po/sw/minetest.po
@@ -0,0 +1,4657 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Minetest Translate\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-03 05:13+0000\n"
+"Last-Translator: Eidy <JulianBiddle@practicalcybernetics.com>\n"
+"Language-Team: Swahili <https://hosted.weblate.org/projects/minetest/"
+"minetest/sw/>\n"
+"Language: sw\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 2.9-dev\n"
+
+#: builtin/fstk/ui.lua
+msgid "An error occured in a Lua script, such as a mod:"
+msgstr "Kosa limetokea katika hati Lua, kama vile Moduli na:"
+
+#: builtin/fstk/ui.lua
+msgid "An error occured:"
+msgstr "Kosa limetokea:"
+
+#: builtin/fstk/ui.lua
+msgid "Main menu"
+msgstr "Menyu kuu"
+
+#: builtin/fstk/ui.lua builtin/mainmenu/store.lua
+msgid "Ok"
+msgstr "Sawa kabisa"
+
+#: builtin/fstk/ui.lua
+msgid "Reconnect"
+msgstr "Unganisha upya"
+
+#: builtin/fstk/ui.lua
+msgid "The server has requested a reconnect:"
+msgstr "Seva imeomba na Unganisha upya:"
+
+#: builtin/mainmenu/common.lua src/game.cpp
+msgid "Loading..."
+msgstr "Inapakia..."
+
+#: builtin/mainmenu/common.lua
+msgid "Protocol version mismatch. "
+msgstr "Itifaki ya toleo haifanani."
+
+#: builtin/mainmenu/common.lua
+msgid "Server enforces protocol version $1. "
+msgstr "Seva anahimiza itifaki toleo $1."
+
+#: builtin/mainmenu/common.lua
+msgid "Server supports protocol versions between $1 and $2. "
+msgstr "Seva inasaidia matoleo ya itifaki kati ya $1 na $2."
+
+#: builtin/mainmenu/common.lua
+msgid "Try reenabling public serverlist and check your internet connection."
+msgstr "Jaribu reenabling serverlist umma na Kagua muunganisho wako wa tovuti."
+
+#: builtin/mainmenu/common.lua
+msgid "We only support protocol version $1."
+msgstr "Sisi tu mkono itifaki toleo la $1."
+
+#: builtin/mainmenu/common.lua
+msgid "We support protocol versions between version $1 and $2."
+msgstr "Tunaunga mkono matoleo ya itifaki kati ya toleo la $1 na $2."
+
+#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua
+#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/dlg_rename_modpack.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
+#: src/keycode.cpp
+msgid "Cancel"
+msgstr "Katisha"
+
+#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_mods.lua
+msgid "Depends:"
+msgstr "Inategemea:"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Disable MP"
+msgstr "Lemaza MP"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Enable MP"
+msgstr "Wezesha MP"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Enable all"
+msgstr "Wezesha yote"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid ""
+"Failed to enable mod \"$1\" as it contains disallowed characters. Only "
+"chararacters [a-z0-9_] are allowed."
+msgstr ""
+"Ilishindwa kuwezesha Moduli \"$1\" kama lina vibambo ilipopiga. Tu "
+"chararacters [a-z0-9_] wanaruhusiwa."
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Hide Game"
+msgstr "Ficha mchezo"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Hide mp content"
+msgstr "Ficha maudhui ya mbunge"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "Mod:"
+msgstr "Moduli:"
+
+#: builtin/mainmenu/dlg_config_world.lua
+#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
+msgid "Save"
+msgstr "Hifadhi"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "World:"
+msgstr "Ulimwengu:"
+
+#: builtin/mainmenu/dlg_config_world.lua
+msgid "enabled"
+msgstr "kuwezeshwa"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "A world named \"$1\" already exists"
+msgstr "Ulimwengu inayoitwa \"$1\" tayari ipo"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Create"
+msgstr "Kuunda"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Download a subgame, such as minetest_game, from minetest.net"
+msgstr "Pakua subgame, kama vile minetest_game, kutoka minetest.net"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Download one from minetest.net"
+msgstr "Pakua moja kutoka minetest.net"
+
+#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
+msgid "Game"
+msgstr "Mchezo"
+
+#: builtin/mainmenu/dlg_create_world.lua src/settings_translation_file.cpp
+msgid "Mapgen"
+msgstr "Mwandishi ramani"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "No worldname given or no game selected"
+msgstr "Hakuna worldname kupewa au mchezo hakuna iliyoteuliwa"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Seed"
+msgstr "Mbegu"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "Warning: The minimal development test is meant for developers."
+msgstr "Tahadhari: Mtihani wa maendeleo ndogo ni maana kwa watengenezaji."
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "World name"
+msgstr "Jina la ulimwengu"
+
+#: builtin/mainmenu/dlg_create_world.lua
+msgid "You have no subgames installed."
+msgstr "Una subgames hakuna imewekwa."
+
+#: builtin/mainmenu/dlg_delete_mod.lua
+msgid "Are you sure you want to delete \"$1\"?"
+msgstr "Una uhakika unataka kufuta \"$1\"?"
+
+#: builtin/mainmenu/dlg_delete_mod.lua builtin/mainmenu/dlg_delete_world.lua
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+#: src/keycode.cpp
+msgid "Delete"
+msgstr "Futa"
+
+#: builtin/mainmenu/dlg_delete_mod.lua
+msgid "Modmgr: failed to delete \"$1\""
+msgstr "Modmgr: imeshindwa kufuta \"$1\""
+
+#: builtin/mainmenu/dlg_delete_mod.lua
+msgid "Modmgr: invalid modpath \"$1\""
+msgstr "Modmgr: batili modpath \"$1\""
+
+#: builtin/mainmenu/dlg_delete_world.lua
+msgid "Delete World \"$1\"?"
+msgstr "Futa ulimwengu \"$1\"?"
+
+#: builtin/mainmenu/dlg_rename_modpack.lua src/keycode.cpp
+msgid "Accept"
+msgstr "Kukubali"
+
+#: builtin/mainmenu/dlg_rename_modpack.lua
+msgid "Rename Modpack:"
+msgstr "Ita jina jipya Modpack:"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "\"$1\" is not a valid flag."
+msgstr "\"$1\" si bendera halali."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "(No description of setting given)"
+msgstr "(Hakuna maelezo ya kuweka kupewa)"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "< Back to Settings page"
+msgstr ""
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Browse"
+msgstr "Vinjari"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Disabled"
+msgstr "Walemavu"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Edit"
+msgstr "Hariri"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Enabled"
+msgstr "Kuwezeshwa"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Format is 3 numbers separated by commas and inside brackets."
+msgstr "Umbizo ni namba 3 limegawanywa na mikato na ndani ya mabano."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid ""
+"Format: <offset>, <scale>, (<spreadX>, <spreadY>, <spreadZ>), <seed>, "
+"<octaves>, <persistence>"
+msgstr ""
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Games"
+msgstr "Michezo"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_mods.lua
+msgid "Mods"
+msgstr "Mods"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Optionally the lacunarity can be appended with a leading comma."
+msgstr "Hiari ya lacunarity unaweza umeongezewa na mkato kuongoza."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Please enter a comma seperated list of flags."
+msgstr "Tafadhali ingiza mkato seperated orodha ya bendera."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Please enter a valid integer."
+msgstr "Tafadhali ingiza namba kamili halali."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Please enter a valid number."
+msgstr "Tafadhali ingiza namba halali."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Possible values are: "
+msgstr "Thamani inayofaa ni:"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Restore Default"
+msgstr "Rejesha chaguo-msingi"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Select path"
+msgstr "Teua njia"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "Show technical names"
+msgstr "Onyesha majina ya kiufundi"
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "The value must be greater than $1."
+msgstr "Thamani lazima iwe kubwa kuliko $1."
+
+#: builtin/mainmenu/dlg_settings_advanced.lua
+msgid "The value must be lower than $1."
+msgstr "Thamani lazima iwe chini kuliko $1."
+
+#: builtin/mainmenu/modmgr.lua
+msgid ""
+"\n"
+"Install Mod: unsupported filetype \"$1\" or broken archive"
+msgstr ""
+"\n"
+"Sakinisha Moduli: filetype visivyotegemezwa \"$1\" au nyaraka kuvunjwa"
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Failed to install $1 to $2"
+msgstr "Imeshindwa kusakinisha $1 hadi $2"
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Install Mod: file: \"$1\""
+msgstr "Sakinisha Moduli: faili: \"$1\""
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Install Mod: unable to find real modname for: $1"
+msgstr "Sakinisha Moduli: haiwezi kupata modname halisi kwa: $1"
+
+#: builtin/mainmenu/modmgr.lua
+msgid "Install Mod: unable to find suitable foldername for modpack $1"
+msgstr ""
+"Sakinisha Moduli: haiwezi kupata foldername ya kufaa kwa ajili ya modpack $1"
+
+#: builtin/mainmenu/store.lua
+msgid "Close store"
+msgstr "Duka la karibu"
+
+#: builtin/mainmenu/store.lua
+msgid "Downloading $1, please wait..."
+msgstr "Inapakua $1, Tafadhali subiri..."
+
+#: builtin/mainmenu/store.lua
+msgid "Install"
+msgstr "Sakinisha"
+
+#: builtin/mainmenu/store.lua
+msgid "Page $1 of $2"
+msgstr "Ukurasa $1 ya $2"
+
+#: builtin/mainmenu/store.lua
+msgid "Rating"
+msgstr "Makadirio"
+
+#: builtin/mainmenu/store.lua
+msgid "Search"
+msgstr "Utafutaji"
+
+#: builtin/mainmenu/store.lua
+msgid "Shortname:"
+msgstr "Shortname:"
+
+#: builtin/mainmenu/store.lua
+msgid "Successfully installed:"
+msgstr "Imefanikiwa kusakinisha:"
+
+#: builtin/mainmenu/store.lua
+msgid "Unsorted"
+msgstr "Zisizochambuliwa"
+
+#: builtin/mainmenu/store.lua
+msgid "re-Install"
+msgstr "Sakinisha upya"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Active Contributors"
+msgstr "Wachangiaji amilifu"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Core Developers"
+msgstr "Watengenezaji wa msingi"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Credits"
+msgstr "Mikopo"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Previous Contributors"
+msgstr "Wachangiaji wa awali"
+
+#: builtin/mainmenu/tab_credits.lua
+msgid "Previous Core Developers"
+msgstr "Awali msingi watengenezaji"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Installed Mods:"
+msgstr "Mods zilizosakinishwa:"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Mod information:"
+msgstr "Taarifa Moduli:"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "No mod description available"
+msgstr "Hakuna maelezo Moduli inapatikana"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Rename"
+msgstr "Ita jina jipya"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Select Mod File:"
+msgstr "Teua faili ya Moduli:"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Uninstall selected mod"
+msgstr "Sakinusha Moduli teuliwa"
+
+#: builtin/mainmenu/tab_mods.lua
+msgid "Uninstall selected modpack"
+msgstr "Sakinusha modpack teuliwa"
+
+#: builtin/mainmenu/tab_multiplayer.lua
+msgid "Address / Port"
+msgstr "Kushughulikia / bandari"
+
+#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
+msgid "Client"
+msgstr "Mteja"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Connect"
+msgstr "Kuunganisha"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Creative mode"
+msgstr "Hali ya ubunifu"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Damage enabled"
+msgstr "Uharibifu kuwezeshwa"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Del. Favorite"
+msgstr "Del. kipendwa"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Favorite"
+msgstr "Kipendwa"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "Name / Password"
+msgstr "Jina / nenosiri"
+
+#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
+msgid "PvP enabled"
+msgstr "PvP kuwezeshwa"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Bind Address"
+msgstr "Kumfunga anwani"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "Configure"
+msgstr "Sanidi"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
+#: builtin/mainmenu/tab_singleplayer.lua
+msgid "Creative Mode"
+msgstr "Hali ya ubunifu"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
+#: builtin/mainmenu/tab_singleplayer.lua
+msgid "Enable Damage"
+msgstr "Wezesha uharibifu"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Name/Password"
+msgstr "Jina/nenosiri"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "New"
+msgstr "Mpya"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "No world created or selected!"
+msgstr "Duniani hakuna kuundwa au kuteuliwa!"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Port"
+msgstr "Bandari"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Public"
+msgstr "Umma"
+
+#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_singleplayer.lua
+msgid "Select World:"
+msgstr "Teua ulimwengu:"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Server"
+msgstr "Seva"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Server Port"
+msgstr "Kituo tarishi cha seva"
+
+#: builtin/mainmenu/tab_server.lua
+msgid "Start Game"
+msgstr "Anzisha mchezo"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "2x"
+msgstr "2 x"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "3D Clouds"
+msgstr "Mawingu ya 3D"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "4x"
+msgstr "4 x"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "8x"
+msgstr "8 x"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Advanced Settings"
+msgstr "Vipimo pevu"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Antialiasing:"
+msgstr "Antialiasing:"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Are you sure to reset your singleplayer world?"
+msgstr "Je, una hakika upya ulimwengu wako singleplayer?"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Bilinear Filter"
+msgstr "Kichujio bilinear"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Bump Mapping"
+msgstr "Mapema ramani"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Change keys"
+msgstr "Badilisha funguo"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Connected Glass"
+msgstr "Kioo kushikamana"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Fancy Leaves"
+msgstr "Majani ya dhana"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Mipmap"
+msgstr "Mipmap"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Mipmap + Aniso. Filter"
+msgstr "Mipmap + Aniso. Kichujio"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "No"
+msgstr "La"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "No Filter"
+msgstr "Kichujio hakuna"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "No Mipmap"
+msgstr "Hakuna Mipmap"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Node Highlighting"
+msgstr "Fundo udhulisho"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Node Outlining"
+msgstr "Fundo Ufupisho"
+
+#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
+msgid "None"
+msgstr "Hakuna"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Normal Mapping"
+msgstr "Ramani ya kawaida"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Opaque Leaves"
+msgstr "Majani opaque"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Opaque Water"
+msgstr "Maji opaque"
+
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Parallax Occlusion"
+msgstr "Parallax Occlusion"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Particles"
+msgstr "Chembe"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Weka upya singleplayer ulimwengu"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Settings"
+msgstr "Vipimo vya"
+
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Shaders"
+msgstr "Shaders"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Simple Leaves"
+msgstr "Rahisi majani"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Smooth Lighting"
+msgstr "Taa laini"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Texturing:"
+msgstr "Texturing:"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "To enable shaders the OpenGL driver needs to be used."
+msgstr "Ili kuwezesha shaders OpenGL ya kiendeshaji inahitaji kutumiwa."
+
+#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
+msgid "Tone Mapping"
+msgstr "Ramani ya toni"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Touchthreshold (px)"
+msgstr "Touchthreshold (px)"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Trilinear Filter"
+msgstr "Kichujio trilinear"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Waving Leaves"
+msgstr "Waving majani"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Waving Plants"
+msgstr "Waving mimea"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Waving Water"
+msgstr "Waving maji"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Yes"
+msgstr "Ndio"
+
+#: builtin/mainmenu/tab_simple_main.lua
+msgid "Config mods"
+msgstr "Mods Now"
+
+#: builtin/mainmenu/tab_simple_main.lua
+msgid "Main"
+msgstr "Kuu"
+
+#: builtin/mainmenu/tab_simple_main.lua
+msgid "Start Singleplayer"
+msgstr "Kuanza Singleplayer"
+
+#: builtin/mainmenu/tab_singleplayer.lua src/keycode.cpp
+msgid "Play"
+msgstr "Kucheza"
+
+#: builtin/mainmenu/tab_singleplayer.lua
+msgid "Singleplayer"
+msgstr "Singleplayer"
+
+#: builtin/mainmenu/tab_texturepacks.lua
+msgid "No information available"
+msgstr "Hakuna taarifa zilizopo"
+
+#: builtin/mainmenu/tab_texturepacks.lua
+msgid "Select texture pack:"
+msgstr "Chagua Kipeto cha unamu:"
+
+#: builtin/mainmenu/tab_texturepacks.lua
+msgid "Texturepacks"
+msgstr "Texturepacks"
+
+#: src/client.cpp
+msgid "Connection timed out."
+msgstr "Muunganisho limekatika."
+
+#: src/client.cpp
+msgid "Done!"
+msgstr "Kufanyika!"
+
+#: src/client.cpp
+msgid "Initializing nodes"
+msgstr "Inaanzilisha fundo"
+
+#: src/client.cpp
+msgid "Initializing nodes..."
+msgstr "Inaanzilisha fundo..."
+
+#: src/client.cpp
+msgid "Loading textures..."
+msgstr "Kupakia unamu..."
+
+#: src/client.cpp
+msgid "Rebuilding shaders..."
+msgstr "Kuijenga upya shaders..."
+
+#: src/client/clientlauncher.cpp
+msgid "Connection error (timed out?)"
+msgstr "Kosa la muunganisho (wakati muafaka?)"
+
+#: src/client/clientlauncher.cpp
+msgid "Could not find or load game \""
+msgstr "Haikuweza kupata wala kupakia mchezo\""
+
+#: src/client/clientlauncher.cpp
+msgid "Invalid gamespec."
+msgstr "Gamespec batili."
+
+#: src/client/clientlauncher.cpp
+msgid "Main Menu"
+msgstr "Menyu kuu"
+
+#: src/client/clientlauncher.cpp
+msgid "No world selected and no address provided. Nothing to do."
+msgstr ""
+"Duniani hakuna iliyoteuliwa na hakuna anwani iliyotolewa. Kitu cha kufanya."
+
+#: src/client/clientlauncher.cpp
+msgid "Player name too long."
+msgstr "Mchezaji jina refu."
+
+#: src/client/clientlauncher.cpp
+msgid "Provided world path doesn't exist: "
+msgstr "Njia ya dunia iliyotolewa haipo:"
+
+#: src/fontengine.cpp
+msgid "needs_fallback_font"
+msgstr "no"
+
+#: src/game.cpp
+msgid ""
+"\n"
+"Check debug.txt for details."
+msgstr ""
+"\n"
+"Angalia debug.txt kwa maelezo."
+
+#: src/game.cpp
+msgid "Change Keys"
+msgstr "Badilisha funguo"
+
+#: src/game.cpp
+msgid "Change Password"
+msgstr "Badilisha nywila"
+
+#: src/game.cpp
+msgid "Connecting to server..."
+msgstr "Inaunganisha seva..."
+
+#: src/game.cpp
+msgid "Continue"
+msgstr "Kuendelea"
+
+#: src/game.cpp
+msgid "Creating client..."
+msgstr "Inaunda mteja..."
+
+#: src/game.cpp
+msgid "Creating server..."
+msgstr "Inaunda seva..."
+
+#: src/game.cpp
+msgid ""
+"Default Controls:\n"
+"- WASD: move\n"
+"- Space: jump/climb\n"
+"- Shift: sneak/go down\n"
+"- Q: drop item\n"
+"- I: inventory\n"
+"- Mouse: turn/look\n"
+"- Mouse left: dig/punch\n"
+"- Mouse right: place/use\n"
+"- Mouse wheel: select item\n"
+"- T: chat\n"
+msgstr ""
+"Vidhibiti vya chaguo-msingi:\n"
+"-WASD: hoja\n"
+"- nafasi: kuruka/kupanda\n"
+"- Hamisha:taarifa/kwenda chini\n"
+"- q: tone kipengee\n"
+"- nikasema hesabu\n"
+"- kipanya: kugeuka/kuangalia\n"
+"- kipanya kushoto: kuchimba/punch\n"
+"- kipanya kulia: mahali/matumizi\n"
+"- kipanya gurudumu: Teua kipengee\n"
+"- T: mazungumzo\n"
+
+#: src/game.cpp
+msgid ""
+"Default Controls:\n"
+"No menu visible:\n"
+"- single tap: button activate\n"
+"- double tap: place/use\n"
+"- slide finger: look around\n"
+"Menu/Inventory visible:\n"
+"- double tap (outside):\n"
+" -->close\n"
+"- touch stack, touch slot:\n"
+" --> move stack\n"
+"- touch&drag, tap 2nd finger\n"
+" --> place single item to slot\n"
+msgstr ""
+"Vidhibiti vya chaguo-msingi:\n"
+"Hakuna Menyu kuonekana:\n"
+"- bomba moja: kitufe kuamilisha\n"
+"- mara mbili bomba: mahali/matumizi\n"
+"- slaidi kidole: kuangalia kote\n"
+"Menyu/hesabu dhahiri:\n"
+"- mara mbili bomba (nje):--> Funga - kugusa \n"
+"mpororo, kugusa mpenyo:--> hoja mpororo\n"
+"- kugusa & buruta, bomba kidole 2--> \n"
+"kipengee kimoja mahali kwa yanayopangwa\n"
+
+#: src/game.cpp
+msgid "Exit to Menu"
+msgstr "Toka kwenye menyu"
+
+#: src/game.cpp
+msgid "Exit to OS"
+msgstr "Toka kwa OS"
+
+#: src/game.cpp
+msgid "Item definitions..."
+msgstr "Fasili ya kipengele..."
+
+#: src/game.cpp
+msgid "KiB/s"
+msgstr "Kibu/s"
+
+#: src/game.cpp
+msgid "Media..."
+msgstr "Vyombo vya habari..."
+
+#: src/game.cpp
+msgid "MiB/s"
+msgstr "MiB/s"
+
+#: src/game.cpp
+msgid "Node definitions..."
+msgstr "Fundo Fasili..."
+
+#: src/game.cpp
+msgid "Resolving address..."
+msgstr "Kusuluhisha anwani..."
+
+#: src/game.cpp
+msgid "Respawn"
+msgstr "Respawn"
+
+#: src/game.cpp
+msgid "Shutting down..."
+msgstr "Inazima..."
+
+#: src/game.cpp
+msgid "Sound Volume"
+msgstr "Kiwango cha sauti"
+
+#: src/game.cpp
+msgid "You died."
+msgstr "Alikufa."
+
+#: src/game.cpp src/guiFormSpecMenu.cpp
+msgid "ok"
+msgstr "Sawa kabisa"
+
+#: src/guiFormSpecMenu.cpp
+msgid "Enter "
+msgstr "Ingiza"
+
+#: src/guiFormSpecMenu.cpp
+msgid "Proceed"
+msgstr "Kuendelea"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "\"Use\" = climb down"
+msgstr "\"Matumizi\" = kupanda chini"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Backward"
+msgstr "Nyuma"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Chat"
+msgstr "Kuzungumza"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Command"
+msgstr "Amri"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Console"
+msgstr "Kiweko"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Double tap \"jump\" to toggle fly"
+msgstr "Mara mbili bomba \"Ruka\" hadi Togo kuruka"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Drop"
+msgstr "Achia"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Forward"
+msgstr "Mbele"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Inventory"
+msgstr "Hesabu"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Jump"
+msgstr "Kuruka"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Key already in use"
+msgstr "Muhimu tayari katika matumizi"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Keybindings. (If this menu screws up, remove stuff from minetest.conf)"
+msgstr "Keybindings. (Kama Menyu hii screws, Ondoa vitu kutoka minetest.conf)"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Left"
+msgstr "Kushoto"
+
+#: src/guiKeyChangeMenu.cpp src/settings_translation_file.cpp
+msgid "Print stacks"
+msgstr "Chapisha mipororo"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Range select"
+msgstr "Teua masafa"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Right"
+msgstr "Kulia"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Sneak"
+msgstr "Taarifa"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle Cinematic"
+msgstr "Togoa Cinematic"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle fast"
+msgstr "Togoa haraka"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle fly"
+msgstr "Togoa kuruka"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Toggle noclip"
+msgstr "Togoa noclip"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "Use"
+msgstr "Matumizi"
+
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Kuza"
+
+#: src/guiKeyChangeMenu.cpp
+msgid "press key"
+msgstr "Bonyeza Kibonye"
+
+#: src/guiPasswordChange.cpp
+msgid "Change"
+msgstr "Mabadiliko"
+
+#: src/guiPasswordChange.cpp
+msgid "Confirm Password"
+msgstr "Thibitisha nywila"
+
+#: src/guiPasswordChange.cpp
+msgid "New Password"
+msgstr "Nywila mpya"
+
+#: src/guiPasswordChange.cpp
+msgid "Old Password"
+msgstr "Nywila ya zamani"
+
+#: src/guiPasswordChange.cpp
+msgid "Passwords do not match!"
+msgstr "MaNenotambulishi hayaoani!"
+
+#: src/guiVolumeChange.cpp
+msgid "Exit"
+msgstr "Toka"
+
+#: src/guiVolumeChange.cpp
+msgid "Sound Volume: "
+msgstr "Kiwango sauti:"
+
+#: src/keycode.cpp
+msgid "Apps"
+msgstr "Programu"
+
+#: src/keycode.cpp
+msgid "Attn"
+msgstr "Attn"
+
+#: src/keycode.cpp
+msgid "Back"
+msgstr "Nyuma"
+
+#: src/keycode.cpp
+msgid "Capital"
+msgstr "Mji mkuu"
+
+#: src/keycode.cpp
+msgid "Clear"
+msgstr "Wazi"
+
+#: src/keycode.cpp
+msgid "Comma"
+msgstr "Mkato"
+
+#: src/keycode.cpp
+msgid "Control"
+msgstr "Udhibiti"
+
+#: src/keycode.cpp
+msgid "Convert"
+msgstr "Geuza"
+
+#: src/keycode.cpp
+msgid "CrSel"
+msgstr "CrSel"
+
+#: src/keycode.cpp
+msgid "Down"
+msgstr "Chini"
+
+#: src/keycode.cpp
+msgid "End"
+msgstr "Mwisho"
+
+#: src/keycode.cpp
+msgid "Erase OEF"
+msgstr "Futa OEF"
+
+#: src/keycode.cpp
+msgid "Escape"
+msgstr "Kutoroka"
+
+#: src/keycode.cpp
+msgid "ExSel"
+msgstr "ExSel"
+
+#: src/keycode.cpp
+msgid "Execute"
+msgstr "Kutekeleza"
+
+#: src/keycode.cpp
+msgid "Final"
+msgstr "Mwisho"
+
+#: src/keycode.cpp
+msgid "Help"
+msgstr "Msaada"
+
+#: src/keycode.cpp
+msgid "Home"
+msgstr "Nyumbani"
+
+#: src/keycode.cpp
+msgid "Insert"
+msgstr "Chomeka"
+
+#: src/keycode.cpp
+msgid "Junja"
+msgstr "Junja"
+
+#: src/keycode.cpp
+msgid "Kana"
+msgstr "Kana"
+
+#: src/keycode.cpp
+msgid "Kanji"
+msgstr "KanJi"
+
+#: src/keycode.cpp
+msgid "Left Button"
+msgstr "Kitufe kushoto"
+
+#: src/keycode.cpp
+msgid "Left Control"
+msgstr "Udhibiti wa kushoto"
+
+#: src/keycode.cpp
+msgid "Left Menu"
+msgstr "Menyu ya kushoto"
+
+#: src/keycode.cpp
+msgid "Left Shift"
+msgstr "Kisogezi kushoto"
+
+#: src/keycode.cpp
+msgid "Left Windows"
+msgstr "Windows kushoto"
+
+#: src/keycode.cpp
+msgid "Menu"
+msgstr "Menyu"
+
+#: src/keycode.cpp
+msgid "Middle Button"
+msgstr "Kitufe kati"
+
+#: src/keycode.cpp
+msgid "Minus"
+msgstr "Alama ya kutoa"
+
+#: src/keycode.cpp
+msgid "Mode Change"
+msgstr "Mabadiliko ya hali ya"
+
+#: src/keycode.cpp
+msgid "Next"
+msgstr "Ijayo"
+
+#: src/keycode.cpp
+msgid "Nonconvert"
+msgstr "Nonconvert"
+
+#: src/keycode.cpp
+msgid "Num Lock"
+msgstr "Num Lock"
+
+#: src/keycode.cpp
+msgid "Numpad *"
+msgstr "Kinanda *"
+
+#: src/keycode.cpp
+msgid "Numpad +"
+msgstr "Kinanda +"
+
+#: src/keycode.cpp
+msgid "Numpad -"
+msgstr "Numpad-"
+
+#: src/keycode.cpp
+msgid "Numpad /"
+msgstr "Kinanda /"
+
+#: src/keycode.cpp
+msgid "Numpad 0"
+msgstr "Kinanda 0"
+
+#: src/keycode.cpp
+msgid "Numpad 1"
+msgstr "Kinanda 1"
+
+#: src/keycode.cpp
+msgid "Numpad 2"
+msgstr "Kinanda 2"
+
+#: src/keycode.cpp
+msgid "Numpad 3"
+msgstr "Kinanda 3"
+
+#: src/keycode.cpp
+msgid "Numpad 4"
+msgstr "Kinanda 4"
+
+#: src/keycode.cpp
+msgid "Numpad 5"
+msgstr "Kinanda 5"
+
+#: src/keycode.cpp
+msgid "Numpad 6"
+msgstr "Kinanda 6"
+
+#: src/keycode.cpp
+msgid "Numpad 7"
+msgstr "Kinanda 7"
+
+#: src/keycode.cpp
+msgid "Numpad 8"
+msgstr "Kinanda 8"
+
+#: src/keycode.cpp
+msgid "Numpad 9"
+msgstr "Kinanda 9"
+
+#: src/keycode.cpp
+msgid "OEM Clear"
+msgstr "Wazi ya OEM"
+
+#: src/keycode.cpp
+msgid "PA1"
+msgstr "PA1"
+
+#: src/keycode.cpp
+msgid "Pause"
+msgstr "Sitisha"
+
+#: src/keycode.cpp
+msgid "Period"
+msgstr "Kipindi cha"
+
+#: src/keycode.cpp
+msgid "Plus"
+msgstr "Plus"
+
+#: src/keycode.cpp
+msgid "Print"
+msgstr "Chapa"
+
+#: src/keycode.cpp
+msgid "Prior"
+msgstr "Awali"
+
+#: src/keycode.cpp
+msgid "Return"
+msgstr "Kurudi"
+
+#: src/keycode.cpp
+msgid "Right Button"
+msgstr "Kitufe kulia"
+
+#: src/keycode.cpp
+msgid "Right Control"
+msgstr "Udhibiti sahihi"
+
+#: src/keycode.cpp
+msgid "Right Menu"
+msgstr "Menyu kulia"
+
+#: src/keycode.cpp
+msgid "Right Shift"
+msgstr "Kisogezi kulia"
+
+#: src/keycode.cpp
+msgid "Right Windows"
+msgstr "Windows kulia"
+
+#: src/keycode.cpp
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
+
+#: src/keycode.cpp
+msgid "Select"
+msgstr "Teua"
+
+#: src/keycode.cpp
+msgid "Shift"
+msgstr "Shift"
+
+#: src/keycode.cpp
+msgid "Sleep"
+msgstr "Usingizi"
+
+#: src/keycode.cpp
+msgid "Snapshot"
+msgstr "Taswira tuli"
+
+#: src/keycode.cpp
+msgid "Space"
+msgstr "Nafasi"
+
+#: src/keycode.cpp
+msgid "Tab"
+msgstr "Kichupo"
+
+#: src/keycode.cpp
+msgid "Up"
+msgstr "Juu"
+
+#: src/keycode.cpp
+msgid "X Button 1"
+msgstr "X kitufe 1"
+
+#: src/keycode.cpp
+msgid "X Button 2"
+msgstr "X kitufe 2"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
+"Used to move a suitable spawn area of low land close to (0, 0).\n"
+"The default is suitable for mandelbrot sets, it needs to be edited for julia "
+"sets.\n"
+"Range roughly -2 to 2. Multiply by 'scale' for offset in nodes."
+msgstr ""
+"(X, Y, Z) fidia ya fractal kutoka kituo cha dunia katika vitengo vya "
+"'kipimo'.\n"
+"Kutumika ili kuhamisha eneo la spawn ya kufaa ya ardhi chini karibu (0, 0).\n"
+"Chaguo-msingi ni mzuri kwa ajili ya seti ya mandelbrot, inahitaji kuhaririwa "
+"kwa ajili ya julia seti.\n"
+"Masafa ya takribani-2 hadi 2. Kuzidisha kwa 'Skeli' kwa Sawazisha katika "
+"fundo."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"0 = parallax occlusion with slope information (faster).\n"
+"1 = relief mapping (slower, more accurate)."
+msgstr ""
+"0 = parallax occlusion na taarifa ya mteremko (haraka).\n"
+"1 = ramani ya misaada (polepole, sahihi zaidi)."
+
+#: src/settings_translation_file.cpp
+msgid "3D clouds"
+msgstr "Mawingu ya 3D"
+
+#: src/settings_translation_file.cpp
+msgid "3D mode"
+msgstr "Hali ya 3D"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"3D support.\n"
+"Currently supported:\n"
+"- none: no 3d output.\n"
+"- anaglyph: cyan/magenta color 3d.\n"
+"- interlaced: odd/even line based polarisation screen support.\n"
+"- topbottom: split screen top/bottom.\n"
+"- sidebyside: split screen side by side.\n"
+"- pageflip: quadbuffer based 3d."
+msgstr ""
+"Msaada ya 3D.\n"
+"Tegemeza kwa sasa:-Hakuna: Hakuna towe 3d.\n"
+"-anaglyph: Bluu-kijani/rangi nzee rangi 3d.\n"
+"-sokotana: witiri/shufwa mstari msingi polarisation kiwamba msaada.\n"
+"-topbottom: Baidisha skrini juu/chini.\n"
+"-sidebyside: Baidisha skrini upande kwa upande.\n"
+"-pageflip: quadbuffer msingi 3d."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"A chosen map seed for a new map, leave empty for random.\n"
+"Will be overridden when creating a new world in the main menu."
+msgstr ""
+"Mbegu ramani waliochaguliwa kwa ajili ya ramani mpya, kuondoka tupu kwa "
+"nasibu.\n"
+"Itakuwa kuuharibu wakati wa kuunda dunia mpya katika Menyu kuu."
+
+#: src/settings_translation_file.cpp
+msgid "A message to be displayed to all clients when the server crashes."
+msgstr "Ujumbe kuonyeshwa kwa wateja wote wakati seva yaanguka."
+
+#: src/settings_translation_file.cpp
+msgid "A message to be displayed to all clients when the server shuts down."
+msgstr "Ujumbe kuonyeshwa kwa wateja wote wakati seva huzima."
+
+#: src/settings_translation_file.cpp
+msgid "Absolute limit of emerge queues"
+msgstr "Kikomo halisi ya foleni ya emerge"
+
+#: src/settings_translation_file.cpp
+msgid "Acceleration in air"
+msgstr "Kuongeza kasi katika hewa"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Management interval"
+msgstr "Nafasi kazi ya usimamizi wa umbo"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifier interval"
+msgstr "Amilifu fungu Kigeuza nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "Modifiers fungu amilifu"
+
+#: src/settings_translation_file.cpp
+msgid "Active block range"
+msgstr "Masafa ya fungu amilifu"
+
+#: src/settings_translation_file.cpp
+msgid "Active object send range"
+msgstr "Kiolwa amilifu Tuma masafa"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Address to connect to.\n"
+"Leave this blank to start a local server.\n"
+"Note that the address field in the main menu overrides this setting."
+msgstr ""
+"Anwani ya kuunganishwa.\n"
+"Acha hii wazi kuanzisha seva ya ndani.\n"
+"Kumbuka kwamba uga wa anwani katika Menyu kuu Puuza kipimo hiki."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Adjust dpi configuration to your screen (non X11/Android only) e.g. for 4k "
+"screens."
+msgstr ""
+"Rekebisha usakinishaji wa dpi kwenye kiwamba chako (yasiyo X11/Android tu) "
+"mfano kwa 4 k skrini."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Adjust the gamma encoding for the light tables. Lower numbers are brighter.\n"
+"This setting is for the client only and is ignored by the server."
+msgstr ""
+"Rekebisha simbiko gamma kwa majedwali mwanga. Idadi ya chini ni mkali.\n"
+"Kipimo hiki ni kwa ajili ya mteja tu na ni kupuuzwa na seva."
+
+#: src/settings_translation_file.cpp
+msgid "Advanced"
+msgstr "Pevu"
+
+#: src/settings_translation_file.cpp
+msgid "Altitude Chill"
+msgstr "Chill ya mwinuko"
+
+#: src/settings_translation_file.cpp
+msgid "Always fly and fast"
+msgstr "Daima kuruka na kufunga"
+
+#: src/settings_translation_file.cpp
+msgid "Ambient occlusion gamma"
+msgstr "Occlusion iliyoko gamma"
+
+#: src/settings_translation_file.cpp
+msgid "Amplifies the valleys"
+msgstr "Inaangazia mabonde"
+
+#: src/settings_translation_file.cpp
+msgid "Anisotropic filtering"
+msgstr "Uchujaji wa anisotropic"
+
+#: src/settings_translation_file.cpp
+msgid "Announce server"
+msgstr "Kutangaza seva"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Announce to this serverlist.\n"
+"If you want to announce your ipv6 address, use serverlist_url = v6.servers."
+"minetest.net."
+msgstr ""
+"Kutangaza kwa serverlist hii.\n"
+"Kama unataka kutangaza anwani yako ya ipv6, kutumia serverlist_url = v6."
+"servers.minetest.net."
+
+#: src/settings_translation_file.cpp
+msgid "Approximate (X,Y,Z) scale of fractal in nodes."
+msgstr "Kukadiria (X, Y, Z) kipimo cha fractal katika fundo."
+
+#: src/settings_translation_file.cpp
+msgid "Ask to reconnect after crash"
+msgstr "Uliza kuunganisha baada ya ajali"
+
+#: src/settings_translation_file.cpp
+msgid "Automaticaly report to the serverlist."
+msgstr "Automaticaly ripoti ya serverlist."
+
+#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "Autorun ufunguo"
+
+#: src/settings_translation_file.cpp
+msgid "Backward key"
+msgstr "Ufunguo wa nyuma"
+
+#: src/settings_translation_file.cpp
+msgid "Base terrain height"
+msgstr "Mandhari ya msingi urefu"
+
+#: src/settings_translation_file.cpp
+msgid "Basic"
+msgstr "Msingi"
+
+#: src/settings_translation_file.cpp
+msgid "Basic Privileges"
+msgstr "Haki za msingi"
+
+#: src/settings_translation_file.cpp
+msgid "Bilinear filtering"
+msgstr "Uchujaji wa bilinear"
+
+#: src/settings_translation_file.cpp
+msgid "Bind address"
+msgstr "Kumfunga anwani"
+
+#: src/settings_translation_file.cpp
+msgid "Bits per pixel (aka color depth) in fullscreen mode."
+msgstr ""
+"Biti kwa pikseli (a.k.a rangi kina) katika hali-tumizi ya skrini nzima."
+
+#: src/settings_translation_file.cpp
+msgid "Build inside player"
+msgstr "Kujenga ndani ya mchezaji"
+
+#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "Pamoja"
+
+#: src/settings_translation_file.cpp
+msgid "Bumpmapping"
+msgstr "Bumpmapping"
+
+#: src/settings_translation_file.cpp
+msgid "Camera smoothing"
+msgstr "Kamera unyooshaji"
+
+#: src/settings_translation_file.cpp
+msgid "Camera smoothing in cinematic mode"
+msgstr "Kamera unyooshaji hali cinematic"
+
+#: src/settings_translation_file.cpp
+msgid "Camera update toggle key"
+msgstr "Kibonye guro Usasishaji wa kamera"
+
+#: src/settings_translation_file.cpp
+msgid "Cave noise #1"
+msgstr "Pango kelele #1"
+
+#: src/settings_translation_file.cpp
+msgid "Cave noise #2"
+msgstr "Pango kelele #2"
+
+#: src/settings_translation_file.cpp
+msgid "Cave width"
+msgstr "Pango upana"
+
+#: src/settings_translation_file.cpp
+msgid "Caves and tunnels form at the intersection of the two noises"
+msgstr "Fomu ya mapango na vichuguu katika makutano ya kila mbili"
+
+#: src/settings_translation_file.cpp
+msgid "Chat key"
+msgstr "Ufunguo wa mazungumzo"
+
+#: src/settings_translation_file.cpp
+msgid "Chat toggle key"
+msgstr "Kibonye guro wa mazungumzo"
+
+#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "Amri majadiliano"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Choice of 18 fractals from 9 formulas.\n"
+"1 = 4D \"Roundy\" mandelbrot set.\n"
+"2 = 4D \"Roundy\" julia set.\n"
+"3 = 4D \"Squarry\" mandelbrot set.\n"
+"4 = 4D \"Squarry\" julia set.\n"
+"5 = 4D \"Mandy Cousin\" mandelbrot set.\n"
+"6 = 4D \"Mandy Cousin\" julia set.\n"
+"7 = 4D \"Variation\" mandelbrot set.\n"
+"8 = 4D \"Variation\" julia set.\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot set.\n"
+"10 = 3D \"Mandelbrot/Mandelbar\" julia set.\n"
+"11 = 3D \"Christmas Tree\" mandelbrot set.\n"
+"12 = 3D \"Christmas Tree\" julia set.\n"
+"13 = 3D \"Mandelbulb\" mandelbrot set.\n"
+"14 = 3D \"Mandelbulb\" julia set.\n"
+"15 = 3D \"Cosine Mandelbulb\" mandelbrot set.\n"
+"16 = 3D \"Cosine Mandelbulb\" julia set.\n"
+"17 = 4D \"Mandelbulb\" mandelbrot set.\n"
+"18 = 4D \"Mandelbulb\" julia set."
+msgstr ""
+"Uchaguzi wa fractals 18 kutoka fomula 9.\n"
+"1 = 4 D \"Roundy\" mandelbrot seti.\n"
+"2 = 4 D seti ya julia \"Roundy\".\n"
+"3 = 4 D \"Squarry\" mandelbrot seti.\n"
+"4 = 4 D seti ya julia \"Squarry\".\n"
+"5 = 4 D \"Binamu Mandy\" mandelbrot seti.\n"
+"6 = 4 D \"Binamu Mandy\" julia seti.\n"
+"7 = 4 D \"Tofauti\" mandelbrot seti.\n"
+"8 = 4 D seti ya julia \"Tofauti\".\n"
+"9 = 3D \"Mandelbrot/Mandelbar\" mandelbrot seti.\n"
+"10 = 3D julia \"Mandelbrot/Mandelbar\" seti.\n"
+"11 = 3D \"Mti wa Krismasi\" mandelbrot seti.\n"
+"12 = 3D \"Mti wa Krismasi\" julia seti.\n"
+"13 = 3D \"Mandelbulb\" mandelbrot seti.\n"
+"14 = 3D julia \"Mandelbulb\" seti.\n"
+"15 = 3D \"Kosaini Mandelbulb\" mandelbrot seti.\n"
+"16 = 3D julia \"Kosaini Mandelbulb\" seti.\n"
+"17 = 4 D \"Mandelbulb\" mandelbrot seti.\n"
+"18 = 4 D seti ya julia \"Mandelbulb\"."
+
+#: src/settings_translation_file.cpp
+msgid "Chunk size"
+msgstr "Ukubwa wa fungu"
+
+#: src/settings_translation_file.cpp
+msgid "Cinematic mode"
+msgstr "Hali ya cinematic"
+
+#: src/settings_translation_file.cpp
+msgid "Cinematic mode key"
+msgstr "Hali ya cinematic ufunguo"
+
+#: src/settings_translation_file.cpp
+msgid "Clean transparent textures"
+msgstr "Unamu angavu safi"
+
+#: src/settings_translation_file.cpp
+msgid "Client and Server"
+msgstr "Mteja na seva"
+
+#: src/settings_translation_file.cpp
+msgid "Climbing speed"
+msgstr "Kasi ya upandaji"
+
+#: src/settings_translation_file.cpp
+msgid "Cloud height"
+msgstr "Urefu wa wingu"
+
+#: src/settings_translation_file.cpp
+msgid "Cloud radius"
+msgstr "Wingu eneo"
+
+#: src/settings_translation_file.cpp
+msgid "Clouds"
+msgstr "Mawingu"
+
+#: src/settings_translation_file.cpp
+msgid "Clouds are a client side effect."
+msgstr "Mawingu ni mteja upande athari."
+
+#: src/settings_translation_file.cpp
+msgid "Clouds in menu"
+msgstr "Mawingu katika Menyu"
+
+#: src/settings_translation_file.cpp
+msgid "Colored fog"
+msgstr "Ukungu wa rangi"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
+msgstr ""
+"Iliyotenganishwa orodha ya mods kwamba wanaruhusiwa kufikia HTTP APIs, "
+"ambayo kuwaruhusu kupakia na kupakua data/toka kwenye tovuti."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
+msgstr ""
+"Iliyotenganishwa orodha ya mods kuaminika kwamba wanaruhusiwa kufikia kazi "
+"zisizo hata wakati usalama Moduli ni juu (kupitia "
+"request_insecure_environment())."
+
+#: src/settings_translation_file.cpp
+msgid "Command key"
+msgstr "Ufunguo wa amri"
+
+#: src/settings_translation_file.cpp
+msgid "Connect glass"
+msgstr "Kuunganisha kioo"
+
+#: src/settings_translation_file.cpp
+msgid "Connect to external media server"
+msgstr "Unganisha kwenye seva ya midia za nje"
+
+#: src/settings_translation_file.cpp
+msgid "Connects glass if supported by node."
+msgstr "Huunganisha kioo kama mkono na fundo."
+
+#: src/settings_translation_file.cpp
+msgid "Console alpha"
+msgstr "Alfa ya Kiweko"
+
+#: src/settings_translation_file.cpp
+msgid "Console color"
+msgstr "Rangi ya Kiweko"
+
+#: src/settings_translation_file.cpp
+msgid "Console key"
+msgstr "Muhimu ya Kiweko"
+
+#: src/settings_translation_file.cpp
+msgid "Continuous forward"
+msgstr "Kuendelea mbele"
+
+#: src/settings_translation_file.cpp
+msgid "Continuous forward movement (only used for testing)."
+msgstr "Harakati endelevu mbele (kutumika tu kwa ajili ya kupima)."
+
+#: src/settings_translation_file.cpp
+msgid "Controls"
+msgstr "Vidhibiti"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Controls length of day/night cycle.\n"
+"Examples: 72 = 20min, 360 = 4min, 1 = 24hour, 0 = day/night/whatever stays "
+"unchanged."
+msgstr ""
+"Vidhibiti vya urefu wa mzunguko wa siku/usiku.\n"
+"Mifano: 72 = 20 min, 360 = 4 min, 1 = 24 saa, 0 = anakaa siku/usiku/whatever "
+"unchanged."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Controls size of deserts and beaches in Mapgen v6.\n"
+"When snowbiomes are enabled 'mgv6_freq_desert' is ignored."
+msgstr ""
+"Vidhibiti ukubwa wa majangwa na fukwe katika Mwandishi ramani v6.\n"
+"Wakati snowbiomes vimewezeshwa 'mgv6_freq_desert' ni kupuuzwa."
+
+#: src/settings_translation_file.cpp
+msgid "Controls steepness/depth of lake depressions."
+msgstr "Udhibiti mwinuko/kina cha ziwa depressions."
+
+#: src/settings_translation_file.cpp
+msgid "Controls steepness/height of hills."
+msgstr "Udhibiti mwinuko/urefu wa milima."
+
+#: src/settings_translation_file.cpp
+msgid "Controls width of tunnels, a smaller value creates wider tunnels."
+msgstr "Vidhibiti vya upana wa vichuguu, thamani ndogo huunda vichuguu pana."
+
+#: src/settings_translation_file.cpp
+msgid "Crash message"
+msgstr "Ajali ujumbe"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Creates unpredictable lava features in caves.\n"
+"These can make mining difficult. Zero disables them. (0-10)"
+msgstr ""
+"Huunda lava haitabiriki sifa katika mapango.\n"
+"Haya kufanya madini vigumu. Sifuri Hulemaza yao. (0-10)"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Creates unpredictable water features in caves.\n"
+"These can make mining difficult. Zero disables them. (0-10)"
+msgstr ""
+"Huunda maji haitabiriki sifa katika mapango.\n"
+"Haya kufanya madini vigumu. Sifuri Hulemaza yao. (0-10)"
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair alpha"
+msgstr "Crosshair Alfa"
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair alpha (opaqueness, between 0 and 255)."
+msgstr "Crosshair Alfa (opaqueness kati ya 0 na 255)."
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair color"
+msgstr "Rangi ya crosshair"
+
+#: src/settings_translation_file.cpp
+msgid "Crosshair color (R,G,B)."
+msgstr "Rangi ya crosshair (R, G, B)."
+
+#: src/settings_translation_file.cpp
+msgid "Crouch speed"
+msgstr "Ingia kasi"
+
+#: src/settings_translation_file.cpp
+msgid "DPI"
+msgstr "DPI"
+
+#: src/settings_translation_file.cpp
+msgid "Damage"
+msgstr "Uharibifu"
+
+#: src/settings_translation_file.cpp
+msgid "Debug info toggle key"
+msgstr "Rekebisha taarifa kibonye"
+
+#: src/settings_translation_file.cpp
+msgid "Debug log level"
+msgstr "Rekebisha kiwango cha logi"
+
+#: src/settings_translation_file.cpp
+msgid "Dedicated server step"
+msgstr "Hatua ya seva ya kujitolea"
+
+#: src/settings_translation_file.cpp
+msgid "Default acceleration"
+msgstr "Kichapuzi Chaguo-msingi"
+
+#: src/settings_translation_file.cpp
+msgid "Default game"
+msgstr "Chaguo-msingi mchezo"
+
+#: 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 ""
+"Chaguo-msingi mchezo wakati wa kuunda dunia mpya.\n"
+"Hii itakuwa kuwa kuuharibu wakati kutengeneza ulimwengu kutoka kwenye menyu "
+"kuu."
+
+#: src/settings_translation_file.cpp
+msgid "Default password"
+msgstr "Nywila ya chaguo-msingi"
+
+#: src/settings_translation_file.cpp
+msgid "Default privileges"
+msgstr "Upendeleo wa chaguo-msingi"
+
+#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "Umbizo wa ripoti wa chaguo-msingi"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Default timeout for cURL, stated in milliseconds.\n"
+"Only has an effect if compiled with cURL."
+msgstr ""
+"Chaguo-msingi muda wa kuisha kwa cURL, alisema katika milisekunde.\n"
+"Tu ina athari kama alikusanya na Mkunjo."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Defines sampling step of texture.\n"
+"A higher value results in smoother normal maps."
+msgstr ""
+"Inafasili hatua ya sampuli ya unamu.\n"
+"Thamani ya juu zaidi matokeo katika ramani ya laini ya kawaida."
+
+#: src/settings_translation_file.cpp
+msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
+msgstr ""
+"Inafasili umbali wa uhamisho wa mchezaji maximal katika vitalu (0 = ukomo)."
+
+#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "Kuchelewa katika kutuma vitalu baada ya jengo"
+
+#: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr "Kuchelewa kuonyesha vidokezozana, alisema katika milisekunde."
+
+#: src/settings_translation_file.cpp
+msgid "Deprecated Lua API handling"
+msgstr "Deprecated Lua API utunzaji"
+
+#: src/settings_translation_file.cpp
+msgid "Depth below which you'll find large caves."
+msgstr "Kina chini ambayo utapata mapango kubwa."
+
+#: src/settings_translation_file.cpp
+msgid "Depth below which you'll find massive caves."
+msgstr "Kina chini ambayo utapata mapango mkubwa."
+
+#: src/settings_translation_file.cpp
+msgid "Descending speed"
+msgstr "Kushuka kasi"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Description of server, to be displayed when players join and in the "
+"serverlist."
+msgstr ""
+"Maelezo ya seva, kuonyeshwa wakati wachezaji kujiunga na katika serverlist "
+"ya."
+
+#: src/settings_translation_file.cpp
+msgid "Desynchronize block animation"
+msgstr "Desynchronize umbo la uhuishaji"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Determines terrain shape.\n"
+"The 3 numbers in brackets control the scale of the\n"
+"terrain, the 3 numbers should be identical."
+msgstr ""
+"Huamua umbo wa ardhi.\n"
+"Namba 3 katika mabano kudhibiti ukubwa wa ardhi, namba 3 lazima kufanana."
+
+#: src/settings_translation_file.cpp
+msgid "Disable anticheat"
+msgstr "Lemaza anticheat"
+
+#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "Lemaza kutoroka mwandamano"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"Lemaza mwandamano wa kutoroka, k.m kuzungumza kuchorea.\n"
+"Tumia hii kama unataka kuendesha seva na wateja wa awali-0.4.14 na unataka "
+"kulemaza mwandamano kutoroka yanayotokana na mods."
+
+#: src/settings_translation_file.cpp
+msgid "Disallow empty passwords"
+msgstr "Usiruhusu nywila tupu"
+
+#: src/settings_translation_file.cpp
+msgid "Domain name of server, to be displayed in the serverlist."
+msgstr "Kikoa jina la seva, kuonyeshwa katika serverlist ya."
+
+#: src/settings_translation_file.cpp
+msgid "Double tap jump for fly"
+msgstr "Mara mbili ya bomba kuruka kwa kuruka"
+
+#: src/settings_translation_file.cpp
+msgid "Double-tapping the jump key toggles fly mode."
+msgstr "Mbili-tapping ufunguo wa kuruka Inatogoa hali ya kuruka."
+
+#: src/settings_translation_file.cpp
+msgid "Drop item key"
+msgstr "Tone kipengee muhimu"
+
+#: src/settings_translation_file.cpp
+msgid "Dump the mapgen debug infos."
+msgstr "Bwaga mwandishi ramani rekebishi infos."
+
+#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "Wezesha vifimbocheza"
+
+#: src/settings_translation_file.cpp
+msgid "Enable VBO"
+msgstr "Wezesha VBO"
+
+#: src/settings_translation_file.cpp
+msgid "Enable mod security"
+msgstr "Kuwezesha usalama Moduli"
+
+#: src/settings_translation_file.cpp
+msgid "Enable players getting damage and dying."
+msgstr "Wezesha wachezaji kupata uharibifu na kufa."
+
+#: src/settings_translation_file.cpp
+msgid "Enable random user input (only used for testing)."
+msgstr "Wezesha ingizo la mtumiaji nasibu (kutumika tu kwa ajili ya kupima)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable smooth lighting with simple ambient occlusion.\n"
+"Disable for speed or for different looks."
+msgstr ""
+"Wezesha taa laini na rahisi iliyoko occlusion.\n"
+"Lemaza kwa kasi au kwa ajili ya inaonekana tofauti."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable to disallow old clients from connecting.\n"
+"Older clients are compatible in the sense that they will not crash when "
+"connecting\n"
+"to new servers, but they may not support all new features that you are "
+"expecting."
+msgstr ""
+"Wezesha Usiruhusu wateja wa zamani kutoka kuunganisha.\n"
+"Wateja wakubwa ni patanifu katika maana ya kwamba wao si mapenzi ajali "
+"wakati wa kuunganisha kwenye seva mpya, lakini inaweza kusaidia nduni zote "
+"mpya ambayo ni kutarajia."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable usage of remote media server (if provided by server).\n"
+"Remote servers offer a significantly faster way to download media (e.g. "
+"textures)\n"
+"when connecting to the server."
+msgstr ""
+"Kuwezesha matumizi ya seva ya midia ya mbali (kama zinazotolewa na seva).\n"
+"Seva ya mbali kutoa njia kwa kiasi kikubwa kasi ya kupakua midia (k.m unamu) "
+"wakati wa kuunganisha kwenye seva."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enable/disable running an IPv6 server. An IPv6 server may be restricted\n"
+"to IPv6 clients, depending on system configuration.\n"
+"Ignored if bind_address is set."
+msgstr ""
+"Wezesha/Lemaza kuendesha seva ya IPv6. Seva ya IPv6 unaweza kuzuiliwa kwa "
+"wateja IPv6, kutegemea usanidi mfumo.\n"
+"Kupuuzwa kama bind_address kuweka."
+
+#: src/settings_translation_file.cpp
+msgid "Enables animation of inventory items."
+msgstr "Huwezesha uhuishaji wa vitu inventering."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enables bumpmapping for textures. Normalmaps need to be supplied by the "
+"texture pack\n"
+"or need to be auto-generated.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Inawezesha bumpmapping kwa ajili ya unamu. Normalmaps haja iwekwe kwa pakiti "
+"ya unamu au haja ya kuwa yaliyozalishwa na otomatiki.\n"
+"Inahitaji shaders kwa kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid "Enables caching of facedir rotated meshes."
+msgstr "Huwezesha uwekaji kache kwa facedir Iliyozungushwa meshes."
+
+#: src/settings_translation_file.cpp
+msgid "Enables filmic tone mapping"
+msgstr "Huwezesha toni filmic ramani"
+
+#: src/settings_translation_file.cpp
+msgid "Enables minimap."
+msgstr "Inawezesha minimap."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enables on the fly normalmap generation (Emboss effect).\n"
+"Requires bumpmapping to be enabled."
+msgstr ""
+"Huwezesha kwenye kizazi cha normalmap kuruka (Emboss athari).\n"
+"Inahitaji bumpmapping kwa kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Enables parallax occlusion mapping.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Huwezesha parallax occlusion uramanishi.\n"
+"Inahitaji shaders kwa kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "Injini ubainishaji wa data ya uchapaji nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "Mbinu ya chombo"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Experimental option, might cause visible spaces between blocks\n"
+"when set to higher number than 0."
+msgstr ""
+"Chaguo majaribio, inaweza kusababisha nafasi inayoonekana kati ya vitalu "
+"wakati kuweka namba ya juu zaidi kuliko 0."
+
+#: src/settings_translation_file.cpp
+msgid "FPS in pause menu"
+msgstr "Ramprogrammen katika Menyu ya mapumziko"
+
+#: src/settings_translation_file.cpp
+msgid "FSAA"
+msgstr "FSAA"
+
+#: src/settings_translation_file.cpp
+msgid "Fall bobbing"
+msgstr "Kuanguka bobbing"
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font"
+msgstr "Fonti amebadilisha"
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font shadow"
+msgstr "Fonti amebadilisha kivuli"
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font shadow alpha"
+msgstr "Fonti amebadilisha kivuli Alfa"
+
+#: src/settings_translation_file.cpp
+msgid "Fallback font size"
+msgstr "Ukubwa fonti amebadilisha"
+
+#: src/settings_translation_file.cpp
+msgid "Fast key"
+msgstr "Ufunguo kasi"
+
+#: src/settings_translation_file.cpp
+msgid "Fast mode acceleration"
+msgstr "Kuongeza kasi hali ya haraka"
+
+#: src/settings_translation_file.cpp
+msgid "Fast mode speed"
+msgstr "Kasi ya hali ya haraka"
+
+#: src/settings_translation_file.cpp
+msgid "Fast movement"
+msgstr "Kutembea haraka"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Fast movement (via use key).\n"
+"This requires the \"fast\" privilege on the server."
+msgstr ""
+"Harakati haraka (kupitia matumizi muhimu).\n"
+"Hii inahitaji upendeleo \"haraka\" kwenye seva."
+
+#: src/settings_translation_file.cpp
+msgid "Field of view"
+msgstr "Uga wa Mwoneko"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "Uga wa Mwoneko kwa ajili ya Kuza"
+
+#: src/settings_translation_file.cpp
+msgid "Field of view in degrees."
+msgstr "Uga wa Mwoneko katika nyuzi."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"Uga wa Mwoneko ukikuza katika nyuzi.\n"
+"Hii inahitaji nafasi \"Kuza\" kwenye seva."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"File in client/serverlist/ that contains your favorite servers displayed in "
+"the Multiplayer Tab."
+msgstr ""
+"Faili katika mteja/serverlist/yenye seva zako Pendwa kuonyeshwa katika "
+"kichupo cha Multiplayer."
+
+#: src/settings_translation_file.cpp
+msgid "Filler Depth"
+msgstr "Kina ya Filler"
+
+#: src/settings_translation_file.cpp
+msgid "Filmic tone mapping"
+msgstr "Ramani ya toni filmic"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Filtered textures can blend RGB values with fully-transparent neighbors,\n"
+"which PNG optimizers usually discard, sometimes resulting in a dark or\n"
+"light edge to transparent textures. Apply this filter to clean that up\n"
+"at texture load time."
+msgstr ""
+"Unamu kuchujwa wanaweza kujichanganya RGB thamani na majirani kikamilifu-"
+"uwazi, ambayo PNG optimizers kawaida Tupa, wakati mwingine kusababisha "
+"katika ukingo wa giza au mwanga angavu ya unamu. Tekeleza Kichujio hii "
+"kusafisha kwamba wakati mzigo, unamu."
+
+#: src/settings_translation_file.cpp
+msgid "Filtering"
+msgstr "Uchujaji"
+
+#: src/settings_translation_file.cpp
+msgid "Fixed map seed"
+msgstr "Mbegu ya ramani fasta"
+
+#: src/settings_translation_file.cpp
+msgid "Fly key"
+msgstr "Kuruka ufunguo"
+
+#: src/settings_translation_file.cpp
+msgid "Flying"
+msgstr "Kuruka"
+
+#: src/settings_translation_file.cpp
+msgid "Fog"
+msgstr "Ukungu"
+
+#: src/settings_translation_file.cpp
+msgid "Fog toggle key"
+msgstr "Kibonye guro wa ukungu"
+
+#: src/settings_translation_file.cpp
+msgid "Font path"
+msgstr "Njia ya fonti"
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow"
+msgstr "Kivuli cha fonti"
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow alpha"
+msgstr "Fonti kivuli Alfa"
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow alpha (opaqueness, between 0 and 255)."
+msgstr "Fonti kivuli Alfa (opaqueness kati ya 0 na 255)."
+
+#: src/settings_translation_file.cpp
+msgid "Font shadow offset, if 0 then shadow will not be drawn."
+msgstr "Fonti kivuli Sawazisha, kama 0 basi kivuli itakuwa kuchukuliwa."
+
+#: src/settings_translation_file.cpp
+msgid "Font size"
+msgstr "Ukubwa wa fonti"
+
+#: src/settings_translation_file.cpp
+msgid "Format of screenshots."
+msgstr "Umbizo la viwambo."
+
+#: src/settings_translation_file.cpp
+msgid "Forward key"
+msgstr "Ufunguo wa mbele"
+
+#: src/settings_translation_file.cpp
+msgid "Freetype fonts"
+msgstr "Fonti Freetype"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"From how far blocks are generated for clients, stated in mapblocks (16 "
+"nodes)."
+msgstr ""
+"Kutoka vitalu mbali kiasi gani hutolewa kwa wateja, alisema katika mapblocks "
+"(fundo 16)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"From how far blocks are sent to clients, stated in mapblocks (16 nodes)."
+msgstr ""
+"Kutoka vitalu mbali jinsi hutumwa kwa wateja, alisema katika mapblocks "
+"(fundo 16)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"From how far clients know about objects, stated in mapblocks (16 nodes)."
+msgstr ""
+"Kutoka wateja mbali kiasi gani kujua kuhusu vitu, alisema katika mapblocks "
+"(fundo 16)."
+
+#: src/settings_translation_file.cpp
+msgid "Full screen"
+msgstr "Kiwamba kizima"
+
+#: src/settings_translation_file.cpp
+msgid "Full screen BPP"
+msgstr "Skrini BPP"
+
+#: src/settings_translation_file.cpp
+msgid "Fullscreen mode."
+msgstr "Hali-tumizi ya skrini nzima."
+
+#: src/settings_translation_file.cpp
+msgid "GUI scaling"
+msgstr "GUI kurekebisha"
+
+#: src/settings_translation_file.cpp
+msgid "GUI scaling filter"
+msgstr "GUI kipimo Kichujio"
+
+#: src/settings_translation_file.cpp
+msgid "GUI scaling filter txr2img"
+msgstr "GUI kipimo Kichujio txr2img"
+
+#: src/settings_translation_file.cpp
+msgid "Gamma"
+msgstr "Gamma"
+
+#: src/settings_translation_file.cpp
+msgid "General"
+msgstr "Mkuu"
+
+#: src/settings_translation_file.cpp
+msgid "Generate normalmaps"
+msgstr "Kuzalisha normalmaps"
+
+#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr "Callbacks ya kimataifa"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Global map generation attributes.\n"
+"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
+"and junglegrass, in all other mapgens this flag controls all decorations.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+"Ramani ya kimataifa kizazi sifa.\n"
+"Katika Mwandishi ramani v6 bendera ya 'kienyeji' udhibiti mapambo yote "
+"isipokuwa miti na junglegrass, katika mapgens mengine yote bendera hii "
+"udhibiti mapambo yote.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
+
+#: src/settings_translation_file.cpp
+msgid "Graphics"
+msgstr "Michoro"
+
+#: src/settings_translation_file.cpp
+msgid "Gravity"
+msgstr "Mvutano"
+
+#: src/settings_translation_file.cpp
+msgid "HTTP Mods"
+msgstr "HTTP Mods"
+
+#: src/settings_translation_file.cpp
+msgid "HUD toggle key"
+msgstr "HUD kibonye"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Handling for deprecated lua api calls:\n"
+"- legacy: (try to) mimic old behaviour (default for release).\n"
+"- log: mimic and log backtrace of deprecated call (default for debug).\n"
+"- error: abort on usage of deprecated call (suggested for mod developers)."
+msgstr ""
+"Utunzaji kwa deprecated lua ya API: - Rithi: (jaribu kwa) mimic zamani tabia "
+"(chaguo-msingi kwa ajili ya kutolewa).\n"
+"-logi: kuiga na kuingia backtrace wa deprecated wito (chaguo-msingi kwa "
+"ajili ya rekebishi).\n"
+"-Kosa: tusiseme juu ya matumizi ya simu deprecated (alipendekeza kwa "
+"watengenezaji Moduli)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"Kuwa profiler instrument yenyewe: * Instrument kazi tupu.\n"
+"Hii makadirio vimezingirwa, kwamba instrumentation ni kuongeza (+ 1 kazi "
+"simu).\n"
+"* Chombo sampler kutumika ili kusasisha takwimu."
+
+#: src/settings_translation_file.cpp
+msgid "Height component of the initial window size."
+msgstr "Kijenzi cha urefu wa ukubwa cha kidirisha awali."
+
+#: src/settings_translation_file.cpp
+msgid "Height on which clouds are appearing."
+msgstr "Urefu ambayo mawingu ni kuonekana."
+
+#: src/settings_translation_file.cpp
+msgid "High-precision FPU"
+msgstr "FPU kuu-usahihi"
+
+#: src/settings_translation_file.cpp
+msgid "Homepage of server, to be displayed in the serverlist."
+msgstr "Homepage ya seva, kuonyeshwa katika serverlist ya."
+
+#: src/settings_translation_file.cpp
+msgid "How deep to make rivers"
+msgstr "Kina jinsi kufanya mito"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"How large area of blocks are subject to the active block stuff, stated in "
+"mapblocks (16 nodes).\n"
+"In active blocks objects are loaded and ABMs run."
+msgstr ""
+"Jinsi ya eneo kubwa la vitalu ni chini ya fungu amilifu mambo, alisema "
+"katika mapblocks (fundo 16).\n"
+"Katika vitalu amilifu vitu ni kupakiwa na ABMs kukimbia."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"How much the server will wait before unloading unused mapblocks.\n"
+"Higher value is smoother, but will use more RAM."
+msgstr ""
+"Seva kiasi kusubiri kabla ya kupakua mapblocks zisizotumika.\n"
+"Thamani ya juu zaidi ni laini, lakini kutumia RAM zaidi."
+
+#: src/settings_translation_file.cpp
+msgid "How wide to make rivers"
+msgstr "Upana gani kufanya mito"
+
+#: src/settings_translation_file.cpp
+msgid "IPv6"
+msgstr "IPv6"
+
+#: src/settings_translation_file.cpp
+msgid "IPv6 server"
+msgstr "IPv6 Seva"
+
+#: src/settings_translation_file.cpp
+msgid "IPv6 support."
+msgstr "IPv6 msaada."
+
+#: 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 ""
+"Kama Ramprogrammen angekwenda juu kuliko hii, kikomo kwa kulala si kupoteza "
+"nguvu ya CPU kwa faida yoyote."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If disabled \"use\" key is used to fly fast if both fly and fast mode are "
+"enabled."
+msgstr ""
+"Ikiwa kimelemazwa \"kutumia\" ufunguo ni kutumika kwa kuruka haraka kama "
+"hali-tumizi ya kuruka na ya haraka ni kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled together with fly mode, player is able to fly through solid "
+"nodes.\n"
+"This requires the \"noclip\" privilege on the server."
+msgstr ""
+"Kama kuwezeshwa pamoja na hali ya kuruka, mchezaji ni uwezo wa kuruka kwa "
+"fundo imara.\n"
+"Hii inahitaji upendeleo wa \"noclip\" kwenye seva."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, \"use\" key instead of \"sneak\" key is used for climbing down "
+"and descending."
+msgstr ""
+"Ikiwa imewezeshwa, ufunguo wa \"kutumia\" badala ya \"sneak\" ufunguo ni "
+"kutumika kwa ajili ya kupanda na kushuka."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, actions are recorded for rollback.\n"
+"This option is only read when server starts."
+msgstr ""
+"Ikiwa imewezeshwa, matendo ni kumbukumbu kwa ajili ya mserereko.\n"
+"Chaguo hili ni soma tu wakati wa kuanza kwa seva."
+
+#: src/settings_translation_file.cpp
+msgid "If enabled, disable cheat prevention in multiplayer."
+msgstr "Ikiwa imewezeshwa, kulemaza uzuiaji wa soka katika multiplayer."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, invalid world data won't cause the server to shut down.\n"
+"Only enable this if you know what you are doing."
+msgstr ""
+"Ikiwa imewezeshwa, data ya dunia batili si kusababisha seva kuzima.\n"
+"Tu kuwezesha hii kama unajua nini unafanya."
+
+#: src/settings_translation_file.cpp
+msgid "If enabled, new players cannot join with an empty password."
+msgstr "Ikiwa imewezeshwa, wachezaji wapya haiwezi kujiunga na nywila wazi."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"If enabled, you can place blocks at the position (feet + eye level) where "
+"you stand.\n"
+"This is helpful when working with nodeboxes in small areas."
+msgstr ""
+"Ikiwa imewezeshwa, unaweza mahali vitalu katika nafasi (miguu + jicho "
+"kiwango) ambako kusimama.\n"
+"Hii ni kusaidia unapofanya kazi na nodeboxes katika maeneo madogo."
+
+#: src/settings_translation_file.cpp
+msgid "If this is set, players will always (re)spawn at the given position."
+msgstr "Kama hii ni kuweka, wachezaji mapenzi daima (re) spawn mahali fulani."
+
+#: src/settings_translation_file.cpp
+msgid "Ignore world errors"
+msgstr "Kupuuza makosa ya ulimwengu"
+
+#: src/settings_translation_file.cpp
+msgid "In-Game"
+msgstr "Katika mchezo"
+
+#: src/settings_translation_file.cpp
+msgid "In-game chat console background alpha (opaqueness, between 0 and 255)."
+msgstr ""
+"Mazungumzo katika mchezo console mandharinyuma Alfa (opaqueness kati ya 0 na "
+"255)."
+
+#: src/settings_translation_file.cpp
+msgid "In-game chat console background color (R,G,B)."
+msgstr "Mazungumzo katika mchezo console mandharinyuma rangi (R, G, B)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"Chombo builtin.\n"
+"Hii ni kawaida tu zinazohitajika kwa wachangiaji wa msingi/builtin"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "Chombo chatcommands kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"Chombo mwito-rejeshi kimataifa kazi kwenye usajili.\n"
+"(kitu chochote unaweza kupita kwa kazi minetest.register_*())"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "Ala ya kazi hatua ya Modifiers Amilifu wa fungu kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr "Ala ya kazi hatua ya kupakia fungu Modifiers kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "Instrument mbinu za vyombo kwenye usajili."
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "Instrumentation"
+
+#: src/settings_translation_file.cpp
+msgid "Interval of saving important changes in the world, stated in seconds."
+msgstr ""
+"Muda wa kuhifadhi mabadiliko muhimu katika ulimwengu, alisema katika sekunde."
+
+#: src/settings_translation_file.cpp
+msgid "Interval of sending time of day to clients."
+msgstr "Muda wa kutuma wakati wa siku kwa wateja."
+
+#: src/settings_translation_file.cpp
+msgid "Inventory items animations"
+msgstr "Hesabu vitu uhuishaji"
+
+#: src/settings_translation_file.cpp
+msgid "Inventory key"
+msgstr "Ufunguo wa hesabu"
+
+#: src/settings_translation_file.cpp
+msgid "Invert mouse"
+msgstr "Pindua kipanya"
+
+#: src/settings_translation_file.cpp
+msgid "Invert vertical mouse movement."
+msgstr "Pindua harakati ya kipanya wima."
+
+#: src/settings_translation_file.cpp
+msgid "Item entity TTL"
+msgstr "Kipengee chombo TTL"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Iterations of the recursive function.\n"
+"Controls the amount of fine detail."
+msgstr ""
+"Marudiorudio ya kazi recursive.\n"
+"Udhibiti kiasi cha undani faini."
+
+#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "Kifimbocheza kitufe marudio nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "Kifimbocheza frustum unyeti"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: W component of hypercomplex constant determining julia "
+"shape.\n"
+"Has no effect on 3D fractals.\n"
+"Range roughly -2 to 2."
+msgstr ""
+"Julia kuweka tu: W sehemu ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Ina athari 3D fractals.\n"
+"Masafa ya takribani-2 hadi 2."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: X component of hypercomplex constant determining julia "
+"shape.\n"
+"Range roughly -2 to 2."
+msgstr ""
+"Julia kuweka tu: X sehemu ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Masafa ya takribani-2 hadi 2."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: Y component of hypercomplex constant determining julia "
+"shape.\n"
+"Range roughly -2 to 2."
+msgstr ""
+"Julia kuweka tu: sehemu Y ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Masafa ya takribani-2 hadi 2."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Julia set only: Z component of hypercomplex constant determining julia "
+"shape.\n"
+"Range roughly -2 to 2."
+msgstr ""
+"Julia kuweka tu: Z sehemu ya hypercomplex mara kwa mara umbo julia kukazia.\n"
+"Masafa ya takribani-2 hadi 2."
+
+#: src/settings_translation_file.cpp
+msgid "Jump key"
+msgstr "Ufunguo wa kuruka"
+
+#: src/settings_translation_file.cpp
+msgid "Jumping speed"
+msgstr "Kuruka kasi"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for decreasing the viewing range.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kupunguza kiwango cha kuonyesha.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for dropping the currently selected item.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kuacha kipengee kilichoteuliwa kwa sasa.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for increasing the viewing range.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kuongeza kiwango cha kuonyesha.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for jumping.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kuruka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving fast in fast mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kusonga haraka katika hali ya haraka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player backward.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kuhamia mchezaji nyuma.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player forward.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kuhamia mchezaji mbele.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player left.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kuhamia mchezaji kushoto.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for moving the player right.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kusonga mchezaji haki.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the chat console.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kufungua muano wa mazungumzo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the chat window to type commands.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kufungua dirisha la soga kuchapa amri.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the chat window.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kufungua dirisha la soga.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for opening the inventory.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kufungua hesabu.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for printing debug stacks. Used for development.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya uchapishaji mipororo rekebishi. Kutumika kwa ajili ya "
+"maendeleo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for sneaking.\n"
+"Also used for climbing down and descending in water if aux1_descends is "
+"disabled.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya sneaking.\n"
+"Pia kutumika kwa ajili ya kupanda na kushuka katika maji kama aux1_descends "
+"imelemazwa.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for switching between first- and third-person camera.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kubadili kati ya kamera ya kwanza - na -mtu wa tatu.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for taking screenshots.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya kuchukua viwambo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling autorun.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling cinematic mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling hali ya cinematic.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling display of minimap.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling onyesho la minimap.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling fast mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling hali ya haraka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling flying.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling kuruka.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling noclip mode.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling hali ya noclip.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the camera update. Only used for development\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling sasaishi ya kamera. Tu kutumika kwa ajili ya "
+"maendeleo ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of debug info.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling onyesho la maelezo kuhusu marekebisho.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the HUD.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling onyesho la ya HUD.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the chat.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling onyesho la kuzungumza.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the fog.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling onyesho la ukungu.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling the display of the profiler. Used for development.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling onyesho la profiler ya. Kutumika kwa ajili ya "
+"maendeleo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Key for toggling unlimited view range.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"Muhimu kwa ajili ya toggling masafa ya Mwoneko ukomo.\n"
+"Ona http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid "Key use for climbing/descending"
+msgstr "Matumizi muhimu kwa ajili ya kupanda/kushuka"
+
+#: src/settings_translation_file.cpp
+msgid "Language"
+msgstr "Lugha"
+
+#: src/settings_translation_file.cpp
+msgid "Large cave depth"
+msgstr "Kina ya pango kubwa"
+
+#: src/settings_translation_file.cpp
+msgid "Lava Features"
+msgstr "Lava vipengele"
+
+#: src/settings_translation_file.cpp
+msgid "Leaves style"
+msgstr "Mtindo wa majani"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Leaves style:\n"
+"- Fancy: all faces visible\n"
+"- Simple: only outer faces, if defined special_tiles are used\n"
+"- Opaque: disable transparency"
+msgstr ""
+"Majani mtindo: - dhana: nyuso zote kuonekana - rahisi: tu nyuso nje, kama "
+"inavyoelezwa special_tiles ni kutumika - Opaque: Lemaza uwazi"
+
+#: src/settings_translation_file.cpp
+msgid "Left key"
+msgstr "Ufunguo wa kushoto"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Length of a server tick and the interval at which objects are generally "
+"updated over network."
+msgstr ""
+"Urefu wa alama ya tiki seva na nafasi ambayo vitu ni kwa ujumla kusasaishwa "
+"kwenye mtandao."
+
+#: src/settings_translation_file.cpp
+msgid "Length of time between ABM execution cycles"
+msgstr "Urefu wa muda kati ya ABM utekelezaji mizunguko"
+
+#: src/settings_translation_file.cpp
+msgid "Length of time between NodeTimer execution cycles"
+msgstr "Urefu wa muda kati ya mzunguko wa utekelezaji wa NodeTimer"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Level of logging to be written to debug.txt:\n"
+"- <nothing> (no logging)\n"
+"- none (messages with no level)\n"
+"- error\n"
+"- warning\n"
+"- action\n"
+"- info\n"
+"- verbose"
+msgstr ""
+"Kiwango cha ufunguaji kuandikwa kwa debug.txt:- <nothing>(Hakuna ufunguaji) "
+"- Hakuna (ujumbe na hakuna kiwango) - kosa - tahadhari - hatua - taarifa - "
+"verbose</nothing>"
+
+#: src/settings_translation_file.cpp
+msgid "Limit of emerge queues on disk"
+msgstr "Kikomo ya foleni emerge kwenye diski"
+
+#: src/settings_translation_file.cpp
+msgid "Limit of emerge queues to generate"
+msgstr "Kikomo ya foleni emerge kuzalisha"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Limits number of parallel HTTP requests. Affects:\n"
+"- Media fetch if server uses remote_media setting.\n"
+"- Serverlist download and server announcement.\n"
+"- Downloads performed by main menu (e.g. mod manager).\n"
+"Only has an effect if compiled with cURL."
+msgstr ""
+"Mipaka idadi ya maombi HTTP sambamba. Huathiri: - vyombo vya habari kuchota "
+"kama seva hutumia kipimo cha remote_media.\n"
+"-Serverlist kupakua na seva tangazo.\n"
+"-Downloads zifanywe Menyu kuu (k.m Meneja Moduli).\n"
+"Tu ina athari kama alikusanya na Mkunjo."
+
+#: src/settings_translation_file.cpp
+msgid "Liquid fluidity"
+msgstr "Fluidity kioevu"
+
+#: src/settings_translation_file.cpp
+msgid "Liquid fluidity smoothing"
+msgstr "Fluidity kioevu unyooshaji"
+
+#: src/settings_translation_file.cpp
+msgid "Liquid loop max"
+msgstr "Kitanzi kioevu upeo"
+
+#: src/settings_translation_file.cpp
+msgid "Liquid queue purge time"
+msgstr "Wakati wa usafishaji wa foleni ya kioevu"
+
+#: src/settings_translation_file.cpp
+msgid "Liquid sink"
+msgstr "Kuzama kioevu"
+
+#: src/settings_translation_file.cpp
+msgid "Liquid update interval in seconds."
+msgstr "Sasisha kioevu nafasi katika sekunde."
+
+#: src/settings_translation_file.cpp
+msgid "Liquid update tick"
+msgstr "Pata sasishi kioevu"
+
+#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "Kupakia profiler mchezo"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"Kupakia profiler mchezo kukusanya data ya ubainishaji wa mchezo.\n"
+"Hutoa amri /profiler kufikia umbo Kusanyo.\n"
+"Muhimu kwa watengenezaji Moduli na waendeshaji wa seva."
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "Inapakiza umbo Modifiers"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu game manager"
+msgstr "Meneja wa mchezo wa Menyu kuu"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu mod manager"
+msgstr "Menyu kuu Moduli Meneja"
+
+#: src/settings_translation_file.cpp
+msgid "Main menu script"
+msgstr "Hati ya Menyu kuu"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Make fog and sky colors depend on daytime (dawn/sunset) and view direction."
+msgstr ""
+"Kufanya rangi wa ukungu na anga hutegemea mchana (alfajiri/machweo) na "
+"kuonyesha mwelekeo."
+
+#: src/settings_translation_file.cpp
+msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
+msgstr "Hufanya DirectX kazi na LuaJIT. Lemaza ikiwa husababisha matatizo."
+
+#: src/settings_translation_file.cpp
+msgid "Map directory"
+msgstr "Orodha ya ramani"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen Valleys.\n"
+"'altitude_chill' makes higher elevations colder, which may cause biome "
+"issues.\n"
+"'humid_rivers' modifies the humidity around rivers and in areas where water "
+"would tend to pool,\n"
+"it may interfere with delicately adjusted biomes.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+"Ramani kizazi sifa maalum kwa mabonde ya Mwandishi ramani.\n"
+"'altitude_chill' hufanya mwinuko wa juu baridi, ambayo inaweza kusababisha "
+"masuala ya biome.\n"
+"'humid_rivers' Inarekebisha unyevu kuzunguka mito na maeneo ambapo maji Je "
+"huwa na bwawa, inaweza kuingilia kati na biomes Imerekebisha maisha ya "
+"anasa.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen flat.\n"
+"Occasional lakes and hills can be added to the flat world.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+"Ramani kizazi sifa maalum kwa Mwandishi ramani gorofa.\n"
+"Maziwa mara kwa mara na vilima vinaweza kuongezwa kwa ulimwengu gorofa.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen v6.\n"
+"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
+"flag is ignored.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+"Ramani kizazi sifa maalum ya Mwandishi ramani v6.\n"
+"Wakati snowbiomes vimewezeshwa misitu otomatiki imewezeshwa, bendera ya "
+"'misitu' ni kupuuzwa.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Map generation attributes specific to Mapgen v7.\n"
+"The 'ridges' flag controls the rivers.\n"
+"Flags that are not specified in the flag string are not modified from the "
+"default.\n"
+"Flags starting with 'no' are used to explicitly disable them."
+msgstr ""
+"Ramani kizazi sifa maalum kwa Mwandishi ramani v7.\n"
+"Bendera ya 'matuta' udhibiti mito.\n"
+"Bendera ambayo haijabainishwa katika Tungo ya bendera ni hayakubadilishwa "
+"kutoka chaguo-msingi.\n"
+"Bendera kuanzia na 'hapana' hutumiwa kidhahiri Lemaza yao."
+
+#: src/settings_translation_file.cpp
+msgid "Map generation limit"
+msgstr "Kikomo cha kizazi cha ramani"
+
+#: src/settings_translation_file.cpp
+msgid "Map save interval"
+msgstr "Ramani hifadhi muda"
+
+#: src/settings_translation_file.cpp
+msgid "Mapblock limit"
+msgstr "Kikomo cha Mapblock"
+
+#: src/settings_translation_file.cpp
+msgid "Mapblock unload timeout"
+msgstr "Mkatiko Muda Mapblock wakipakua"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen Valleys"
+msgstr "Mwandishi ramani mabonde"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen biome heat noise parameters"
+msgstr "Mwandishi ramani biome joto kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen biome humidity blend noise parameters"
+msgstr "Mwandishi ramani biome unyevu mchanganyiko kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen biome humidity noise parameters"
+msgstr "Mwandishi ramani biome unyevu kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen debug"
+msgstr "Utatuaji wa Mwandishi ramani"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flags"
+msgstr "Bendera ya Mwandishi ramani"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat"
+msgstr "Mwandishi ramani gorofa"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat cave width"
+msgstr "Mwandishi ramani pango gorofa upana"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat cave1 noise parameters"
+msgstr "Mwandishi ramani cave1 za gorofa kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat cave2 noise parameters"
+msgstr "Mwandishi ramani cave2 za gorofa kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat filler depth noise parameters"
+msgstr "Filler wa gorofa ya Mwandishi ramani kina kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat flags"
+msgstr "Mwandishi ramani gorofa bendera"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat ground level"
+msgstr "Mwandishi ramani gorofa ngazi ya chini"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat hill steepness"
+msgstr "Mwandishi ramani gorofa kilima mwinuko"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat hill threshold"
+msgstr "Kilele cha mlima gorofa Mwandishi ramani"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat lake steepness"
+msgstr "Mwandishi ramani ziwa gorofa mwinuko"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat lake threshold"
+msgstr "Mwandishi ramani ziwa gorofa kizingiti"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat large cave depth"
+msgstr "Mwandishi ramani pango kubwa gorofa kina"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen flat terrain noise parameters"
+msgstr "Mwandishi ramani ardhi tambarare kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal"
+msgstr "Fractal ya Mwandishi ramani"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal cave width"
+msgstr "Mwandishi ramani fractal pango upana"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal cave1 noise parameters"
+msgstr "Mwandishi ramani fractal cave1 kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal cave2 noise parameters"
+msgstr "Mwandishi ramani fractal cave2 kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal filler depth noise parameters"
+msgstr "Mwandishi ramani fractal filler kina kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal fractal"
+msgstr "Mwandishi ramani fractal fractal"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal iterations"
+msgstr "Mwandishi ramani fractal Marudiorudio"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia w"
+msgstr "Mwandishi ramani fractal julia w"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia x"
+msgstr "Mwandishi ramani fractal julia x"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia y"
+msgstr "Mwandishi ramani fractal julia y"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal julia z"
+msgstr "Mwandishi ramani fractal julia z"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal offset"
+msgstr "Mwandishi ramani fractal Sawazisha"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal scale"
+msgstr "Mwandishi ramani fractal kipimo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal seabed noise parameters"
+msgstr "Mwandishi ramani fractal seabed kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen fractal slice w"
+msgstr "Mwandishi ramani fractal kisu w"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen heat blend noise parameters"
+msgstr "Mwandishi ramani joto mchanganyiko kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen name"
+msgstr "Mwandishi ramani jina"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5"
+msgstr "Mwandishi ramani v5"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 cave width"
+msgstr "Mwandishi ramani v5 pango upana"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 cave1 noise parameters"
+msgstr "Mwandishi ramani v5 cave1 kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 cave2 noise parameters"
+msgstr "Mwandishi ramani v5 cave2 kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 factor noise parameters"
+msgstr "Mwandishi ramani v5 sababu kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 filler depth noise parameters"
+msgstr "Mwandishi ramani v5 filler kina kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v5 height noise parameters"
+msgstr "Mwandishi ramani v5 urefu kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6"
+msgstr "Mwandishi ramani v6"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 apple trees noise parameters"
+msgstr "Mwandishi ramani v6 apple miti kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 beach frequency"
+msgstr "Mwandishi ramani v6 pwani marudio"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 beach noise parameters"
+msgstr "Mwandishi ramani v6 pwani kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 biome noise parameters"
+msgstr "Mwandishi ramani v6 biome kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 cave noise parameters"
+msgstr "Mwandishi ramani v6 pango kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 desert frequency"
+msgstr "Mwandishi ramani v6 jangwa marudio"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 flags"
+msgstr "Mwandishi ramani v6 bendera"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 height select noise parameters"
+msgstr "Mwandishi ramani v6 urefu Teua vigezo kelele"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 humidity noise parameters"
+msgstr "Mwandishi ramani v6 unyevu kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 mud noise parameters"
+msgstr "Mwandishi ramani v6 matope kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 steepness noise parameters"
+msgstr "Mwandishi ramani v6 mwinuko kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 terrain altitude noise parameters"
+msgstr "Mwinuko wa ardhi ya Mwandishi ramani v6 kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 terrain base noise parameters"
+msgstr "Mwandishi ramani v6 ardhi kelele msingi vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v6 trees noise parameters"
+msgstr "Mwandishi ramani v6 miti kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7"
+msgstr "Mwandishi ramani v7"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 cave width"
+msgstr "Mwandishi ramani v7 pango upana"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 cave1 noise parameters"
+msgstr "Mwandishi ramani v7 cave1 kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 cave2 noise parameters"
+msgstr "Mwandishi ramani v7 cave2 kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 filler depth noise parameters"
+msgstr "Mwandishi ramani v7 filler kina kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 flags"
+msgstr "Mwandishi ramani v7 bendera"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 height select noise parameters"
+msgstr "Mwandishi ramani v7 urefu Teua vigezo kelele"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 mount height noise parameters"
+msgstr "Mwandishi ramani v7 mlima urefu kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 mountain noise parameters"
+msgstr "Mwandishi ramani v7 mlima kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 ridge noise parameters"
+msgstr "Mwandishi ramani v7 tuta kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 ridge water noise parameters"
+msgstr "Mwandishi ramani v7 tuta maji kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 terrain altitude noise parameters"
+msgstr "Mwandishi ramani v7 ardhi mwinuko kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 terrain base noise parameters"
+msgstr "Mwandishi ramani v7 ardhi kelele msingi vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Mapgen v7 terrain persistation noise parameters"
+msgstr "Mwandishi ramani v7 ardhi persistation kelele vigezo"
+
+#: src/settings_translation_file.cpp
+msgid "Massive cave depth"
+msgstr "Kina ya pango mkubwa"
+
+#: src/settings_translation_file.cpp
+msgid "Massive cave noise"
+msgstr "Kelele ya pango mkubwa"
+
+#: src/settings_translation_file.cpp
+msgid "Massive caves form here."
+msgstr "Fomu ya mapango mkubwa hapa."
+
+#: src/settings_translation_file.cpp
+msgid "Max block generate distance"
+msgstr "Umbo la Max kuzalisha umbali"
+
+#: src/settings_translation_file.cpp
+msgid "Max block send distance"
+msgstr "Umbo la Max Tuma umbali"
+
+#: src/settings_translation_file.cpp
+msgid "Max liquids processed per step."
+msgstr "Max viowevu kusindika kwa kila hatua."
+
+#: src/settings_translation_file.cpp
+msgid "Max. clearobjects extra blocks"
+msgstr "Max. clearobjects vitalu vya ziada"
+
+#: src/settings_translation_file.cpp
+msgid "Max. packets per iteration"
+msgstr "Max. pakiti kila Marudiorudio"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum FPS"
+msgstr "Ramprogrammen juu"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum FPS when game is paused."
+msgstr "Ramprogrammen juu wakati mchezo umesitishwa."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum forceloaded blocks"
+msgstr "Forceloaded upeo vitalu"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum hotbar width"
+msgstr "Hotbar kiwango cha juu cha upana"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "Namba ya juu ya vitalu kwamba wakati huo huo hutumwa kwa jumla."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "Namba ya juu ya vitalu kwamba ni wakati huo huo uliotumwa kwa mteja."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that can be queued for loading."
+msgstr ""
+"Namba ya juu ya vitalu kwamba unaweza kwenye foleni kwa ajili ya kupakia."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of blocks to be queued that are to be generated.\n"
+"Set to blank for an appropriate amount to be chosen automatically."
+msgstr ""
+"Namba ya juu ya vitalu kwa kuwa kwenye foleni kwamba ni kutengenezwa.\n"
+"Seti kwa wazi kwa kiasi sahihi ili uweze kuchaguliwa moja kwa moja."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of blocks to be queued that are to be loaded from file.\n"
+"Set to blank for an appropriate amount to be chosen automatically."
+msgstr ""
+"Namba ya juu ya vitalu kwa kuwa kwenye foleni kwamba ni kupakiwa kutoka "
+"faili.\n"
+"Seti kwa wazi kwa kiasi sahihi ili uweze kuchaguliwa moja kwa moja."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of forceloaded mapblocks."
+msgstr "Namba ya juu ya forceloaded mapblocks."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of mapblocks for client to be kept in memory.\n"
+"Set to -1 for unlimited amount."
+msgstr ""
+"Namba ya juu ya mapblocks kwa mteja kwa kuwekwa katika kumbukumbu.\n"
+"Seti -1 kwa kiasi ukomo."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum number of packets sent per send step, if you have a slow connection\n"
+"try reducing it, but don't reduce it to a number below double of targeted\n"
+"client number."
+msgstr ""
+"Namba ya juu ya pakiti iliyotumwa kwa hatua ya kutuma, kama una muunganisho "
+"polepole jaribu kupunguza ni, lakini si ya kupunguza kadhaa chini ya mara "
+"mbili ya idadi ya mteja lengwa."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of players that can connect simultaneously."
+msgstr "Namba ya juu ya wachezaji ambao wanaweza kuunganisha wakati huo huo."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of statically stored objects in a block."
+msgstr "Namba ya juu ya vipengee statically kuhifadhiwa katika umbo la."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "Vipengee juu kwa kila fungu"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Maximum proportion of current window to be used for hotbar.\n"
+"Useful if there's something to be displayed right or left of hotbar."
+msgstr ""
+"Uwiano juu ya dirisha la sasa kutumika kwa ajili ya hotbar.\n"
+"Muhimu kama kuna kitu cha kuonyeshwa kulia au kushoto wa hotbar."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum simultaneous block sends per client"
+msgstr "Fungu juu ya samtidiga hutuma kwa mteja"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum simultaneous block sends total"
+msgstr "Fungu juu ya samtidiga hutuma jumla"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum time in ms a file download (e.g. a mod download) may take."
+msgstr ""
+"Muda wa juu zaidi katika ms kupakua faili (kwa mfano upakuaji na Moduli) "
+"inaweza kuchukua."
+
+#: src/settings_translation_file.cpp
+msgid "Maximum users"
+msgstr "Watumiaji wa kiwango cha juu"
+
+#: src/settings_translation_file.cpp
+msgid "Menus"
+msgstr "Menyu"
+
+#: src/settings_translation_file.cpp
+msgid "Mesh cache"
+msgstr "Kirudufu cha matundu"
+
+#: src/settings_translation_file.cpp
+msgid "Message of the day"
+msgstr "Ujumbe wa siku ya"
+
+#: src/settings_translation_file.cpp
+msgid "Message of the day displayed to players connecting."
+msgstr "Ujumbe wa siku ya kuonyeshwa kwa wachezaji kuunganisha."
+
+#: src/settings_translation_file.cpp
+msgid "Method used to highlight selected object."
+msgstr "Mbinu inayotumiwa kuonyesha kipengee kilichoteuliwa."
+
+#: src/settings_translation_file.cpp
+msgid "Minimap"
+msgstr "Ramani"
+
+#: src/settings_translation_file.cpp
+msgid "Minimap key"
+msgstr "Ufunguo wa minimap"
+
+#: src/settings_translation_file.cpp
+msgid "Minimap scan height"
+msgstr "Ramani tambazo urefu"
+
+#: src/settings_translation_file.cpp
+msgid "Minimum texture size for filters"
+msgstr "Unamu wa kima cha chini cha ukubwa wa Vichujio"
+
+#: src/settings_translation_file.cpp
+msgid "Mipmapping"
+msgstr "Mipmapping"
+
+#: src/settings_translation_file.cpp
+msgid "Modstore details URL"
+msgstr "Modstore maelezo URL"
+
+#: src/settings_translation_file.cpp
+msgid "Modstore download URL"
+msgstr "Modstore kupakua URL"
+
+#: src/settings_translation_file.cpp
+msgid "Modstore mods list URL"
+msgstr "Modstore mods orodha ya URL"
+
+#: src/settings_translation_file.cpp
+msgid "Monospace font path"
+msgstr "Monospace njia ya fonti"
+
+#: src/settings_translation_file.cpp
+msgid "Monospace font size"
+msgstr "Ukubwa wa fonti wa Monospace"
+
+#: src/settings_translation_file.cpp
+msgid "Mouse sensitivity"
+msgstr "Unyeti wa kipanya"
+
+#: src/settings_translation_file.cpp
+msgid "Mouse sensitivity multiplier."
+msgstr "Mengi ya unyeti wa kipanya."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Multiplier for fall bobbing.\n"
+"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
+msgstr ""
+"Mengi kwa ajili ya kuanguka kando.\n"
+"Kwa mfano: 0 kwa ajili ya Mwoneko hakuna kando; 1.0 kwa ajili ya kawaida; "
+"2.0 kwa mara mbili."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Multiplier for view bobbing.\n"
+"For example: 0 for no view bobbing; 1.0 for normal; 2.0 for double."
+msgstr ""
+"Mengi kwa ajili ya Mwoneko kando.\n"
+"Kwa mfano: 0 kwa ajili ya Mwoneko hakuna kando; 1.0 kwa ajili ya kawaida; "
+"2.0 kwa mara mbili."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Name of map generator to be used when creating a new world.\n"
+"Creating a world in the main menu will override this."
+msgstr ""
+"Jina la ramani jenereta kutumika wakati wa kuunda dunia mpya.\n"
+"Kujenga ulimwengu katika Menyu kuu itakuwa vinabatilisha hii."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Name of the player.\n"
+"When running a server, clients connecting with this name are admins.\n"
+"When starting from the main menu, this is overridden."
+msgstr ""
+"Jina la mchezaji.\n"
+"Wakati kuendesha seva, wateja kuunganisha kwa jina hili ni admins.\n"
+"Wakati kuanzia Menyu kuu, hii ni kuuharibu."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Name of the server, to be displayed when players join and in the serverlist."
+msgstr ""
+"Jina la seva, kuonyeshwa wakati wachezaji kujiunga na katika serverlist ya."
+
+#: src/settings_translation_file.cpp
+msgid "Network"
+msgstr "Mtandao"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Network port to listen (UDP).\n"
+"This value will be overridden when starting from the main menu."
+msgstr ""
+"Mtandao bandari kusikiliza (UDP).\n"
+"Thamani hii itakuwa kuuharibu wakati kuanzia Menyu kuu."
+
+#: src/settings_translation_file.cpp
+msgid "New users need to input this password."
+msgstr "Watumiaji wapya haja Ingiza nywila hii."
+
+#: src/settings_translation_file.cpp
+msgid "Noclip"
+msgstr "Noclip"
+
+#: src/settings_translation_file.cpp
+msgid "Noclip key"
+msgstr "Ufunguo wa Noclip"
+
+#: src/settings_translation_file.cpp
+msgid "Node highlighting"
+msgstr "Fundo udhulisho"
+
+#: src/settings_translation_file.cpp
+msgid "NodeTimer interval"
+msgstr "Nafasi ya NodeTimer"
+
+#: src/settings_translation_file.cpp
+msgid "Noise parameters for biome API temperature, humidity and biome blend."
+msgstr "Kelele vigezo vya biome API joto, unyevu na biome mchanganyiko."
+
+#: src/settings_translation_file.cpp
+msgid "Noises"
+msgstr "Kila"
+
+#: src/settings_translation_file.cpp
+msgid "Normalmaps sampling"
+msgstr "Sampuli ya Normalmaps"
+
+#: src/settings_translation_file.cpp
+msgid "Normalmaps strength"
+msgstr "Nguvu ya Normalmaps"
+
+#: src/settings_translation_file.cpp
+msgid "Number of emerge threads"
+msgstr "Idadi ya nyuzi emerge"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Number of emerge threads to use. Make this field blank, or increase this "
+"number\n"
+"to use multiple threads. On multiprocessor systems, this will improve mapgen "
+"speed greatly\n"
+"at the cost of slightly buggy caves."
+msgstr ""
+"Idadi ya nyuzi emerge kutumia. Kufanya hii shamba tupu, au kuongeza idadi "
+"hii kutumia nyuzi nyingi. Kwenye mifumo ya multiprocessor, hii itasaidia "
+"kuongeza kasi ya mwandishi ramani sana wanatengeneza mapango buggy kidogo."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Number of extra blocks that can be loaded by /clearobjects at once.\n"
+"This is a trade-off between sqlite transaction overhead and\n"
+"memory consumption (4096=100MB, as a rule of thumb)."
+msgstr ""
+"Idadi ya vitalu ziada ambayo inaweza kupakiwa na /clearobjects mara moja.\n"
+"Hii ni mikinzano kati sqlite shughuli uendeshaji na matumizi ya kumbukumbu "
+"(4096 = 100 MB, kama kanuni ya thumb)."
+
+#: src/settings_translation_file.cpp
+msgid "Number of parallax occlusion iterations."
+msgstr "Idadi ya parallax occlusion Marudiorudio."
+
+#: src/settings_translation_file.cpp
+msgid "Overall bias of parallax occlusion effect, usually scale/2."
+msgstr "Upendeleo wa jumla wa parallax occlusion athari, kawaida kipimo/2."
+
+#: src/settings_translation_file.cpp
+msgid "Overall scale of parallax occlusion effect."
+msgstr "Kipimo cha jumla ya parallax occlusion athari."
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion"
+msgstr "Parallax occlusion"
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion Scale"
+msgstr "Parallax occlusion wadogo"
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion bias"
+msgstr "Parallax occlusion upendeleo"
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion iterations"
+msgstr "Parallax occlusion Marudiorudio"
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion mode"
+msgstr "Parallax occlusion hali"
+
+#: src/settings_translation_file.cpp
+msgid "Parallax occlusion strength"
+msgstr "Parallax occlusion nguvu"
+
+#: src/settings_translation_file.cpp
+msgid "Path to TrueTypeFont or bitmap."
+msgstr "Njia ya TrueTypeFont au vitone michoro."
+
+#: src/settings_translation_file.cpp
+msgid "Path to save screenshots at."
+msgstr "Njia ya kuokoa viwambo katika."
+
+#: src/settings_translation_file.cpp
+msgid "Path to texture directory. All textures are first searched from here."
+msgstr "Njia ya orodha ya unamu. Unamu wote vinatafutizwa kwanza kutoka hapa."
+
+#: src/settings_translation_file.cpp
+msgid "Physics"
+msgstr "Fizikia"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Player is able to fly without being affected by gravity.\n"
+"This requires the \"fly\" privilege on the server."
+msgstr ""
+"Mchezaji ni uwezo wa kuruka bila kuwa walioathirika na mvuto.\n"
+"Hii inahitaji upendeleo \"kuruka\" kwenye seva."
+
+#: src/settings_translation_file.cpp
+msgid "Player name"
+msgstr "Jina la mchezaji"
+
+#: src/settings_translation_file.cpp
+msgid "Player transfer distance"
+msgstr "Umbali wa uhamisho wa mchezaji"
+
+#: src/settings_translation_file.cpp
+msgid "Player versus Player"
+msgstr "Mchezaji dhidi ya mchezaji"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Port to connect to (UDP).\n"
+"Note that the port field in the main menu overrides this setting."
+msgstr ""
+"Bandari ya kuunganishwa (UDP).\n"
+"Kumbuka kwamba uwanja wa bandari katika Menyu kuu Puuza kipimo hiki."
+
+#: src/settings_translation_file.cpp
+msgid "Prevent mods from doing insecure things like running shell commands."
+msgstr "Kuzuia mods kufanya mambo zisizo kama kuendesha amri ya Sheli."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+"Chapisha injini ya ubainishaji data katika vipindi vya kawaida (katika "
+"sekunde). 0 = Lemaza. Muhimu kwa watengenezaji."
+
+#: src/settings_translation_file.cpp
+msgid "Privileges that players with basic_privs can grant"
+msgstr "Marupurupu ya wachezaji na basic_privs unaweza ruzuku"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler"
+msgstr "Profiler"
+
+#: src/settings_translation_file.cpp
+msgid "Profiler toggle key"
+msgstr "Profiler kibonye"
+
+#: src/settings_translation_file.cpp
+msgid "Profiling"
+msgstr "Ubainishaji wa"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Radius of cloud area stated in number of 64 node cloud squares.\n"
+"Values larger than 26 will start to produce sharp cutoffs at cloud area "
+"corners."
+msgstr ""
+"Eneo la eneo la wingu alisema katika idadi ya 64 fundo wingu miraba.\n"
+"Thamani kubwa kuliko 26 itaanza kuzalisha cutoffs mkali katika wingu eneo la "
+"pembe."
+
+#: src/settings_translation_file.cpp
+msgid "Raises terrain to make valleys around the rivers"
+msgstr "Huwafufua ardhi kufanya mabonde kuzunguka mito"
+
+#: src/settings_translation_file.cpp
+msgid "Random input"
+msgstr "Ingizo la nasibu"
+
+#: src/settings_translation_file.cpp
+msgid "Range select key"
+msgstr "Kibonye Teua masafa"
+
+#: src/settings_translation_file.cpp
+msgid "Remote media"
+msgstr "Midia ya mbali"
+
+#: src/settings_translation_file.cpp
+msgid "Remote port"
+msgstr "Bandari ya mbali"
+
+#: src/settings_translation_file.cpp
+msgid "Replaces the default main menu with a custom one."
+msgstr "Kinabadilisha chaguo-msingi Menyu kuu kwa moja maalum."
+
+#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "Njia ya ripoti"
+
+#: src/settings_translation_file.cpp
+msgid "Right key"
+msgstr "Ufunguo sahihi"
+
+#: src/settings_translation_file.cpp
+msgid "Rightclick repetition interval"
+msgstr "Bofya kulia marudio nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "River Depth"
+msgstr "Kina wa mto"
+
+#: src/settings_translation_file.cpp
+msgid "River Noise"
+msgstr "Kelele za mto"
+
+#: src/settings_translation_file.cpp
+msgid "River Size"
+msgstr "Ukubwa wa mto"
+
+#: src/settings_translation_file.cpp
+msgid "River noise -- rivers occur close to zero"
+msgstr "Kelele za mto - mito kutokea karibu na sifuri"
+
+#: src/settings_translation_file.cpp
+msgid "Rollback recording"
+msgstr "Mserereko kurekodi"
+
+#: src/settings_translation_file.cpp
+msgid "Round minimap"
+msgstr "Ramani pande zote"
+
+#: src/settings_translation_file.cpp
+msgid "Save the map received by the client on disk."
+msgstr "Hifadhi ramani kupokelewa na mteja kwenye diski."
+
+#: src/settings_translation_file.cpp
+msgid "Saving map received from server"
+msgstr "Ramani kuokoa kupokea kutoka seva"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Scale gui by a user specified value.\n"
+"Use a nearest-neighbor-anti-alias filter to scale the GUI.\n"
+"This will smooth over some of the rough edges, and blend\n"
+"pixels when scaling down, at the cost of blurring some\n"
+"edge pixels when images are scaled by non-integer sizes."
+msgstr ""
+"Rekebisha gui kwa mtumiaji maalum thamani.\n"
+"Tumia kichujio karibu-jirani-Waanti-Lakabu Rekebisha GUI ya.\n"
+"Hii laini baadhi ya kingo mbaya, na mchanganyiko pikseli wakati upimaji "
+"chini, wanatengeneza ukungu wa jinsia pikseli baadhi makali wakati picha ni "
+"yamesimamisha na ukubwa wa yasiyo ya takwimu."
+
+#: src/settings_translation_file.cpp
+msgid "Screen height"
+msgstr "Urefu wa kiwamba"
+
+#: src/settings_translation_file.cpp
+msgid "Screen width"
+msgstr "Upana wa kiwamba"
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot"
+msgstr "Screenshot"
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot folder"
+msgstr "Screenshot kabrasha"
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot format"
+msgstr "Screenshot umbizo"
+
+#: src/settings_translation_file.cpp
+msgid "Screenshot quality"
+msgstr "Screenshot ubora"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Screenshot quality. Only used for JPEG format.\n"
+"1 means worst quality; 100 means best quality.\n"
+"Use 0 for default quality."
+msgstr ""
+"Screenshot ubora. Tu kutumika kwa ajili ya Umbiza JPEG.\n"
+"1 maana ubora mbaya; 100 humaanisha ubora.\n"
+"Tumia 0 kwa ubora wa chaguo-msingi."
+
+#: src/settings_translation_file.cpp
+msgid "Security"
+msgstr "Usalama"
+
+#: src/settings_translation_file.cpp
+msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
+msgstr "Ona http://www.sqlite.org/pragma.html#pragma_synchronous"
+
+#: src/settings_translation_file.cpp
+msgid "Selection box border color (R,G,B)."
+msgstr "Uteuzi kikasha mpaka rangi (R, G, B)."
+
+#: src/settings_translation_file.cpp
+msgid "Selection box color"
+msgstr "Uteuzi kikasha rangi"
+
+#: src/settings_translation_file.cpp
+msgid "Selection box width"
+msgstr "Uteuzi kikasha upana"
+
+#: src/settings_translation_file.cpp
+msgid "Server / Singleplayer"
+msgstr "Seva / Singleplayer"
+
+#: src/settings_translation_file.cpp
+msgid "Server URL"
+msgstr "URL ya seva"
+
+#: src/settings_translation_file.cpp
+msgid "Server address"
+msgstr "Anwani ya seva"
+
+#: src/settings_translation_file.cpp
+msgid "Server description"
+msgstr "Maelezo ya seva"
+
+#: src/settings_translation_file.cpp
+msgid "Server name"
+msgstr "Jina la seva"
+
+#: src/settings_translation_file.cpp
+msgid "Server port"
+msgstr "Kituo tarishi cha seva"
+
+#: src/settings_translation_file.cpp
+msgid "Serverlist URL"
+msgstr "URL ya Serverlist"
+
+#: src/settings_translation_file.cpp
+msgid "Serverlist file"
+msgstr "Faili ya Serverlist"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set the language. Leave empty to use the system language.\n"
+"A restart is required after changing this."
+msgstr ""
+"Seti lugha. Acha tupu kwa kutumia lugha ya mfumo.\n"
+"Kuanza upya inahitajika baada ya kubadilisha hii."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true enables waving leaves.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Kuweka huwezesha kweli waving majani.\n"
+"Inahitaji shaders kwa kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true enables waving plants.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Kuweka huwezesha kweli waving mimea.\n"
+"Inahitaji shaders kwa kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Set to true enables waving water.\n"
+"Requires shaders to be enabled."
+msgstr ""
+"Kuweka huwezesha kweli waving maji.\n"
+"Inahitaji shaders kwa kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Shaders allow advanced visual effects and may increase performance on some "
+"video cards.\n"
+"Thy only work with the OpenGL video backend."
+msgstr ""
+"Shaders kuruhusu athari pevu onekana na inaweza kuongeza utendaji wa baadhi "
+"ya kadi ya video.\n"
+"Kazi yako tu na OpenGL video backend."
+
+#: src/settings_translation_file.cpp
+msgid "Shape of the minimap. Enabled = round, disabled = square."
+msgstr "Sura ya minimap ya. Kuwezeshwa = pande zote, walemavu = mraba."
+
+#: src/settings_translation_file.cpp
+msgid "Show debug info"
+msgstr "Onyesha maelezo kuhusu marekebisho"
+
+#: src/settings_translation_file.cpp
+msgid "Show entity selection boxes"
+msgstr "Onyesha chombo masanduku ya uteuzi"
+
+#: src/settings_translation_file.cpp
+msgid "Shutdown message"
+msgstr "Uzimaji ujumbe"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Size of chunks to be generated at once by mapgen, stated in mapblocks (16 "
+"nodes)."
+msgstr ""
+"Ukubwa wa kikidondoka kutengenezwa mara kwa mwandishi ramani, katika "
+"mapblocks (fundo 16)."
+
+#: src/settings_translation_file.cpp
+msgid "Slope and fill work together to modify the heights"
+msgstr "Mteremko na Jaza kazi pamoja kurekebisha urefu"
+
+#: src/settings_translation_file.cpp
+msgid "Smooth lighting"
+msgstr "Taa laini"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
+"Useful for recording videos."
+msgstr ""
+"Smooths kamera wakati wa kutafuta karibu. Pia huitwa kuangalia au kipanya "
+"unyooshaji.\n"
+"Muhimu kwa ajili ya kurekodi video."
+
+#: src/settings_translation_file.cpp
+msgid "Smooths rotation of camera in cinematic mode. 0 to disable."
+msgstr "Smooths mzunguko wa kamera katika hali-tumizi cinematic. 0 kulemaza."
+
+#: src/settings_translation_file.cpp
+msgid "Smooths rotation of camera. 0 to disable."
+msgstr "Smooths mzunguko wa kamera. 0 kulemaza."
+
+#: src/settings_translation_file.cpp
+msgid "Sneak key"
+msgstr "Zawadi muhimu"
+
+#: src/settings_translation_file.cpp
+msgid "Sound"
+msgstr "Sauti"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Specifies URL from which client fetches media instead of using UDP.\n"
+"$filename should be accessible from $remote_media$filename via cURL\n"
+"(obviously, remote_media should end with a slash).\n"
+"Files that are not present will be fetched the usual way."
+msgstr ""
+"Inabainisha URL kutoka ambayo mteja fetches vyombo vya habari badala ya "
+"kutumia UDP.\n"
+"$filename lazima kupatikana kutoka $remote_media$ JinaFaili kupitia cURL (ni "
+"wazi, remote_media lazima kumaliza na kufyeka na).\n"
+"Faili ambayo sasa itakuwa kuwa fetched njia ya kawaida."
+
+#: src/settings_translation_file.cpp
+msgid "Static spawnpoint"
+msgstr "Spawnpoint tuli"
+
+#: src/settings_translation_file.cpp
+msgid "Strength of generated normalmaps."
+msgstr "Nguvu ya normalmaps inayozalishwa."
+
+#: src/settings_translation_file.cpp
+msgid "Strength of parallax."
+msgstr "Nguvu ya parallax."
+
+#: src/settings_translation_file.cpp
+msgid "Strict protocol checking"
+msgstr "Itifaki ya kali kukagua"
+
+#: src/settings_translation_file.cpp
+msgid "Support older servers"
+msgstr "Msaada mkubwa seva"
+
+#: src/settings_translation_file.cpp
+msgid "Synchronous SQLite"
+msgstr "SQLite Uvingirizi"
+
+#: src/settings_translation_file.cpp
+msgid "Terrain Height"
+msgstr "Urefu wa ardhi"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Terrain noise threshold for hills.\n"
+"Controls proportion of world area covered by hills.\n"
+"Adjust towards 0.0 for a larger proportion."
+msgstr ""
+"Ardhi kelele kizingiti kwa milima.\n"
+"Vidhibiti vya uwiano wa dunia eneo lililofunikwa na milima.\n"
+"Rekebisha kuelekea 0.0 kwa sehemu kubwa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Terrain noise threshold for lakes.\n"
+"Controls proportion of world area covered by lakes.\n"
+"Adjust towards 0.0 for a larger proportion."
+msgstr ""
+"Ardhi kelele kizingiti kwa ajili ya maziwa.\n"
+"Vidhibiti vya uwiano wa dunia eneo lililofunikwa na maziwa.\n"
+"Rekebisha kuelekea 0.0 kwa sehemu kubwa."
+
+#: src/settings_translation_file.cpp
+msgid "Texture path"
+msgstr "Njia ya unamu"
+
+#: src/settings_translation_file.cpp
+msgid "The altitude at which temperature drops by 20C"
+msgstr "Mwinuko katika matone ambayo joto na 20C"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"Umbizo wa chaguo-msingi ambayo maumbo ni kuokoka, wakati wito '/ profiler\n"
+"Hifadhi [umbizo]' bila umbizo."
+
+#: src/settings_translation_file.cpp
+msgid "The depth of dirt or other filler"
+msgstr "Kina cha uchafu au filler nyingine"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+"Kijia cha faili jamaa yako worldpath ambayo maumbo utaakibishwa kwenye.\n"
+
+#: src/settings_translation_file.cpp
+msgid "The network interface that the server listens on."
+msgstr "Interface mtandao kwamba seva husikiliza juu."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The privileges that new users automatically get.\n"
+"See /privs in game for a full list on your server and mod configuration."
+msgstr ""
+"Upendeleo kwamba watumiaji wapya otomatiki kupata.\n"
+"Ona /privs katika mchezo kwa ajili ya orodha kamili kwenye msabidi wa seva "
+"na Moduli."
+
+#: src/settings_translation_file.cpp
+msgid "The rendering back-end for Irrlicht."
+msgstr "Utungulizaji nyuma-mwisho wa Irrlicht."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr "Unyeti wa Jira kifimbocheza kwa kuzunguka Mwoneko ingame frustum."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The strength (darkness) of node ambient-occlusion shading.\n"
+"Lower is darker, Higher is lighter. The valid range of values for this\n"
+"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
+"set to the nearest valid value."
+msgstr ""
+"Nguvu (giza) ya fundo iliyoko occlusion kivuli.\n"
+"Chini ni nyeusi, juu ni hafifu. Masafa halali ya thamani kwa ajili ya kipimo "
+"hiki ni 0.25 kwa 4.0 jumuishi. Kama thamani iko nje ya masafa ni itasetiwa "
+"kwenye ya karibu Thamani halali."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time (in seconds) that the liquids queue may grow beyond processing\n"
+"capacity until an attempt is made to decrease its size by dumping old queue\n"
+"items. A value of 0 disables the functionality."
+msgstr ""
+"Muda (katika sekunde) kuwa foleni ya viowevu inaweza kukua zaidi usindikaji "
+"uwezo hadi jaribio ni alifanya kupungua ukubwa wake na utupaji vipengee "
+"kongwe ya foleni. Thamani ya 0 Hulemaza utendaji."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"Wakati katika sekunde inachukua kati ya matukio ya mara kwa mara wakati "
+"kushikilia chini kifimbocheza kitufe mchanganyiko."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"The time in seconds it takes between repeated right clicks when holding the "
+"right mouse button."
+msgstr ""
+"Wakati katika sekunde inachukua kati ya vibonyezo mara kwa mara sahihi "
+"wakati wa kufanya kitufe cha kulia."
+
+#: src/settings_translation_file.cpp
+msgid "This font will be used for certain languages."
+msgstr "Fonti hii itatumika kwa lugha fulani."
+
+#: src/settings_translation_file.cpp
+msgid "Time in between active block management cycles"
+msgstr "Muda kati ya mizunguko ya usimamizi ya fungu amilifu"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Time in seconds for item entity (dropped items) to live.\n"
+"Setting it to -1 disables the feature."
+msgstr ""
+"Wakati katika sekunde kwa kipengee chombo (vitu chopo) kuishi.\n"
+"Kuweka kwa -1 Hulemaza kipengele."
+
+#: src/settings_translation_file.cpp
+msgid "Time send interval"
+msgstr "Wakati kutuma nafasi"
+
+#: src/settings_translation_file.cpp
+msgid "Time speed"
+msgstr "Kasi ya muda"
+
+#: src/settings_translation_file.cpp
+msgid "Timeout for client to remove unused map data from memory."
+msgstr ""
+"Muda wa kuisha kwa mteja kuondoa data ya ramani zisizotumika kutoka kwa "
+"kumbukumbu."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"To reduce lag, block transfers are slowed down when a player is building "
+"something.\n"
+"This determines how long they are slowed down after placing or removing a "
+"node."
+msgstr ""
+"Kupunguza bakia, uhamisho wa fungu ni sjunkit wakati mchezaji ni kujenga "
+"kitu.\n"
+"Hii huamua lini wao ni sjunkit baada ya kuweka au kuondoa fundo."
+
+#: src/settings_translation_file.cpp
+msgid "Toggle camera mode key"
+msgstr "Togoa kamera hali muhimu"
+
+#: src/settings_translation_file.cpp
+msgid "Tooltip delay"
+msgstr "Kidokezozana kuchelewa"
+
+#: src/settings_translation_file.cpp
+msgid "Trilinear filtering"
+msgstr "Uchujaji wa trilinear"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"True = 256\n"
+"False = 128\n"
+"Useable to make minimap smoother on slower machines."
+msgstr ""
+"Kweli = 256 bandia = Useable 128 kufanya minimap laini juu ya mashine "
+"polepole."
+
+#: src/settings_translation_file.cpp
+msgid "Trusted mods"
+msgstr "Mods aminifu"
+
+#: src/settings_translation_file.cpp
+msgid "URL to the server list displayed in the Multiplayer Tab."
+msgstr ""
+"URL kwenye orodha ya seva iliyoonyeshwa katika kichupo cha Multiplayer."
+
+#: src/settings_translation_file.cpp
+msgid "Unlimited player transfer distance"
+msgstr "Umbali wa uhamisho wa mchezaji ukomo"
+
+#: src/settings_translation_file.cpp
+msgid "Unload unused server data"
+msgstr "Wakipakua zisizotumika seva ya data"
+
+#: src/settings_translation_file.cpp
+msgid "Use 3D cloud look instead of flat."
+msgstr "Matumizi wingu 3D kuangalia badala ya gorofa."
+
+#: src/settings_translation_file.cpp
+msgid "Use a cloud animation for the main menu background."
+msgstr "Tumia uhuishaji wa wingu ya mandharinyuma ya Menyu kuu."
+
+#: src/settings_translation_file.cpp
+msgid "Use anisotropic filtering when viewing at textures from an angle."
+msgstr "Tumia uchujaji anisotropic wakati unatazama katika unamu kutoka pembe."
+
+#: src/settings_translation_file.cpp
+msgid "Use bilinear filtering when scaling textures."
+msgstr "Tumia uchujaji bilinear wakati upimaji unamu."
+
+#: src/settings_translation_file.cpp
+msgid "Use key"
+msgstr "Ufunguo wa matumizi"
+
+#: src/settings_translation_file.cpp
+msgid "Use mip mapping to scale textures. May slightly increase performance."
+msgstr ""
+"Tumia ramani ya malaria kwa kipimo cha unamu. Huenda kidogo kuongeza "
+"utendaji."
+
+#: src/settings_translation_file.cpp
+msgid "Use trilinear filtering when scaling textures."
+msgstr "Tumia uchujaji trilinear wakati upimaji unamu."
+
+#: src/settings_translation_file.cpp
+msgid "V-Sync"
+msgstr "V-ulandanishi"
+
+#: src/settings_translation_file.cpp
+msgid "VBO"
+msgstr "VBO"
+
+#: src/settings_translation_file.cpp
+msgid "Valley Depth"
+msgstr "Kina wa Bonde"
+
+#: src/settings_translation_file.cpp
+msgid "Valley Fill"
+msgstr "Jaza ya Bonde"
+
+#: src/settings_translation_file.cpp
+msgid "Valley Profile"
+msgstr "Maelezo mafupi ya Bonde"
+
+#: src/settings_translation_file.cpp
+msgid "Valley Slope"
+msgstr "Mteremko wa Bonde"
+
+#: src/settings_translation_file.cpp
+msgid "Valleys C Flags"
+msgstr "Bendera ya mabonde C"
+
+#: src/settings_translation_file.cpp
+msgid "Vertical screen synchronization."
+msgstr "Ulandanishi wa kiwamba wima."
+
+#: src/settings_translation_file.cpp
+msgid "Video driver"
+msgstr "Kiendeshaji video"
+
+#: src/settings_translation_file.cpp
+msgid "View bobbing"
+msgstr "Mwoneko kando"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"View distance in nodes.\n"
+"Min = 20"
+msgstr ""
+"Onyesha umbali katika fundo.\n"
+"Min = 20"
+
+#: src/settings_translation_file.cpp
+msgid "View range decrease key"
+msgstr "Mwoneko masafa Punguza ufunguo"
+
+#: src/settings_translation_file.cpp
+msgid "View range increase key"
+msgstr "Mwoneko masafa ongezeko muhimu"
+
+#: src/settings_translation_file.cpp
+msgid "Viewing range"
+msgstr "Kuonyesha masafa"
+
+#: src/settings_translation_file.cpp
+msgid "Volume"
+msgstr "Kiasi"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"W co-ordinate of the generated 3D slice of a 4D fractal.\n"
+"Determines which 3D slice of the 4D shape is generated.\n"
+"Has no effect on 3D fractals.\n"
+"Range roughly -2 to 2."
+msgstr ""
+"W kuratibu ya yanayotokana 3D kisu wa fractal wa 4 D.\n"
+"Huamua kisu ambayo 3D wa umbo 4D huundwa.\n"
+"Ina athari 3D fractals.\n"
+"Masafa ya takribani-2 hadi 2."
+
+#: src/settings_translation_file.cpp
+msgid "Walking speed"
+msgstr "Kutembea kasi"
+
+#: src/settings_translation_file.cpp
+msgid "Water Features"
+msgstr "Vipengele vya maji"
+
+#: src/settings_translation_file.cpp
+msgid "Water level"
+msgstr "Kiwango cha maji"
+
+#: src/settings_translation_file.cpp
+msgid "Water surface level of the world."
+msgstr "Maji ngazi ya uso wa dunia."
+
+#: src/settings_translation_file.cpp
+msgid "Waving Nodes"
+msgstr "Waving fundo"
+
+#: src/settings_translation_file.cpp
+msgid "Waving leaves"
+msgstr "Waving majani"
+
+#: src/settings_translation_file.cpp
+msgid "Waving plants"
+msgstr "Waving mimea"
+
+#: src/settings_translation_file.cpp
+msgid "Waving water"
+msgstr "Waving maji"
+
+#: src/settings_translation_file.cpp
+msgid "Waving water height"
+msgstr "Waving maji urefu"
+
+#: src/settings_translation_file.cpp
+msgid "Waving water length"
+msgstr "Waving maji urefu"
+
+#: src/settings_translation_file.cpp
+msgid "Waving water speed"
+msgstr "Waving kasi ya maji"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"When gui_scaling_filter is true, all GUI images need to be\n"
+"filtered in software, but some images are generated directly\n"
+"to hardware (e.g. render-to-texture for nodes in inventory)."
+msgstr ""
+"Wakati gui_scaling_filter ni kweli, yote GUI picha haja ya kuchujwa katika "
+"programu, lakini taswira zingine hutolewa moja kwa moja kwa maunzi (k.m "
+"kutoa-kwa-unamu kwa fundo katika hesabu)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"When gui_scaling_filter_txr2img is true, copy those images\n"
+"from hardware to software for scaling. When false, fall back\n"
+"to the old scaling method, for video drivers that don't\n"
+"properly support downloading textures back from hardware."
+msgstr ""
+"Wakati gui_scaling_filter_txr2img ni kweli, kunakili picha hizo kutoka "
+"maunzi na programu kwa ajili ya kurekebisha. Wakati uongo, kuanguka nyuma "
+"kwa mbinu ya zamani ya kipimo, kwa madereva video vizuri siungi mkono unamu "
+"Inapakua nyuma kutoka maunzi."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"When using bilinear/trilinear/anisotropic filters, low-resolution textures\n"
+"can be blurred, so automatically upscale them with nearest-neighbor\n"
+"interpolation to preserve crisp pixels. This sets the minimum texture size\n"
+"for the upscaled textures; higher values look sharper, but require more\n"
+"memory. Powers of 2 are recommended. Setting this higher than 1 may not\n"
+"have a visible effect unless bilinear/trilinear/anisotropic filtering is\n"
+"enabled."
+msgstr ""
+"Wakati wa kutumia Vichujio bilinear/trilinear/anisotropic, unamu low-"
+"resolution unaweza kizunguzungu, hivyo otomatiki upscale yao na karibu "
+"jirani interpolation kuhifadhi pikseli hubainisha. Hii Seti Ukubwa wa unamu "
+"chini kwa ajili ya unamu upscaled; thamani ya juu kuangalia kali, lakini "
+"zinahitaji kumbukumbu zaidi. Nguvu ya 2 ni ilipendekeza. Kuweka hii zaidi "
+"1 usiwe na athari inayoonekana isipokuwa uchujaji wa bilinear/trilinear/"
+"anisotropic ni kuwezeshwa."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Where the map generator stops.\n"
+"Please note:\n"
+"- Limited to 31000 (setting above has no effect)\n"
+"- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n"
+"- Those groups have an offset of -32, -32 nodes from the origin.\n"
+"- Only groups which are within the map_generation_limit are generated"
+msgstr ""
+"Ambapo jenereta ramani hukomesha.\n"
+"Tafadhali kumbuka: - mdogo kwa 31000 (kipimo hapo juu ina athari) - jenereta "
+"ramani kazi katika makundi ya 80 x 80 x 80 fundo (5 x 5 x 5 MapBlocks).\n"
+"-Vikundi hivyo kuwa nje ya uwekaji wa-32,-32 fundo kutoka asili.\n"
+"-Tu vikundi vilivyo ndani ya map_generation_limit ni yanayotokana"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether freetype fonts are used, requires freetype support to be compiled in."
+msgstr ""
+"Kama freetype fonti hutumiwa, inahitaji msaada wa freetype kuwa alikusanya "
+"katika."
+
+#: src/settings_translation_file.cpp
+msgid "Whether node texture animations should be desynchronized per mapblock."
+msgstr "Kama fundo unamu uhuishaji lazima desynchronized kwa mapblock."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether players are shown to clients without any range limit.\n"
+"Deprecated, use the setting player_transfer_distance instead."
+msgstr ""
+"Kama wachezaji huonyeshwa kwa wateja bila kikomo yoyote mbalimbali.\n"
+"Deprecated, Tumia kipimo player_transfer_distance badala yake."
+
+#: src/settings_translation_file.cpp
+msgid "Whether to allow players to damage and kill each other."
+msgstr "Kama kuruhusu wachezaji kuharibu na kuua kila mmoja."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether to ask clients to reconnect after a (Lua) crash.\n"
+"Set this to true if your server is set up to restart automatically."
+msgstr ""
+"Kama kuuliza wateja kuunganisha baada (Lua) ajali.\n"
+"Seti hii kweli kama seva yako ni kuanzisha kuwasha upya otomatiki."
+
+#: src/settings_translation_file.cpp
+msgid "Whether to fog out the end of the visible area."
+msgstr "Kama ukungu nje mwisho wa eneo hili dhahiri."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether to show the client debug info (has the same effect as hitting F5)."
+msgstr ""
+"Kama kuonyesha mteja Rekebisha taarifa (ina athari sawa kama kupiga F5)."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Whether to support older servers before protocol version 25.\n"
+"Enable if you want to connect to 0.4.12 servers and before.\n"
+"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
+"Disabling this option will protect your password better."
+msgstr ""
+"Kama kusaidia seva za zamani kabla ya Itifaki ya toleo la 25.\n"
+"Wezesha kama unataka kuunganishwa 0.4.12 seva na kabla.\n"
+"Seva kuanzia na 0.4.13 kazi, 0.4.12-dev seva huenda kazi.\n"
+"Mlemavu chaguo hili kulinda nywila yako bora."
+
+#: src/settings_translation_file.cpp
+msgid "Width component of the initial window size."
+msgstr "Upana sehemu ya ukubwa cha kidirisha awali."
+
+#: src/settings_translation_file.cpp
+msgid "Width of the selectionbox's lines around nodes."
+msgstr "Upana wa mistari ya selectionbox karibu fundo."
+
+#: src/settings_translation_file.cpp
+msgid ""
+"World directory (everything in the world is stored here).\n"
+"Not needed if starting from the main menu."
+msgstr ""
+"Mpangilio orodha ulimwengu (kila kitu ulimwenguni kuhifadhiwa hapa).\n"
+"Si zinahitajika kama kuanzia Menyu kuu."
+
+#: src/settings_translation_file.cpp
+msgid "Y of flat ground."
+msgstr "Y ya ardhi tambarare."
+
+#: src/settings_translation_file.cpp
+msgid "Y of upper limit of large pseudorandom caves."
+msgstr "Y ya upper kikomo ya kubwa pseudorandom cellars."
+
+#: src/settings_translation_file.cpp
+msgid "cURL file download timeout"
+msgstr "cURL muda wa upakuzi wa faili"
+
+#: src/settings_translation_file.cpp
+msgid "cURL parallel limit"
+msgstr "cURL kikomo sambamba"
+
+#: src/settings_translation_file.cpp
+msgid "cURL timeout"
+msgstr "muda wa kuisha wa cURL"
diff --git a/po/tr/minetest.po b/po/tr/minetest.po
index b3c063d21..5348a0590 100644
--- a/po/tr/minetest.po
+++ b/po/tr/minetest.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
"PO-Revision-Date: 2015-10-27 16:46+0200\n"
"Last-Translator: PilzAdam <PilzAdam@minetest.net>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/minetest/"
@@ -611,6 +611,10 @@ msgid "Particles"
msgstr "Hepsini etkinleÅŸtir"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Tek kişilik oyunu sıfırlayın"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "Ayarlar"
@@ -993,6 +997,10 @@ msgstr "Noclip aç/kapa"
msgid "Use"
msgstr "Kullan"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "Yakınlaştır"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "tuÅŸa bas"
@@ -1309,10 +1317,6 @@ msgstr "X Button 1"
msgid "X Button 2"
msgstr "X Button 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "Yakınlaştır"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1381,6 +1385,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1456,6 +1464,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "Geri"
@@ -1492,6 +1504,10 @@ msgid "Build inside player"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Engebeler"
@@ -1534,6 +1550,11 @@ msgid "Chat toggle key"
msgstr "Tuşları değiştir"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Komut"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1610,14 +1631,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1773,6 +1794,10 @@ msgid "Default privileges"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1789,6 +1814,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1819,14 +1848,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1839,6 +1860,18 @@ msgid "Disable anticheat"
msgstr "Parçacıkları etkinleştir"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
@@ -1865,6 +1898,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Enable VBO"
msgstr "Paketi Aç"
@@ -1951,6 +1988,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2012,11 +2057,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2155,12 +2210,14 @@ msgid "Generate normalmaps"
msgstr "Normal haritalar oluÅŸtur"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2192,6 +2249,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2220,15 +2286,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2323,6 +2380,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2358,6 +2449,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2518,6 +2617,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2553,7 +2659,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2705,6 +2811,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2739,8 +2860,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2750,8 +2869,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2762,8 +2879,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2773,8 +2888,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3155,6 +3268,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3196,17 +3317,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3218,10 +3343,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
#, fuzzy
msgid "Menus"
msgstr "Menü"
@@ -3264,10 +3385,6 @@ msgid "Mipmapping"
msgstr "Mip-Mapping"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3480,11 +3597,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3492,7 +3615,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3529,6 +3652,11 @@ msgstr ""
#: src/settings_translation_file.cpp
#, fuzzy
+msgid "Report path"
+msgstr "Seç"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
msgid "Right key"
msgstr "SaÄŸ Menu"
@@ -3697,7 +3825,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3735,7 +3863,7 @@ msgstr "Pürüzsüz ışıklandırma"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3817,10 +3945,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3836,6 +3976,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3851,6 +3997,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3955,11 +4107,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-#, fuzzy
-msgid "Useful for mod developers."
-msgstr "Ana geliÅŸtiriciler"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -4095,7 +4242,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4196,59 +4343,60 @@ msgid "cURL timeout"
msgstr ""
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Dokular yükleniyor..."
+#~ msgid "Useful for mod developers."
+#~ msgstr "Ana geliÅŸtiriciler"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Tek kişilik oyunu sıfırlayın"
+#~ msgid "No of course not!"
+#~ msgstr "Elbette hayır!"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "Ölçeklendirme menülere işlendi:"
+#~ msgid "Public Serverlist"
+#~ msgstr "Çevirimiçi Oyun Listesi"
-#~ msgid "Touch free target"
-#~ msgstr "Touch free target"
+#, fuzzy
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Normal haritalar oluÅŸtur"
-#~ msgid "Downloading"
-#~ msgstr "Ä°ndiriliyor"
+#~ msgid "No!!!"
+#~ msgstr "Hayır!!!"
-#~ msgid "please wait..."
-#~ msgstr "lütfen bekleyin..."
+#~ msgid "\""
+#~ msgstr "\""
-#~ msgid " KB/s"
-#~ msgstr " KB/s"
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Paketi Kapat"
-#~ msgid " MB/s"
-#~ msgstr " MB/s"
+#, fuzzy
+#~ msgid "If enabled, "
+#~ msgstr "EtkinleÅŸtirildi"
-#~ msgid "Numpad "
-#~ msgstr "Numpad "
+#~ msgid "Rendering:"
+#~ msgstr "Kaplama:"
#~ msgid "Restart minetest for driver change to take effect"
#~ msgstr "Değişikliklerin etkin olabilmesi için minetesti yeniden başlatın"
-#~ msgid "Rendering:"
-#~ msgstr "Kaplama:"
+#~ msgid "Numpad "
+#~ msgstr "Numpad "
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "EtkinleÅŸtirildi"
+#~ msgid " MB/s"
+#~ msgstr " MB/s"
-#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Paketi Kapat"
+#~ msgid " KB/s"
+#~ msgstr " KB/s"
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "please wait..."
+#~ msgstr "lütfen bekleyin..."
-#~ msgid "No!!!"
-#~ msgstr "Hayır!!!"
+#~ msgid "Downloading"
+#~ msgstr "Ä°ndiriliyor"
-#, fuzzy
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Normal haritalar oluÅŸtur"
+#~ msgid "Touch free target"
+#~ msgstr "Touch free target"
-#~ msgid "Public Serverlist"
-#~ msgstr "Çevirimiçi Oyun Listesi"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "Ölçeklendirme menülere işlendi:"
-#~ msgid "No of course not!"
-#~ msgstr "Elbette hayır!"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "Dokular yükleniyor..."
diff --git a/po/uk/minetest.po b/po/uk/minetest.po
index 4a2101d76..0035c792f 100644
--- a/po/uk/minetest.po
+++ b/po/uk/minetest.po
@@ -7,18 +7,18 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-10 00:06+0000\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-12-13 22:32+0000\n"
"Last-Translator: Fixer <artem.brz@gmail.com>\n"
-"Language-Team: Ukrainian "
-"<https://hosted.weblate.org/projects/minetest/minetest/uk/>\n"
+"Language-Team: Ukrainian <https://hosted.weblate.org/projects/minetest/"
+"minetest/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<="
-"4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 2.7-dev\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 2.10-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -87,14 +87,12 @@ msgid "Depends:"
msgstr "Залежить від:"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "Disable MP"
-msgstr "Вимкнути МП"
+msgstr "Вимкнути модпак"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "Enable MP"
-msgstr "Увімкнути МП"
+msgstr "Увімкнути модпак"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Enable all"
@@ -113,13 +111,12 @@ msgid "Hide Game"
msgstr "Приховати гру"
#: builtin/mainmenu/dlg_config_world.lua
-#, fuzzy
msgid "Hide mp content"
-msgstr "Приховати мп контент"
+msgstr "Сховати вміÑÑ‚ модпаку"
#: builtin/mainmenu/dlg_config_world.lua
msgid "Mod:"
-msgstr "МодифікаціÑ:"
+msgstr "Мод:"
#: builtin/mainmenu/dlg_config_world.lua
#: builtin/mainmenu/dlg_settings_advanced.lua src/guiKeyChangeMenu.cpp
@@ -466,7 +463,7 @@ msgstr "ТворчіÑÑ‚ÑŒ"
#: builtin/mainmenu/tab_server.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_singleplayer.lua
msgid "Enable Damage"
-msgstr "Увімкнути пораненнÑ"
+msgstr "ПораненнÑ"
#: builtin/mainmenu/tab_server.lua
msgid "Name/Password"
@@ -538,9 +535,8 @@ msgid "Bilinear Filter"
msgstr "Білінійна фільтраціÑ"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
-msgstr "Бамп-маппінг"
+msgstr "Бамп маппінг"
#: builtin/mainmenu/tab_settings.lua
msgid "Change keys"
@@ -548,11 +544,11 @@ msgstr "Змінити клавіші"
#: builtin/mainmenu/tab_settings.lua
msgid "Connected Glass"
-msgstr "З'єднане Ñкло"
+msgstr "З'єднувати Ñкло"
#: builtin/mainmenu/tab_settings.lua
msgid "Fancy Leaves"
-msgstr "Гарні лиÑÑ‚Ñ"
+msgstr "Гарне лиÑÑ‚Ñ"
#: builtin/mainmenu/tab_settings.lua
msgid "Mipmap"
@@ -568,7 +564,7 @@ msgstr "ÐÑ–"
#: builtin/mainmenu/tab_settings.lua
msgid "No Filter"
-msgstr "Без фільтруваннÑ"
+msgstr "Без фільтрації"
#: builtin/mainmenu/tab_settings.lua
msgid "No Mipmap"
@@ -607,6 +603,10 @@ msgid "Particles"
msgstr "ЧаÑточки"
#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "Скинути Ñвіт однокориÑтувацької гри"
+
+#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
msgstr "ÐалаштуваннÑ"
@@ -896,7 +896,7 @@ msgstr "Далі"
#: src/guiKeyChangeMenu.cpp
msgid "\"Use\" = climb down"
-msgstr "\"ВикориÑтовувати\" = підніматиÑÑ Ð² гору"
+msgstr "\"ВикориÑтовувати\" = підніматиÑÑ Ð²Ð³Ð¾Ñ€Ñƒ"
#: src/guiKeyChangeMenu.cpp
msgid "Backward"
@@ -984,6 +984,11 @@ msgstr "Переключити режим Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÑ€Ñ–Ð·ÑŒ ÑÑ‚
msgid "Use"
msgstr "ВикориÑтовувати"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+#, fuzzy
+msgid "Zoom"
+msgstr "Збільшити"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "ÐатиÑніть клавішу"
@@ -1302,11 +1307,6 @@ msgstr "Додаткова кнопка 1"
msgid "X Button 2"
msgstr "Додаткова кнопка 2"
-#: src/keycode.cpp
-#, fuzzy
-msgid "Zoom"
-msgstr "Збільшити"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1376,6 +1376,10 @@ msgid "Active Block Modifier interval"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Active block range"
msgstr ""
@@ -1450,6 +1454,10 @@ msgid "Automaticaly report to the serverlist."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
#, fuzzy
msgid "Backward key"
msgstr "Ðазад"
@@ -1483,6 +1491,10 @@ msgid "Build inside player"
msgstr "Будувати в межах гравцÑ"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "Бамп-маппінг"
@@ -1524,6 +1536,11 @@ msgid "Chat toggle key"
msgstr "Чат"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "Команди чату"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1564,7 +1581,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Client and Server"
-msgstr ""
+msgstr "Клієнт Ñ– Ñервер"
#: src/settings_translation_file.cpp
msgid "Climbing speed"
@@ -1596,14 +1613,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
#: src/settings_translation_file.cpp
@@ -1750,6 +1767,10 @@ msgid "Default privileges"
msgstr "Стандартні права"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1766,6 +1787,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr ""
@@ -1796,14 +1821,6 @@ msgid "Desynchronize block animation"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1815,6 +1832,18 @@ msgid "Disable anticheat"
msgstr "Вимкнути античіт"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr ""
@@ -1839,6 +1868,10 @@ msgid "Dump the mapgen debug infos."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "Увімкнути VBO"
@@ -1921,6 +1954,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -1981,11 +2022,21 @@ msgid "Field of view"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2120,12 +2171,14 @@ msgid "Generate normalmaps"
msgstr "Генерувати карти нормалів"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2156,6 +2209,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2184,15 +2246,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2286,6 +2339,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2320,6 +2407,14 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2479,6 +2574,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2514,7 +2616,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2665,6 +2767,21 @@ msgid "Liquid update tick"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr ""
@@ -2697,8 +2814,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2708,8 +2823,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2720,8 +2833,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2731,8 +2842,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3091,6 +3200,14 @@ msgid "Maximum hotbar width"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3132,17 +3249,21 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3154,10 +3275,6 @@ msgid "Maximum users"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "Меню"
@@ -3198,10 +3315,6 @@ msgid "Mipmapping"
msgstr "Mіп-текÑтуруваннÑ"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr ""
@@ -3261,7 +3374,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Network"
-msgstr ""
+msgstr "Мережа"
#: src/settings_translation_file.cpp
msgid ""
@@ -3406,11 +3519,17 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Profiler"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3418,7 +3537,7 @@ msgid "Profiler toggle key"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
+msgid "Profiling"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3453,6 +3572,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "Вибрати шлÑÑ…"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "Права клавіша"
@@ -3534,7 +3658,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid "Security"
-msgstr ""
+msgstr "Безпека"
#: src/settings_translation_file.cpp
msgid "See http://www.sqlite.org/pragma.html#pragma_synchronous"
@@ -3610,7 +3734,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3647,7 +3771,7 @@ msgstr "Згладжене оÑвітленнÑ"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3665,7 +3789,7 @@ msgstr "КраÑтиÑÑ"
#: src/settings_translation_file.cpp
msgid "Sound"
-msgstr ""
+msgstr "Звук"
#: src/settings_translation_file.cpp
msgid ""
@@ -3726,10 +3850,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr ""
@@ -3745,6 +3881,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3760,6 +3902,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3862,10 +4010,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr ""
@@ -3992,7 +4136,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4092,99 +4236,96 @@ msgstr ""
msgid "cURL timeout"
msgstr ""
+#~ msgid "No of course not!"
+#~ msgstr "ÐÑ–, звіÑно ні!"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "СпиÑок публічних Ñерверів"
+
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑтур..."
+#~ msgid "Generate Normalmaps"
+#~ msgstr "Генерувати карти нормалей"
-#~ msgid "Reset singleplayer world"
-#~ msgstr "Скинути Ñвіт однокориÑтувацької гри"
+#~ msgid "No!!!"
+#~ msgstr "ÐÑ–!!!"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñ–Ð² меню: "
+#, fuzzy
+#~ msgid "If disabled "
+#~ msgstr "Вимкнути багатокориÑтувацьку гру"
#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "Вниз"
+#~ msgid "If enabled, "
+#~ msgstr "Увімкнено"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr ""
-#~ "Ліва кнопка миші: ПереміÑтити уÑÑ– предмети, Права кнопка миші: "
-#~ "ПереміÑтити один предмет"
+#, fuzzy
+#~ msgid "Game Name"
+#~ msgstr "Гра"
-#~ msgid "is required by:"
-#~ msgstr "необхідний длÑ:"
+#, fuzzy
+#~ msgid "Password"
+#~ msgstr "Старий Пароль"
-#~ msgid "Configuration saved. "
-#~ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾. "
+#~ msgid "Preload item visuals"
+#~ msgstr "Попереднє Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "ПопередженнÑ: Помилкова конфігураціÑ. "
+#, fuzzy
+#~ msgid "Finite Liquid"
+#~ msgstr "Кінцеві рідини"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "Ðеможливо Ñтворити Ñвіт: Ім'Ñ Ð¼Ñ–Ñтить недопуÑтимі Ñимволи"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "Помилка при видаленні файлів Ñвіту"
-#~ msgid "Show Public"
-#~ msgstr "Показати Публічні"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "Ðеможливо налаштувати Ñвіт: Ðічого не вибрано"
-#~ msgid "Show Favorites"
-#~ msgstr "Показати Улюблені"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "Ðеможливо Ñтворити Ñвіт: Ðе знайдено жодної гри"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "Залишіть адреÑу незаповненою Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñерверу."
+#~ msgid "Files to be deleted"
+#~ msgstr "Файлів, що підлÑгають видаленню"
-#~ msgid "Create world"
-#~ msgstr "Створити Ñвіт"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "Ðеможливо видалити Ñвіт: Ðічого не вибрано"
#~ msgid "Address required."
#~ msgstr "ÐдреÑа необхідна."
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "Ðеможливо видалити Ñвіт: Ðічого не вибрано"
-
-#~ msgid "Files to be deleted"
-#~ msgstr "Файлів, що підлÑгають видаленню"
+#~ msgid "Create world"
+#~ msgstr "Створити Ñвіт"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "Ðеможливо Ñтворити Ñвіт: Ðе знайдено жодної гри"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "Залишіть адреÑу незаповненою Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñерверу."
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "Ðеможливо налаштувати Ñвіт: Ðічого не вибрано"
+#~ msgid "Show Favorites"
+#~ msgstr "Показати Улюблені"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "Помилка при видаленні файлів Ñвіту"
+#~ msgid "Show Public"
+#~ msgstr "Показати Публічні"
-#, fuzzy
-#~ msgid "Finite Liquid"
-#~ msgstr "Кінцеві рідини"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "Ðеможливо Ñтворити Ñвіт: Ім'Ñ Ð¼Ñ–Ñтить недопуÑтимі Ñимволи"
-#~ msgid "Preload item visuals"
-#~ msgstr "Попереднє Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "ПопередженнÑ: Помилкова конфігураціÑ. "
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "Старий Пароль"
+#~ msgid "Configuration saved. "
+#~ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾. "
-#, fuzzy
-#~ msgid "Game Name"
-#~ msgstr "Гра"
+#~ msgid "is required by:"
+#~ msgstr "необхідний длÑ:"
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "Увімкнено"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr ""
+#~ "Ліва кнопка миші: ПереміÑтити уÑÑ– предмети, Права кнопка миші: "
+#~ "ПереміÑтити один предмет"
#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "Вимкнути багатокориÑтувацьку гру"
+#~ msgid "Downloading"
+#~ msgstr "Вниз"
-#~ msgid "No!!!"
-#~ msgstr "ÐÑ–!!!"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "МаÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñ–Ð² меню: "
#, fuzzy
-#~ msgid "Generate Normalmaps"
-#~ msgstr "Генерувати карти нормалей"
-
-#~ msgid "Public Serverlist"
-#~ msgstr "СпиÑок публічних Ñерверів"
-
-#~ msgid "No of course not!"
-#~ msgstr "ÐÑ–, звіÑно ні!"
+#~ msgid "Preload inventory textures"
+#~ msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚ÐµÐºÑтур..."
diff --git a/po/zh_CN/minetest.po b/po/zh_CN/minetest.po
index 62ebcd217..cd70e573e 100644
--- a/po/zh_CN/minetest.po
+++ b/po/zh_CN/minetest.po
@@ -6,11 +6,11 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-05-05 19:09+0000\n"
-"Last-Translator: Claybiokiller <clay0305@hotmail.com>\n"
-"Language-Team: Chinese (China) "
-"<https://hosted.weblate.org/projects/minetest/minetest/zh_CN/>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-06-11 10:56+0000\n"
+"Last-Translator: arsdragonfly <arsdragonfly@gmail.com>\n"
+"Language-Team: Chinese (China) <https://hosted.weblate.org/projects/minetest/"
+"minetest/zh_CN/>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -400,9 +400,8 @@ msgid "Uninstall selected modpack"
msgstr "删除选中的MOD包"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "地å€/端å£:"
+msgstr "地å€/端å£"
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -423,17 +422,16 @@ msgstr "å¯ç”¨ä¼¤å®³"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Del. Favorite"
-msgstr "最爱的æœåŠ¡å™¨ï¼š"
+msgstr "删除收è—çš„æœåŠ¡å™¨"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
#, fuzzy
msgid "Favorite"
-msgstr "最爱的æœåŠ¡å™¨ï¼š"
+msgstr "收è—çš„æœåŠ¡å™¨"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "用户å/密ç :"
+msgstr "用户å/密ç "
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -569,16 +567,15 @@ msgstr "节点高亮"
#: builtin/mainmenu/tab_settings.lua
#, fuzzy
msgid "Node Outlining"
-msgstr "节点高亮"
+msgstr "æ–¹å—高亮"
#: builtin/mainmenu/tab_settings.lua builtin/mainmenu/tab_texturepacks.lua
msgid "None"
msgstr "æ— "
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "一般地图采样"
+msgstr "法线贴图"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -593,9 +590,13 @@ msgid "Parallax Occlusion"
msgstr "视差贴图"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "å¯ç”¨ç²’å­"
+msgstr "ç²’å­æ•ˆæžœ"
+
+#: builtin/mainmenu/tab_settings.lua
+#, fuzzy
+msgid "Reset singleplayer world"
+msgstr "é‡ç½®å•äººæ¸¸æˆ"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -971,6 +972,10 @@ msgstr "切æ¢ç©¿å¢™æ¨¡å¼"
msgid "Use"
msgstr "使用"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "缩放"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "按键"
@@ -1287,10 +1292,6 @@ msgstr "Xé”®1"
msgid "X Button 2"
msgstr "Xé”®2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "缩放"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1367,12 +1368,17 @@ msgstr "空中加速"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Active Block Management interval"
-msgstr "活动å—范围"
+msgstr "活动区å—管ç†é—´éš”"
#: src/settings_translation_file.cpp
#, fuzzy
msgid "Active Block Modifier interval"
-msgstr "活动å—范围"
+msgstr "活动区å—修改间隔"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Active Block Modifiers"
+msgstr "活动区å—修改间隔"
#: src/settings_translation_file.cpp
msgid "Active block range"
@@ -1456,6 +1462,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "自动报告到æœåŠ¡å™¨åˆ—表。"
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "åŽé€€é”®"
@@ -1468,9 +1478,8 @@ msgid "Basic"
msgstr "基础"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic Privileges"
-msgstr "默认æƒé™"
+msgstr "基本æƒé™"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
@@ -1489,6 +1498,10 @@ msgid "Build inside player"
msgstr "建立内部玩家"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "凹凸贴图"
@@ -1530,6 +1543,11 @@ msgid "Chat toggle key"
msgstr "èŠå¤©åˆ‡æ¢é”®"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Chatcommands"
+msgstr "命令"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1620,20 +1638,21 @@ msgid "Colored fog"
msgstr "彩色雾"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
-"å—信任的 Mod 列表,以逗å·åˆ†éš”,其å¯å­˜å–ä¸å®‰å…¨çš„\n"
-"功能,å³ä¾¿ mod 安全性已å¯ç”¨ï¼ˆç»ç”± request_insecure_environment())。"
+"以逗å·åˆ†éš”çš„ mod 清å•ï¼Œè®©æ‚¨å¯ä»¥å­˜å– HTTP API,\n"
+"å…¶å¯ä»Žäº’è”网上传åŠä¸‹è½½èµ„料。"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
-"以逗å·åˆ†éš”çš„ mod 清å•ï¼Œè®©æ‚¨å¯ä»¥å­˜å– HTTP API,\n"
-"å…¶å¯ä»Žäº’è”网上传åŠä¸‹è½½èµ„料。"
+"å—信任的 Mod 列表,以逗å·åˆ†éš”,其å¯å­˜å–ä¸å®‰å…¨çš„\n"
+"功能,å³ä¾¿ mod 安全性已å¯ç”¨ï¼ˆç»ç”± request_insecure_environment())。"
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -1702,7 +1721,7 @@ msgstr "控制山丘的å¡åº¦/高度。"
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "控制隧é“宽度,较å°çš„值创建更宽的隧é“。"
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1717,10 +1736,13 @@ msgstr ""
"è¿™å¯ä»¥ä½¿æŒ–掘更加困难。0 表示ç¦ç”¨ã€‚ (0-10)"
#: src/settings_translation_file.cpp
+#, fuzzy
msgid ""
"Creates unpredictable water features in caves.\n"
"These can make mining difficult. Zero disables them. (0-10)"
msgstr ""
+"在洞穴中创建éšæœºçš„水域。\n"
+"会使挖矿å˜å¾—困难。值为0则ç¦ç”¨ã€‚(0-10)"
#: src/settings_translation_file.cpp
msgid "Crosshair alpha"
@@ -1787,6 +1809,10 @@ msgid "Default privileges"
msgstr "默认æƒé™"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1807,20 +1833,24 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Delay showing tooltips, stated in milliseconds."
+msgid "Delay in sending blocks after building"
msgstr ""
#: src/settings_translation_file.cpp
+msgid "Delay showing tooltips, stated in milliseconds."
+msgstr "工具æ示显示延迟,按毫秒计算。"
+
+#: src/settings_translation_file.cpp
msgid "Deprecated Lua API handling"
msgstr "已弃用 Lua API 处ç†"
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find large caves."
-msgstr ""
+msgstr "大型洞穴的最浅深度。"
#: src/settings_translation_file.cpp
msgid "Depth below which you'll find massive caves."
-msgstr ""
+msgstr "巨型洞穴的最浅深度。"
#: src/settings_translation_file.cpp
msgid "Descending speed"
@@ -1837,14 +1867,6 @@ msgid "Desynchronize block animation"
msgstr "去åŒæ­¥å—动画"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "详细 mod 剖æž"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1856,6 +1878,18 @@ msgid "Disable anticheat"
msgstr "ç¦ç”¨å作弊"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "ç¦æ­¢ä½¿ç”¨ç©ºå¯†ç "
@@ -1880,6 +1914,10 @@ msgid "Dump the mapgen debug infos."
msgstr "转储地图生æˆå™¨è°ƒè¯•ä¿¡æ¯ã€‚"
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "å¯ç”¨ VBO"
@@ -1966,6 +2004,15 @@ msgstr ""
"需è¦ç€è‰²å™¨å·²å¯ç”¨ã€‚"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Engine profiling data print interval"
+msgstr "剖æžå°å‡ºé—´éš”"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2028,10 +2075,24 @@ msgid "Field of view"
msgstr "视界"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Field of view for zoom"
+msgstr "视界"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "视界程度。"
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"快速移动(通过“使用â€é”®ï¼‰ã€‚\n"
+"这需è¦æœåŠ¡å™¨å…许“快速移动â€æƒé™ã€‚"
+
+#: src/settings_translation_file.cpp
msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
@@ -2168,12 +2229,14 @@ msgid "Generate normalmaps"
msgstr "生æˆå¸¸è§„地图"
#: src/settings_translation_file.cpp
+msgid "Global callbacks"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2204,6 +2267,15 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr ""
@@ -2232,15 +2304,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr ""
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2334,6 +2397,40 @@ msgid "In-game chat console background color (R,G,B)."
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr ""
@@ -2368,6 +2465,16 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick button repetition interval"
+msgstr "å³å‡»é‡å¤é—´éš”"
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Joystick frustum sensitivity"
+msgstr "é¼ æ ‡çµæ•åº¦"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2527,6 +2634,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2562,7 +2676,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2713,6 +2827,22 @@ msgid "Liquid update tick"
msgstr "液体更新å•æ¬¡"
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Loading Block Modifiers"
+msgstr "活动区å—修改间隔"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr "主èœå•æ¸¸æˆç®¡ç†å™¨"
@@ -2745,8 +2875,6 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2756,8 +2884,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2768,8 +2894,6 @@ msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2779,8 +2903,6 @@ msgstr ""
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -3143,6 +3265,14 @@ msgid "Maximum hotbar width"
msgstr "最大快æ·æ å®½åº¦"
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr ""
@@ -3184,17 +3314,22 @@ msgid "Maximum number of statically stored objects in a block."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Maximum objects per block"
+msgstr "最大强制载入å—"
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr ""
#: src/settings_translation_file.cpp
@@ -3206,10 +3341,6 @@ msgid "Maximum users"
msgstr "最大用户"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr ""
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "èœå•"
@@ -3250,10 +3381,6 @@ msgid "Mipmapping"
msgstr "Mip 贴图处ç†"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Mod 剖æž"
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr "Mod 存储详情 URL"
@@ -3464,20 +3591,28 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Privileges that players with basic_privs can grant"
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
+msgid "Privileges that players with basic_privs can grant"
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Profiler"
+msgstr "山谷轮廓"
+
+#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
msgstr "剖æžå™¨åˆ‡æ¢é”®"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "剖æžå°å‡ºé—´éš”"
+#, fuzzy
+msgid "Profiling"
+msgstr "Mod 剖æž"
#: src/settings_translation_file.cpp
msgid ""
@@ -3511,6 +3646,11 @@ msgid "Replaces the default main menu with a custom one."
msgstr ""
#: src/settings_translation_file.cpp
+#, fuzzy
+msgid "Report path"
+msgstr "字体路径"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "å³æ–¹å‘é”®"
@@ -3670,7 +3810,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3707,7 +3847,7 @@ msgstr "平滑光照"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
@@ -3786,10 +3926,22 @@ msgid "The altitude at which temperature drops by 20C"
msgstr ""
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr "泥土深度或其他过滤器"
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr ""
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr "æœåŠ¡å™¨ç›‘å¬çš„网络接å£ã€‚"
@@ -3805,6 +3957,12 @@ msgstr "Irrlicht 的渲染åŽç«¯ã€‚"
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -3820,6 +3978,12 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr ""
@@ -3922,10 +4086,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr ""
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "适用 MOD å¼€å‘者。"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr "åž‚ç›´åŒæ­¥"
@@ -4053,7 +4213,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
#: src/settings_translation_file.cpp
@@ -4134,6 +4294,8 @@ msgid ""
"World directory (everything in the world is stored here).\n"
"Not needed if starting from the main menu."
msgstr ""
+"世界目录(世界里的所有东西都存在这里)。\n"
+"如果从主èœå•å¼€å§‹æ¸¸æˆå°±ä¸éœ€è¦ã€‚"
#: src/settings_translation_file.cpp
msgid "Y of flat ground."
@@ -4141,7 +4303,7 @@ msgstr "平地的 Y。"
#: src/settings_translation_file.cpp
msgid "Y of upper limit of large pseudorandom caves."
-msgstr ""
+msgstr "大型éšæœºæ´žç©´çš„Y轴最大值。"
#: src/settings_translation_file.cpp
msgid "cURL file download timeout"
@@ -4155,74 +4317,108 @@ msgstr "cURL 并å‘é™åˆ¶"
msgid "cURL timeout"
msgstr "cURL 超时"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "详细 mod 剖æž"
+
+#~ msgid "Useful for mod developers."
+#~ msgstr "适用 MOD å¼€å‘者。"
+
+#~ msgid "No of course not!"
+#~ msgstr "当然ä¸ï¼"
+
+#~ msgid "Public Serverlist"
+#~ msgstr "公共æœåŠ¡å™¨åˆ—表"
+
+#~ msgid "Generate Normalmaps"
+#~ msgstr "生æˆä¸€èˆ¬åœ°å›¾"
+
+#~ msgid "No!!!"
+#~ msgstr "ä¸!!!"
+
#, fuzzy
-#~ msgid "Preload inventory textures"
-#~ msgstr "载入中..."
+#~ msgid "If disabled "
+#~ msgstr "ç¦ç”¨MOD包"
#, fuzzy
-#~ msgid "Reset singleplayer world"
-#~ msgstr "é‡ç½®å•äººæ¸¸æˆ"
+#~ msgid "If enabled, "
+#~ msgstr "å¯ç”¨"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "èœå•å…ƒç´ åº”用缩放因å­"
+#~ msgid "Restart minetest for driver change to take effect"
+#~ msgstr "é‡å¯minetest让驱动å˜åŒ–生效"
-#~ msgid "Touch free target"
-#~ msgstr "自由触摸目标"
+#~ msgid "Game Name"
+#~ msgstr "游æˆå"
-#, fuzzy
-#~ msgid "Downloading"
-#~ msgstr "下载中"
+#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
+#~ msgstr "游æˆç®¡ç†: 无法å¤åˆ¶MOD“$1â€åˆ°æ¸¸æˆâ€œ$2â€"
-#~ msgid " KB/s"
-#~ msgstr "åƒå­—节/秒"
+#~ msgid "GAMES"
+#~ msgstr "游æˆ"
-#~ msgid " MB/s"
-#~ msgstr "兆字节/秒"
+#~ msgid "Mods:"
+#~ msgstr "MODS:"
-#~ msgid "Left click: Move all items, Right click: Move single item"
-#~ msgstr "左键:移动所有物å“,å³é”®ï¼šç§»åŠ¨å•ä¸ªç‰©å“"
+#~ msgid "new game"
+#~ msgstr "新建游æˆ"
-#~ msgid "is required by:"
-#~ msgstr "被需è¦ï¼š"
+#~ msgid "EDIT GAME"
+#~ msgstr "编辑游æˆ"
-#~ msgid "Configuration saved. "
-#~ msgstr "é…置已ä¿å­˜ã€‚ "
+#~ msgid "Remove selected mod"
+#~ msgstr "删除选中MOD"
-#~ msgid "Warning: Configuration not consistent. "
-#~ msgstr "警告:é…ç½®ä¸ä¸€è‡´ã€‚ "
+#~ msgid "<<-- Add mod"
+#~ msgstr "<<-- 添加MOD"
-#~ msgid "Cannot create world: Name contains invalid characters"
-#~ msgstr "无法创建世界:å字包å«éžæ³•å­—符"
+#~ msgid "CLIENT"
+#~ msgstr "客户端"
-#~ msgid "Show Public"
-#~ msgstr "显示公共"
+#~ msgid "START SERVER"
+#~ msgstr "å¯åŠ¨æœåŠ¡å™¨"
-#~ msgid "Show Favorites"
-#~ msgstr "显示最爱"
+#~ msgid "Name"
+#~ msgstr "åå­—"
-#~ msgid "Leave address blank to start a local server."
-#~ msgstr "地å€æ ç•™ç©ºå¯å¯åŠ¨æœ¬åœ°æœåŠ¡å™¨ã€‚"
+#~ msgid "Password"
+#~ msgstr "密ç "
-#~ msgid "Create world"
-#~ msgstr "创造世界"
+#~ msgid "SETTINGS"
+#~ msgstr "设置"
-#~ msgid "Address required."
-#~ msgstr "需è¦åœ°å€ã€‚"
+#~ msgid "Preload item visuals"
+#~ msgstr "预先加载物å“图åƒ"
-#~ msgid "Cannot delete world: Nothing selected"
-#~ msgstr "无法删除世界:没有选择世界"
+#~ msgid "Finite Liquid"
+#~ msgstr "液体有é™å»¶ä¼¸"
-#~ msgid "Files to be deleted"
-#~ msgstr "将被删除的文件"
+#~ msgid "SINGLE PLAYER"
+#~ msgstr "å•äººæ¸¸æˆ"
-#~ msgid "Cannot create world: No games found"
-#~ msgstr "无法创造世界:未找到游æˆæ¨¡å¼"
+#~ msgid "TEXTURE PACKS"
+#~ msgstr "æ质包"
-#~ msgid "Cannot configure world: Nothing selected"
-#~ msgstr "无法é…置世界:没有选择世界"
+#~ msgid "MODS"
+#~ msgstr "MODS"
-#~ msgid "Failed to delete all world files"
-#~ msgstr "无法删除所有该世界的文件"
+#~ msgid "Add mod:"
+#~ msgstr "添加MOD:"
+
+#~ msgid "Local install"
+#~ msgstr "本地安装"
+
+#~ msgid ""
+#~ "Warning: Some mods are not configured yet.\n"
+#~ "They will be enabled by default when you save the configuration. "
+#~ msgstr ""
+#~ "警告:一些MODä»æœªè®¾å®šã€‚\n"
+#~ "它们会在你ä¿å­˜é…置的时候自动å¯ç”¨ã€‚ "
+
+#~ msgid ""
+#~ "Warning: Some configured mods are missing.\n"
+#~ "Their setting will be removed when you save the configuration. "
+#~ msgstr ""
+#~ "警告:缺少一些设定了的MOD。\n"
+#~ "它们的设置会在你ä¿å­˜é…置的时候被移除。 "
#~ msgid ""
#~ "Default Controls:\n"
@@ -4250,99 +4446,67 @@ msgstr "cURL 超时"
#~ "ESC:èœå•\n"
#~ "T:èŠå¤©\n"
-#~ msgid ""
-#~ "Warning: Some configured mods are missing.\n"
-#~ "Their setting will be removed when you save the configuration. "
-#~ msgstr ""
-#~ "警告:缺少一些设定了的MOD。\n"
-#~ "它们的设置会在你ä¿å­˜é…置的时候被移除。 "
-
-#~ msgid ""
-#~ "Warning: Some mods are not configured yet.\n"
-#~ "They will be enabled by default when you save the configuration. "
-#~ msgstr ""
-#~ "警告:一些MODä»æœªè®¾å®šã€‚\n"
-#~ "它们会在你ä¿å­˜é…置的时候自动å¯ç”¨ã€‚ "
-
-#~ msgid "Local install"
-#~ msgstr "本地安装"
-
-#~ msgid "Add mod:"
-#~ msgstr "添加MOD:"
-
-#~ msgid "MODS"
-#~ msgstr "MODS"
-
-#~ msgid "TEXTURE PACKS"
-#~ msgstr "æ质包"
-
-#~ msgid "SINGLE PLAYER"
-#~ msgstr "å•äººæ¸¸æˆ"
-
-#~ msgid "Finite Liquid"
-#~ msgstr "液体有é™å»¶ä¼¸"
+#~ msgid "Failed to delete all world files"
+#~ msgstr "无法删除所有该世界的文件"
-#~ msgid "Preload item visuals"
-#~ msgstr "预先加载物å“图åƒ"
+#~ msgid "Cannot configure world: Nothing selected"
+#~ msgstr "无法é…置世界:没有选择世界"
-#~ msgid "SETTINGS"
-#~ msgstr "设置"
+#~ msgid "Cannot create world: No games found"
+#~ msgstr "无法创造世界:未找到游æˆæ¨¡å¼"
-#~ msgid "Password"
-#~ msgstr "密ç "
+#~ msgid "Files to be deleted"
+#~ msgstr "将被删除的文件"
-#~ msgid "Name"
-#~ msgstr "åå­—"
+#~ msgid "Cannot delete world: Nothing selected"
+#~ msgstr "无法删除世界:没有选择世界"
-#~ msgid "START SERVER"
-#~ msgstr "å¯åŠ¨æœåŠ¡å™¨"
+#~ msgid "Address required."
+#~ msgstr "需è¦åœ°å€ã€‚"
-#~ msgid "CLIENT"
-#~ msgstr "客户端"
+#~ msgid "Create world"
+#~ msgstr "创造世界"
-#~ msgid "<<-- Add mod"
-#~ msgstr "<<-- 添加MOD"
+#~ msgid "Leave address blank to start a local server."
+#~ msgstr "地å€æ ç•™ç©ºå¯å¯åŠ¨æœ¬åœ°æœåŠ¡å™¨ã€‚"
-#~ msgid "Remove selected mod"
-#~ msgstr "删除选中MOD"
+#~ msgid "Show Favorites"
+#~ msgstr "显示最爱"
-#~ msgid "EDIT GAME"
-#~ msgstr "编辑游æˆ"
+#~ msgid "Show Public"
+#~ msgstr "显示公共"
-#~ msgid "new game"
-#~ msgstr "新建游æˆ"
+#~ msgid "Cannot create world: Name contains invalid characters"
+#~ msgstr "无法创建世界:å字包å«éžæ³•å­—符"
-#~ msgid "Mods:"
-#~ msgstr "MODS:"
+#~ msgid "Warning: Configuration not consistent. "
+#~ msgstr "警告:é…ç½®ä¸ä¸€è‡´ã€‚ "
-#~ msgid "GAMES"
-#~ msgstr "游æˆ"
+#~ msgid "Configuration saved. "
+#~ msgstr "é…置已ä¿å­˜ã€‚ "
-#~ msgid "Gamemgr: Unable to copy mod \"$1\" to game \"$2\""
-#~ msgstr "游æˆç®¡ç†: 无法å¤åˆ¶MOD“$1â€åˆ°æ¸¸æˆâ€œ$2â€"
+#~ msgid "is required by:"
+#~ msgstr "被需è¦ï¼š"
-#~ msgid "Game Name"
-#~ msgstr "游æˆå"
+#~ msgid "Left click: Move all items, Right click: Move single item"
+#~ msgstr "左键:移动所有物å“,å³é”®ï¼šç§»åŠ¨å•ä¸ªç‰©å“"
-#~ msgid "Restart minetest for driver change to take effect"
-#~ msgstr "é‡å¯minetest让驱动å˜åŒ–生效"
+#~ msgid " MB/s"
+#~ msgstr "兆字节/秒"
-#, fuzzy
-#~ msgid "If enabled, "
-#~ msgstr "å¯ç”¨"
+#~ msgid " KB/s"
+#~ msgstr "åƒå­—节/秒"
#, fuzzy
-#~ msgid "If disabled "
-#~ msgstr "ç¦ç”¨MOD包"
-
-#~ msgid "No!!!"
-#~ msgstr "ä¸!!!"
+#~ msgid "Downloading"
+#~ msgstr "下载中"
-#~ msgid "Generate Normalmaps"
-#~ msgstr "生æˆä¸€èˆ¬åœ°å›¾"
+#~ msgid "Touch free target"
+#~ msgstr "自由触摸目标"
-#~ msgid "Public Serverlist"
-#~ msgstr "公共æœåŠ¡å™¨åˆ—表"
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "èœå•å…ƒç´ åº”用缩放因å­"
-#~ msgid "No of course not!"
-#~ msgstr "当然ä¸ï¼"
+#, fuzzy
+#~ msgid "Preload inventory textures"
+#~ msgstr "载入中..."
diff --git a/po/zh_TW/minetest.po b/po/zh_TW/minetest.po
index abe574c93..7718ae462 100644
--- a/po/zh_TW/minetest.po
+++ b/po/zh_TW/minetest.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-05-05 16:13+0200\n"
-"PO-Revision-Date: 2016-03-05 14:43+0000\n"
-"Last-Translator: Jeff Huang <s8321414@chakraos.org>\n"
+"POT-Creation-Date: 2016-08-30 06:18+0200\n"
+"PO-Revision-Date: 2016-10-15 08:04+0000\n"
+"Last-Translator: Jeff Huang <s8321414@gmail.com>\n"
"Language-Team: Chinese (Taiwan) <https://hosted.weblate.org/projects/"
"minetest/minetest/zh_TW/>\n"
"Language: zh_TW\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 2.5-dev\n"
+"X-Generator: Weblate 2.9-dev\n"
#: builtin/fstk/ui.lua
msgid "An error occured in a Lua script, such as a mod:"
@@ -403,9 +403,8 @@ msgid "Uninstall selected modpack"
msgstr "解除安è£å·²é¸å–çš„ mod 包"
#: builtin/mainmenu/tab_multiplayer.lua
-#, fuzzy
msgid "Address / Port"
-msgstr "地å€ï¼åŸ ï¼š"
+msgstr "地å€ï¼åŸ "
#: builtin/mainmenu/tab_multiplayer.lua src/settings_translation_file.cpp
msgid "Client"
@@ -425,16 +424,15 @@ msgstr "已啟用傷害"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Del. Favorite"
-msgstr ""
+msgstr "刪除收è—"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "Favorite"
-msgstr ""
+msgstr "最愛"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
-#, fuzzy
msgid "Name / Password"
-msgstr "å稱ï¼å¯†ç¢¼ï¼š"
+msgstr "å稱ï¼å¯†ç¢¼"
#: builtin/mainmenu/tab_multiplayer.lua builtin/mainmenu/tab_simple_main.lua
msgid "PvP enabled"
@@ -527,7 +525,6 @@ msgid "Bilinear Filter"
msgstr "雙線性éŽæ¿¾å™¨"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Bump Mapping"
msgstr "映射貼圖"
@@ -568,7 +565,6 @@ msgid "Node Highlighting"
msgstr "çªé¡¯ç¯€é»ž"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Node Outlining"
msgstr "çªé¡¯ç¯€é»ž"
@@ -577,9 +573,8 @@ msgid "None"
msgstr "ç„¡"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Normal Mapping"
-msgstr "法線貼圖採樣"
+msgstr "法線貼圖"
#: builtin/mainmenu/tab_settings.lua
msgid "Opaque Leaves"
@@ -594,9 +589,12 @@ msgid "Parallax Occlusion"
msgstr "視差é®è”½"
#: builtin/mainmenu/tab_settings.lua
-#, fuzzy
msgid "Particles"
-msgstr "啟用粒å­"
+msgstr "ç²’å­"
+
+#: builtin/mainmenu/tab_settings.lua
+msgid "Reset singleplayer world"
+msgstr "é‡ç½®å–®äººéŠæˆ²ä¸–ç•Œ"
#: builtin/mainmenu/tab_settings.lua
msgid "Settings"
@@ -972,6 +970,10 @@ msgstr "切æ›ç„¡çœç•¥"
msgid "Use"
msgstr "使用"
+#: src/guiKeyChangeMenu.cpp src/keycode.cpp
+msgid "Zoom"
+msgstr "縮放"
+
#: src/guiKeyChangeMenu.cpp
msgid "press key"
msgstr "按下按éµ"
@@ -1288,10 +1290,6 @@ msgstr "X 按鈕 1"
msgid "X Button 2"
msgstr "X 按鈕 2"
-#: src/keycode.cpp
-msgid "Zoom"
-msgstr "縮放"
-
#: src/settings_translation_file.cpp
msgid ""
"(X,Y,Z) offset of fractal from world centre in units of 'scale'.\n"
@@ -1366,14 +1364,16 @@ msgid "Acceleration in air"
msgstr "在空氣中的加速"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Management interval"
-msgstr "活動å€å¡Šç¯„åœ"
+msgstr "活動å€å¡Šç®¡ç†é–“éš”"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Active Block Modifier interval"
-msgstr "活動å€å¡Šç¯„åœ"
+msgstr "活動方塊調整間隔"
+
+#: src/settings_translation_file.cpp
+msgid "Active Block Modifiers"
+msgstr "活動å€å¡Šèª¿æ•´å™¨"
#: src/settings_translation_file.cpp
msgid "Active block range"
@@ -1457,6 +1457,10 @@ msgid "Automaticaly report to the serverlist."
msgstr "自動回報到伺æœå™¨åˆ—表。"
#: src/settings_translation_file.cpp
+msgid "Autorun key"
+msgstr "自動奔跑按éµ"
+
+#: src/settings_translation_file.cpp
msgid "Backward key"
msgstr "後退éµ"
@@ -1469,9 +1473,8 @@ msgid "Basic"
msgstr "基礎"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Basic Privileges"
-msgstr "é è¨­ç‰¹æ¬Š"
+msgstr "基礎特權"
#: src/settings_translation_file.cpp
msgid "Bilinear filtering"
@@ -1490,6 +1493,10 @@ msgid "Build inside player"
msgstr "在玩家內構建"
#: src/settings_translation_file.cpp
+msgid "Builtin"
+msgstr "內建"
+
+#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr "映射貼圖"
@@ -1514,9 +1521,8 @@ msgid "Cave noise #2"
msgstr "洞穴噪音 #2"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Cave width"
-msgstr "螢幕寬度"
+msgstr "洞穴寬度"
#: src/settings_translation_file.cpp
msgid "Caves and tunnels form at the intersection of the two noises"
@@ -1531,6 +1537,10 @@ msgid "Chat toggle key"
msgstr "èŠå¤©åˆ‡æ›æŒ‰éµ"
#: src/settings_translation_file.cpp
+msgid "Chatcommands"
+msgstr "èŠå¤©æŒ‡ä»¤"
+
+#: src/settings_translation_file.cpp
msgid ""
"Choice of 18 fractals from 9 formulas.\n"
"1 = 4D \"Roundy\" mandelbrot set.\n"
@@ -1622,19 +1632,19 @@ msgstr "彩色迷霧"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-separated list of trusted mods that are allowed to access insecure\n"
-"functions even when mod security is on (via request_insecure_environment())."
+"Comma-separated list of mods that are allowed to access HTTP APIs, which\n"
+"allow them to upload and download data to/from the internet."
msgstr ""
-"å—信任的 Mod 列表,以逗號分隔,其å¯å­˜å–ä¸å®‰å…¨çš„\n"
-"功能,å³ä¾¿ mod 安全性是(經由 request_insecure_environment())。"
+"以逗號分隔的 mod 清單,å…è¨±å…¶å­˜å– HTTP API,\n"
+"從而網際網路上傳åŠä¸‹è¼‰è³‡æ–™ã€‚"
#: src/settings_translation_file.cpp
msgid ""
-"Comma-seperated list of mods that are allowed to access HTTP APIs, which\n"
-"allow them to upload and download data to/from the internet."
+"Comma-separated list of trusted mods that are allowed to access insecure\n"
+"functions even when mod security is on (via request_insecure_environment())."
msgstr ""
-"以逗號分隔的 mod 清單,讓您å¯ä»¥å­˜å– HTTP API,\n"
-"å…¶å¯å¾žç¶²éš›ç¶²è·¯ä¸Šå‚³åŠä¸‹è¼‰è³‡æ–™ã€‚"
+"å—信任的 Mod 列表,以逗號分隔,其å¯å­˜å–ä¸å®‰å…¨çš„\n"
+"功能,å³ä¾¿ mod 安全性是(經由 request_insecure_environment())。"
#: src/settings_translation_file.cpp
msgid "Command key"
@@ -1703,7 +1713,7 @@ msgstr "控制山丘的陡度ï¼æ·±åº¦ã€‚"
#: src/settings_translation_file.cpp
msgid "Controls width of tunnels, a smaller value creates wider tunnels."
-msgstr ""
+msgstr "控制隧é“的寬度,較å°çš„值會創造出較寬的隧é“。"
#: src/settings_translation_file.cpp
msgid "Crash message"
@@ -1790,6 +1800,10 @@ msgid "Default privileges"
msgstr "é è¨­ç‰¹æ¬Š"
#: src/settings_translation_file.cpp
+msgid "Default report format"
+msgstr "缺çœå ±å‘Šæ ¼å¼"
+
+#: src/settings_translation_file.cpp
msgid ""
"Default timeout for cURL, stated in milliseconds.\n"
"Only has an effect if compiled with cURL."
@@ -1810,6 +1824,10 @@ msgid "Defines the maximal player transfer distance in blocks (0 = unlimited)."
msgstr "定義玩家最大å¯å‚³é€çš„è·é›¢ï¼Œä»¥æ–¹å¡Šè¨ˆï¼ˆ0 = ä¸é™åˆ¶ï¼‰ã€‚"
#: src/settings_translation_file.cpp
+msgid "Delay in sending blocks after building"
+msgstr "建造åŽç™¼é€å€å¡Šå‰å»¶é²çš„時間"
+
+#: src/settings_translation_file.cpp
msgid "Delay showing tooltips, stated in milliseconds."
msgstr "顯示工具æ示å‰çš„延é²ï¼Œä»¥æ¯«ç§’計算。"
@@ -1840,14 +1858,6 @@ msgid "Desynchronize block animation"
msgstr "異步化方塊動畫"
#: src/settings_translation_file.cpp
-msgid "Detailed mod profile data. Useful for mod developers."
-msgstr "詳細的 mod æª”æ¡ˆè³‡æ–™ã€‚å° mod 開發者很有用。"
-
-#: src/settings_translation_file.cpp
-msgid "Detailed mod profiling"
-msgstr "詳細的 mod 檔案"
-
-#: src/settings_translation_file.cpp
msgid ""
"Determines terrain shape.\n"
"The 3 numbers in brackets control the scale of the\n"
@@ -1862,6 +1872,21 @@ msgid "Disable anticheat"
msgstr "åœç”¨å作弊"
#: src/settings_translation_file.cpp
+msgid "Disable escape sequences"
+msgstr "åœç”¨é€ƒè„«å­—å…ƒ"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Disable escape sequences, e.g. chat coloring.\n"
+"Use this if you want to run a server with pre-0.4.14 clients and you want to "
+"disable\n"
+"the escape sequences generated by mods."
+msgstr ""
+"åœç”¨é€ƒè„«å­—元。例如èŠå¤©è¨Šæ¯çš„é¡è‰²ã€‚\n"
+"如果您想è¦èˆ‡æ—©æ–¼ 0.4.14 的客戶端一åŒåŸ·è¡Œä¼ºæœå™¨ä¸¦ä¸”您也想è¦åœç”¨\n"
+"ç”± mod 所生æˆçš„逃脫字元的話就用這個。"
+
+#: src/settings_translation_file.cpp
msgid "Disallow empty passwords"
msgstr "ä¸å…許空密碼"
@@ -1886,6 +1911,10 @@ msgid "Dump the mapgen debug infos."
msgstr "轉儲 mapgen 的除錯資訊。"
#: src/settings_translation_file.cpp
+msgid "Enable Joysticks"
+msgstr "啟用æ–æ¡¿"
+
+#: src/settings_translation_file.cpp
msgid "Enable VBO"
msgstr "啟用 VBO"
@@ -1986,6 +2015,14 @@ msgstr ""
"必須啟用著色器。"
#: src/settings_translation_file.cpp
+msgid "Engine profiling data print interval"
+msgstr "引擎性能資料å°å‡ºé–“éš”"
+
+#: src/settings_translation_file.cpp
+msgid "Entity methods"
+msgstr "主體方法"
+
+#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
@@ -2050,11 +2087,23 @@ msgid "Field of view"
msgstr "視野"
#: src/settings_translation_file.cpp
+msgid "Field of view for zoom"
+msgstr "放大åŽçš„視野"
+
+#: src/settings_translation_file.cpp
msgid "Field of view in degrees."
msgstr "以度計算的視野。"
#: src/settings_translation_file.cpp
msgid ""
+"Field of view while zooming in degrees.\n"
+"This requires the \"zoom\" privilege on the server."
+msgstr ""
+"縮放視野。\n"
+"這需è¦ä¼ºæœå™¨ä¸Šçš„「縮放ã€ç‰¹æ¬Šã€‚"
+
+#: src/settings_translation_file.cpp
+msgid ""
"File in client/serverlist/ that contains your favorite servers displayed in "
"the Multiplayer Tab."
msgstr ""
@@ -2129,9 +2178,8 @@ msgid "Font size"
msgstr "字型大å°"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Format of screenshots."
-msgstr "儲存螢幕截圖的路徑。"
+msgstr "螢幕截圖的格å¼ã€‚"
#: src/settings_translation_file.cpp
msgid "Forward key"
@@ -2194,13 +2242,14 @@ msgid "Generate normalmaps"
msgstr "生æˆä¸€èˆ¬åœ°åœ–"
#: src/settings_translation_file.cpp
-#, fuzzy
+msgid "Global callbacks"
+msgstr "全域回呼"
+
+#: src/settings_translation_file.cpp
msgid ""
"Global map generation attributes.\n"
"In Mapgen v6 the 'decorations' flag controls all decorations except trees\n"
"and junglegrass, in all other mapgens this flag controls all decorations.\n"
-"The default flags set in the engine are: caves, light, decorations\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2240,6 +2289,19 @@ msgstr ""
"- 錯誤:在使用到棄用的呼å«æ™‚中止(建議 mod 開發者使用)。"
#: src/settings_translation_file.cpp
+msgid ""
+"Have the profiler instrument itself:\n"
+"* Instrument an empty function.\n"
+"This estimates the overhead, that instrumentation is adding (+1 function "
+"call).\n"
+"* Instrument the sampler being used to update the statistics."
+msgstr ""
+"使用分æžå™¨å·¥å…·æœ¬èº«ï¼š\n"
+"* 分æžç©ºå‡½æ•¸ã€‚\n"
+"這會讓消耗增加,儀表增加(+1 函å¼å‘¼å«ï¼‰ã€‚\n"
+"* 採樣工具會被用於更新統計。"
+
+#: src/settings_translation_file.cpp
msgid "Height component of the initial window size."
msgstr "åˆå§‹è¦–窗大å°çš„高度組件。"
@@ -2270,15 +2332,6 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"How many blocks are flying in the wire simultaneously for the whole server."
-msgstr "整個伺æœå™¨æœ‰å¤šå°‘個å€å¡ŠåŒæ™‚以線性方å¼é£›è¡Œã€‚"
-
-#: src/settings_translation_file.cpp
-msgid "How many blocks are flying in the wire simultaneously per client."
-msgstr "æ¯å€‹å®¢æˆ¶ç«¯æœ‰å¤šå°‘個å€å¡ŠåŒæ™‚以線性方å¼é£›è¡Œã€‚"
-
-#: src/settings_translation_file.cpp
-msgid ""
"How much the server will wait before unloading unused mapblocks.\n"
"Higher value is smoother, but will use more RAM."
msgstr ""
@@ -2384,6 +2437,44 @@ msgid "In-game chat console background color (R,G,B)."
msgstr "éŠæˆ²å…§èŠå¤©è¦–窗背景é¡è‰² (R,G,B)。"
#: src/settings_translation_file.cpp
+msgid ""
+"Instrument builtin.\n"
+"This is usually only needed by core/builtin contributors"
+msgstr ""
+"內建工具。\n"
+"這通常僅被核心ï¼å…§å»ºè²¢ç»è€…需è¦"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument chatcommands on registration."
+msgstr "分æžç™»éŒ„çš„èŠå¤©æŒ‡ä»¤ã€‚"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument global callback functions on registration.\n"
+"(anything you pass to a minetest.register_*() function)"
+msgstr ""
+"在登錄上分æžå…¨åŸŸå›žå‘¼ã€‚\n"
+"(任何您想è¦å‚³éžçµ¦ minetest.register_*() 函數的æ±è¥¿ï¼‰"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Active Block Modifiers on registration."
+msgstr "分æžç™»éŒ„çš„æ´»èºå€å¡Šä¿®é£¾å™¨çš„動作函數。"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Instrument the action function of Loading Block Modifiers on registration."
+msgstr "分æžç™»éŒ„的載入中å€å¡Šä¿®é£¾å™¨çš„動作函數。"
+
+#: src/settings_translation_file.cpp
+msgid "Instrument the methods of entities on registration."
+msgstr "分æžç™»éŒ„的實體方法。"
+
+#: src/settings_translation_file.cpp
+msgid "Instrumentation"
+msgstr "儀表"
+
+#: src/settings_translation_file.cpp
msgid "Interval of saving important changes in the world, stated in seconds."
msgstr "儲存世界中的é‡è¦è®Šæ›´çš„間隔,以秒計。"
@@ -2420,6 +2511,14 @@ msgstr ""
"控制細節的å“質。"
#: src/settings_translation_file.cpp
+msgid "Joystick button repetition interval"
+msgstr "æ–桿按鈕é‡è¦†é–“éš”"
+
+#: src/settings_translation_file.cpp
+msgid "Joystick frustum sensitivity"
+msgstr "æ–æ¡¿éˆæ•åº¦"
+
+#: src/settings_translation_file.cpp
msgid ""
"Julia set only: W component of hypercomplex constant determining julia "
"shape.\n"
@@ -2643,6 +2742,16 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"Key for toggling autorun.\n"
+"See http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+msgstr ""
+"切æ›è‡ªå‹•å¥”跑的按éµã€‚\n"
+"請見 http://irrlicht.sourceforge.net/docu/namespaceirr."
+"html#a54da2a0e231901735e3da1b0edf72eb3"
+
+#: src/settings_translation_file.cpp
+msgid ""
"Key for toggling cinematic mode.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
@@ -2693,7 +2802,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Key for toggling the camrea update. Only used for development\n"
+"Key for toggling the camera update. Only used for development\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
@@ -2805,11 +2914,11 @@ msgstr "伺æœå™¨ tick 的長度與相關物件的間隔通常é€éŽç¶²è·¯æ›´æ–°
#: src/settings_translation_file.cpp
msgid "Length of time between ABM execution cycles"
-msgstr ""
+msgstr "在 ABM 執行循環間的時間長度"
#: src/settings_translation_file.cpp
msgid "Length of time between NodeTimer execution cycles"
-msgstr ""
+msgstr "在 Node 計時器執行循環間的時間長度"
#: src/settings_translation_file.cpp
msgid ""
@@ -2882,6 +2991,24 @@ msgid "Liquid update tick"
msgstr "液體更新 tick"
#: src/settings_translation_file.cpp
+msgid "Load the game profiler"
+msgstr "載入éŠæˆ²åˆ†æžå™¨"
+
+#: src/settings_translation_file.cpp
+msgid ""
+"Load the game profiler to collect game profiling data.\n"
+"Provides a /profiler command to access the compiled profile.\n"
+"Useful for mod developers and server operators."
+msgstr ""
+"載入éŠæˆ²åˆ†æžå™¨ä»¥æ”¶é›†éŠæˆ²åˆ†æžè³‡æ–™ã€‚\n"
+"æ供一個 /profiler 指令以存å–已編譯的設定檔。\n"
+"å° mod 開發者與伺æœå™¨æ供者有用。"
+
+#: src/settings_translation_file.cpp
+msgid "Loading Block Modifiers"
+msgstr "正在載入方塊調整器"
+
+#: src/settings_translation_file.cpp
msgid "Main menu game manager"
msgstr "主é¸å–®éŠæˆ²ç®¡ç†å“¡"
@@ -2907,7 +3034,6 @@ msgid "Map directory"
msgstr "地圖目錄"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen Valleys.\n"
"'altitude_chill' makes higher elevations colder, which may cause biome "
@@ -2915,41 +3041,35 @@ msgid ""
"'humid_rivers' modifies the humidity around rivers and in areas where water "
"would tend to pool,\n"
"it may interfere with delicately adjusted biomes.\n"
-"The default flags set in the engine are: altitude_chill, humid_rivers\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"專用於 Mapgen v6 的地圖生æˆå±¬æ€§ã€‚\n"
-"當 snowbiomes 與å¢æž—都啟用時,å¢æž—旗標會被忽略。\n"
-"未在旗標字串中指定的旗標將ä¸æœƒè‡ªé è¨­å€¼ä¿®æ”¹ã€‚\n"
-"以「noã€é–‹é ­çš„旗標字串將會用於明確的åœç”¨å®ƒå€‘。"
+"專用於 Mapgen Valleys 的地圖生æˆå±¬æ€§ã€‚\n"
+"'altitude_chill' 讓高海拔處更冷,這å¯èƒ½æœƒå°Žè‡´ä¸€äº›èˆ‡ç”Ÿç‰©ç¾¤è½ç›¸é—œçš„å•é¡Œã€‚\n"
+"'humid_rivers' 修改了河æµå‘¨åœçš„濕度,該處的水會傾å‘å½¢æˆæ± å­ã€‚\n"
+"這å¯èƒ½æœƒå¹²æ“¾ç¶“éŽå¾®ç§’調整的生物群è½ã€‚\n"
+"未在旗標字串中指定的旗標ä¸æœƒè‡ªé è¨­å€¼ä¿®æ”¹ã€‚\n"
+"以 'no' 開頭的旗標會用於明確地åœç”¨å®ƒå€‘。"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen flat.\n"
"Occasional lakes and hills can be added to the flat world.\n"
-"The default flags set in the engine are: none\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
"專用於 Mapgen flat 的地圖生æˆå±¬æ€§ã€‚\n"
-"å¶è€Œæœƒåœ¨å¹³å¦çš„世界中加入湖泊與山丘。\n"
+"å¯èƒ½æœƒæœ‰å°‘數的湖泊或是丘陵會在æ‰å¹³çš„世界中生æˆã€‚\n"
"未在旗標字串中指定的旗標將ä¸æœƒè‡ªé è¨­å€¼ä¿®æ”¹ã€‚\n"
"以「noã€é–‹é ­çš„旗標字串將會用於明確的åœç”¨å®ƒå€‘。"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v6.\n"
"When snowbiomes are enabled jungles are automatically enabled, the 'jungles' "
"flag is ignored.\n"
-"The default flags set in the engine are: biomeblend, mudflow\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
@@ -2960,18 +3080,15 @@ msgstr ""
"以「noã€é–‹é ­çš„旗標字串將會用於明確的åœç”¨å®ƒå€‘。"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid ""
"Map generation attributes specific to Mapgen v7.\n"
"The 'ridges' flag controls the rivers.\n"
-"The default flags set in the engine are: mountains, ridges\n"
-"The flags string modifies the engine defaults.\n"
"Flags that are not specified in the flag string are not modified from the "
"default.\n"
"Flags starting with 'no' are used to explicitly disable them."
msgstr ""
-"專用於 Mapgen v6 的地圖生æˆå±¬æ€§ã€‚\n"
-"當 snowbiomes 與å¢æž—都啟用時,å¢æž—旗標會被忽略。\n"
+"專用於 Mapgen v7 的地圖生æˆå±¬æ€§ã€‚\n"
+"「ridgesã€ç‚ºæ²³æµã€‚\n"
"未在旗標字串中指定的旗標將ä¸æœƒè‡ªé è¨­å€¼ä¿®æ”¹ã€‚\n"
"以「noã€é–‹é ­çš„旗標字串將會用於明確的åœç”¨å®ƒå€‘。"
@@ -3020,9 +3137,8 @@ msgid "Mapgen flat"
msgstr "Mapgen flat"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen flat cave width"
-msgstr "Mapgen flat 大型洞穴深度"
+msgstr "Mapgen flat 洞穴寬度"
#: src/settings_translation_file.cpp
msgid "Mapgen flat cave1 noise parameters"
@@ -3073,9 +3189,8 @@ msgid "Mapgen fractal"
msgstr "地圖產生器分形"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen fractal cave width"
-msgstr "Mapgen fractal slice w"
+msgstr "Mapgen 分形洞穴寬度"
#: src/settings_translation_file.cpp
msgid "Mapgen fractal cave1 noise parameters"
@@ -3142,9 +3257,8 @@ msgid "Mapgen v5"
msgstr "Mapgen v5"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v5 cave width"
-msgstr "Mapgen flat 大型洞穴深度"
+msgstr "Mapgen v5 洞穴寬度"
#: src/settings_translation_file.cpp
msgid "Mapgen v5 cave1 noise parameters"
@@ -3231,9 +3345,8 @@ msgid "Mapgen v7"
msgstr "地圖產生器 v7"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Mapgen v7 cave width"
-msgstr "Mapgen flat 大型洞穴深度"
+msgstr "Mapgen v7 洞穴寬度"
#: src/settings_translation_file.cpp
msgid "Mapgen v7 cave1 noise parameters"
@@ -3332,6 +3445,14 @@ msgid "Maximum hotbar width"
msgstr "å¿«æ·åˆ—最大寬度"
#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent in total."
+msgstr "最大åŒæ™‚總傳é€çš„å€å¡Šæ•¸é‡ã€‚"
+
+#: src/settings_translation_file.cpp
+msgid "Maximum number of blocks that are simultaneously sent per client."
+msgstr "æ¯å€‹å®¢æˆ¶ç«¯å¯åŒæ™‚傳é€çš„最大å€å¡Šæ•¸é‡ã€‚"
+
+#: src/settings_translation_file.cpp
msgid "Maximum number of blocks that can be queued for loading."
msgstr "å¯è¢«æ”¾é€²ä½‡åˆ—內等待載入的最大å€å¡Šæ•¸ã€‚"
@@ -3382,6 +3503,10 @@ msgid "Maximum number of statically stored objects in a block."
msgstr "最大éœæ…‹å„²å­˜æ–¼ä¸€å€‹å€å¡Šä¸­çš„物件數é‡ã€‚"
#: src/settings_translation_file.cpp
+msgid "Maximum objects per block"
+msgstr "æ¯å€‹å€å¡Šæœ€å¤§ç‰©ä»¶æ•¸"
+
+#: src/settings_translation_file.cpp
msgid ""
"Maximum proportion of current window to be used for hotbar.\n"
"Useful if there's something to be displayed right or left of hotbar."
@@ -3390,11 +3515,11 @@ msgstr ""
"如果有æ±è¥¿è¦é¡¯ç¤ºåœ¨å¿«æ·åˆ—左邊或å³é‚Šæ™‚很有用。"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously blocks send per client"
+msgid "Maximum simultaneous block sends per client"
msgstr "æ¯å€‹å®¢æˆ¶ç«¯æœ€å¤§åŒæ™‚傳é€å€å¡Šæ•¸"
#: src/settings_translation_file.cpp
-msgid "Maximum simultaneously bocks send total"
+msgid "Maximum simultaneous block sends total"
msgstr "總和最大åŒæ™‚傳é€å€å¡Šæ•¸"
#: src/settings_translation_file.cpp
@@ -3406,10 +3531,6 @@ msgid "Maximum users"
msgstr "最多使用者"
#: src/settings_translation_file.cpp
-msgid "Maxmimum objects per block"
-msgstr "æ¯å€‹å€å¡Šæœ€å¤§ç‰©ä»¶æ•¸"
-
-#: src/settings_translation_file.cpp
msgid "Menus"
msgstr "é¸å–®"
@@ -3450,10 +3571,6 @@ msgid "Mipmapping"
msgstr "映射貼圖"
#: src/settings_translation_file.cpp
-msgid "Mod profiling"
-msgstr "Mod 分æžå™¨"
-
-#: src/settings_translation_file.cpp
msgid "Modstore details URL"
msgstr "Modstore 詳細資訊 URL"
@@ -3549,9 +3666,8 @@ msgid "Node highlighting"
msgstr "çªé¡¯ç¯€é»ž"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "NodeTimer interval"
-msgstr "時間傳é€é–“éš”"
+msgstr "NodeTimer é–“éš”"
#: src/settings_translation_file.cpp
msgid "Noise parameters for biome API temperature, humidity and biome blend."
@@ -3680,20 +3796,26 @@ msgid "Prevent mods from doing insecure things like running shell commands."
msgstr "é¿å… mod åšå‡ºä¸å®‰å…¨çš„舉動,åƒæ˜¯åŸ·è¡Œ shell 指令等。"
#: src/settings_translation_file.cpp
+msgid ""
+"Print the engine's profiling data in regular intervals (in seconds). 0 = "
+"disable. Useful for developers."
+msgstr "引擎性能資料å°å‡ºé–“隔的秒數。0 = åœç”¨ã€‚å°é–‹ç™¼è€…有用。"
+
+#: src/settings_translation_file.cpp
msgid "Privileges that players with basic_privs can grant"
-msgstr ""
+msgstr "有 basic_privs 的玩家å¯ä»¥æå‡ç‰¹æ¬Š"
#: src/settings_translation_file.cpp
-msgid "Profiler data print interval. 0 = disable. Useful for developers."
-msgstr "分æžå™¨è³‡æ–™å°å‡ºé–“隔。0 = åœç”¨ã€‚å°é–‹ç™¼è€…有用。"
+msgid "Profiler"
+msgstr "分æžå™¨"
#: src/settings_translation_file.cpp
msgid "Profiler toggle key"
msgstr "分æžå™¨åˆ‡æ›éµ"
#: src/settings_translation_file.cpp
-msgid "Profiling print interval"
-msgstr "分æžåˆ—å°é–“éš”"
+msgid "Profiling"
+msgstr "分æž"
#: src/settings_translation_file.cpp
msgid ""
@@ -3729,6 +3851,10 @@ msgid "Replaces the default main menu with a custom one."
msgstr "以自訂é¸å–®å–代é è¨­ä¸»é¸å–®ã€‚"
#: src/settings_translation_file.cpp
+msgid "Report path"
+msgstr "報告路徑"
+
+#: src/settings_translation_file.cpp
msgid "Right key"
msgstr "å³éµ"
@@ -3799,14 +3925,12 @@ msgid "Screenshot folder"
msgstr "螢幕截圖資料夾"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot format"
-msgstr "螢幕截圖資料夾"
+msgstr "螢幕截圖格å¼"
#: src/settings_translation_file.cpp
-#, fuzzy
msgid "Screenshot quality"
-msgstr "螢幕截圖"
+msgstr "螢幕截圖å“質"
#: src/settings_translation_file.cpp
msgid ""
@@ -3814,6 +3938,9 @@ msgid ""
"1 means worst quality; 100 means best quality.\n"
"Use 0 for default quality."
msgstr ""
+"螢幕截圖的å“質。僅用於 JPEG æ ¼å¼ã€‚\n"
+"1 代表最差的å“質,100 代表最佳å“質。\n"
+"使用 0 來使用é è¨­å“質。"
#: src/settings_translation_file.cpp
msgid "Security"
@@ -3901,7 +4028,7 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
-"Shaders allow advanced visul effects and may increase performance on some "
+"Shaders allow advanced visual effects and may increase performance on some "
"video cards.\n"
"Thy only work with the OpenGL video backend."
msgstr ""
@@ -3918,7 +4045,7 @@ msgstr "顯示除錯資訊"
#: src/settings_translation_file.cpp
msgid "Show entity selection boxes"
-msgstr ""
+msgstr "顯示物體é¸å–方塊"
#: src/settings_translation_file.cpp
msgid "Shutdown message"
@@ -3940,10 +4067,10 @@ msgstr "平滑光"
#: src/settings_translation_file.cpp
msgid ""
-"Smooths camera when moving and looking around.\n"
+"Smooths camera when looking around. Also called look or mouse smoothing.\n"
"Useful for recording videos."
msgstr ""
-"當移動與æ±å¼µè¥¿æœ›æ™‚讓æ”影機變æµæš¢ã€‚\n"
+"當移動與æ±å¼µè¥¿æœ›æ™‚讓æ”影機變æµæš¢ã€‚也稱為觀看或滑鼠æµæš¢ã€‚\n"
"å°éŒ„影很有用。"
#: src/settings_translation_file.cpp
@@ -3992,7 +4119,7 @@ msgstr "åš´æ ¼å”議檢查"
#: src/settings_translation_file.cpp
msgid "Support older servers"
-msgstr ""
+msgstr "支æ´è¼ƒèˆŠç‰ˆæœ¬çš„伺æœå™¨"
#: src/settings_translation_file.cpp
msgid "Synchronous SQLite"
@@ -4031,10 +4158,24 @@ msgid "The altitude at which temperature drops by 20C"
msgstr "會é™ä½Žæ”æ° 20 度的高度"
#: src/settings_translation_file.cpp
+msgid ""
+"The default format in which profiles are being saved,\n"
+"when calling `/profiler save [format]` without format."
+msgstr ""
+"設定被儲存為é è¨­æ ¼å¼ã€‚\n"
+"當呼å«ã€Œ/profiler save [æ ¼å¼]ã€ä½†ä¸åŒ…å«æ ¼å¼æ™‚。"
+
+#: src/settings_translation_file.cpp
msgid "The depth of dirt or other filler"
msgstr "塵土或其他填充物的深度"
#: src/settings_translation_file.cpp
+msgid ""
+"The file path relative to your worldpath in which profiles will be saved "
+"to.\n"
+msgstr "設定檔將會被儲存到的,相å°æ–¼æ‚¨çš„全域路徑的檔案路徑。\n"
+
+#: src/settings_translation_file.cpp
msgid "The network interface that the server listens on."
msgstr "伺æœå™¨è¦ç›£è½çš„網路介é¢ã€‚"
@@ -4052,6 +4193,14 @@ msgstr "Irrlicht çš„æˆåƒå¾Œç«¯ã€‚"
#: src/settings_translation_file.cpp
msgid ""
+"The sensitivity of the joystick axes for moving the\n"
+"ingame view frustum around."
+msgstr ""
+"在éŠæˆ²ä¸­ï¼Œè¦–野四處移動時的\n"
+"æ–æ¡¿éˆæ•åº¦ã€‚"
+
+#: src/settings_translation_file.cpp
+msgid ""
"The strength (darkness) of node ambient-occlusion shading.\n"
"Lower is darker, Higher is lighter. The valid range of values for this\n"
"setting is 0.25 to 4.0 inclusive. If the value is out of range it will be\n"
@@ -4074,6 +4223,14 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
+"The time in seconds it takes between repeated events\n"
+"when holding down a joystick button combination."
+msgstr ""
+"在é‡è¤‡çš„事件間以秒計的時間\n"
+"當按ä½æ–桿的組åˆã€‚"
+
+#: src/settings_translation_file.cpp
+msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right mouse button."
msgstr "當按ä½æ»‘é¼ å³éµæ™‚,é‡è¦†å³éµé»žé¸çš„間隔以秒計。"
@@ -4084,14 +4241,14 @@ msgstr "這個字型將會被用於特定的語言。"
#: src/settings_translation_file.cpp
msgid "Time in between active block management cycles"
-msgstr ""
+msgstr "在活èºæ–¹å¡Šç®¡ç†å¾ªç’°çš„時間中間"
#: src/settings_translation_file.cpp
msgid ""
"Time in seconds for item entity (dropped items) to live.\n"
"Setting it to -1 disables the feature."
msgstr ""
-"物å“(丟棄的物å“)å¯ä»¥å­˜æ´»å¤šä¹…,以秒計。\n"
+"物å“物體(丟棄的物å“)å¯ä»¥å­˜æ´»å¤šä¹…,以秒計。\n"
"設定其為 -1 以åœç”¨é€™å€‹åŠŸèƒ½ã€‚"
#: src/settings_translation_file.cpp
@@ -4183,10 +4340,6 @@ msgid "Use trilinear filtering when scaling textures."
msgstr "當縮放æ質時使用三線性éŽæ¿¾ã€‚"
#: src/settings_translation_file.cpp
-msgid "Useful for mod developers."
-msgstr "å° mod 開發者很有用。"
-
-#: src/settings_translation_file.cpp
msgid "V-Sync"
msgstr "åž‚ç›´åŒæ­¥"
@@ -4321,7 +4474,7 @@ msgid ""
"When gui_scaling_filter_txr2img is true, copy those images\n"
"from hardware to software for scaling. When false, fall back\n"
"to the old scaling method, for video drivers that don't\n"
-"propery support downloading textures back from hardware."
+"properly support downloading textures back from hardware."
msgstr ""
"當 gui_scaling_filter_txr2img 被設定為真,複製這些圖片\n"
"從硬體到軟體以供縮放。當為å‡æ™‚,退回\n"
@@ -4407,6 +4560,10 @@ msgid ""
"Servers starting with 0.4.13 will work, 0.4.12-dev servers may work.\n"
"Disabling this option will protect your password better."
msgstr ""
+"是å¦æ”¯æ´åœ¨å”議版本 25 å‰çš„舊伺æœå™¨ã€‚\n"
+"若您想è¦é€£ç·šåˆ° 0.4.12 版或更舊的伺æœå™¨å°±å•Ÿç”¨ã€‚\n"
+"自 0.4.13 起的伺æœå™¨å°‡å¯ä»¥æ­£å¸¸é‹ä½œï¼Œ0.4.12-dev 版的伺æœå™¨å¯èƒ½å¯ä»¥æ­£å¸¸é‹ä½œã€‚\n"
+"åœç”¨é€™å€‹é¸é …å¯ä»¥å°‡æ‚¨çš„密碼ä¿è­·çš„比較好一點。"
#: src/settings_translation_file.cpp
msgid "Width component of the initial window size."
@@ -4444,54 +4601,34 @@ msgstr "cURL 並行é™åˆ¶"
msgid "cURL timeout"
msgstr "cURL 逾時"
-#~ msgid ""
-#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
-#~ "completely.\n"
-#~ "Note that this is not quite optimized and that smooth lighting on the\n"
-#~ "water surface doesn't work with this."
-#~ msgstr ""
-#~ "啟用略低的的水é¢ï¼Œæ‰€ä»¥å®ƒå°±ä¸æœƒå®Œå…¨ã€Œå¡«æ»¿ã€ç¯€é»žã€‚\n"
-#~ "注æ„,這個功能並未最佳化完æˆï¼Œæ°´é¢çš„\n"
-#~ "柔和光功能無法與此功能一åŒé‹ä½œã€‚"
-
-#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
-#~ msgstr "啟用節點é¸æ“‡çªé¡¯ï¼ˆåœç”¨é¸å–框)。"
+#~ msgid "Detailed mod profile data. Useful for mod developers."
+#~ msgstr "詳細的 mod æª”æ¡ˆè³‡æ–™ã€‚å° mod 開發者很有用。"
-#~ msgid "Preload inventory textures"
-#~ msgstr "é å…ˆè¼‰å…¥ç‰©å“欄æ質"
-
-#~ msgid "Reset singleplayer world"
-#~ msgstr "é‡ç½®å–®äººéŠæˆ²ä¸–ç•Œ"
+#~ msgid "Detailed mod profiling"
+#~ msgstr "詳細的 mod 檔案"
-#~ msgid "Scaling factor applied to menu elements: "
-#~ msgstr "套用在é¸å–®å…ƒç´ çš„縮放係數: "
+#~ msgid ""
+#~ "How many blocks are flying in the wire simultaneously for the whole "
+#~ "server."
+#~ msgstr "整個伺æœå™¨æœ‰å¤šå°‘個å€å¡ŠåŒæ™‚以線性方å¼é£›è¡Œã€‚"
-#~ msgid "Touch free target"
-#~ msgstr "碰觸自由目標"
+#~ msgid "How many blocks are flying in the wire simultaneously per client."
+#~ msgstr "æ¯å€‹å®¢æˆ¶ç«¯æœ‰å¤šå°‘個å€å¡ŠåŒæ™‚以線性方å¼é£›è¡Œã€‚"
-#~ msgid "If enabled, "
-#~ msgstr "若啟用, "
+#~ msgid "Useful for mod developers."
+#~ msgstr "å° mod 開發者很有用。"
-#~ msgid "If disabled "
-#~ msgstr "è‹¥åœç”¨ "
+#~ msgid "No of course not!"
+#~ msgstr "ä¸ï¼Œçµ•å°ä¸æ˜¯ï¼"
-#~ msgid "Enable a bit lower water surface, so it doesn't "
-#~ msgstr "啟用較低的水é¢ï¼Œæ‰€ä»¥å®ƒä¸æœƒ "
+#~ msgid "Public Serverlist"
+#~ msgstr "公共伺æœå™¨æ¸…å–®"
-#~ msgid "\""
-#~ msgstr "\""
+#~ msgid "Generate Normalmaps"
+#~ msgstr "生æˆä¸€èˆ¬åœ°åœ–"
-#~ msgid ""
-#~ "Map generation attributes specific to Mapgen v7.\n"
-#~ "'ridges' are the rivers.\n"
-#~ "Flags that are not specified in the flag string are not modified from the "
-#~ "default.\n"
-#~ "Flags starting with \"no\" are used to explicitly disable them."
-#~ msgstr ""
-#~ "專用於 Mapgen v7 的地圖生æˆå±¬æ€§ã€‚\n"
-#~ "「ridgesã€ç‚ºæ²³æµã€‚\n"
-#~ "未在旗標字串中指定的旗標將ä¸æœƒè‡ªé è¨­å€¼ä¿®æ”¹ã€‚\n"
-#~ "以「noã€é–‹é ­çš„旗標字串將會用於明確的åœç”¨å®ƒå€‘。"
+#~ msgid "No!!!"
+#~ msgstr "å¦ï¼ï¼ï¼"
#~ msgid ""
#~ "Map generation attributes specific to Mapgen Valleys.\n"
@@ -4511,14 +4648,66 @@ msgstr "cURL 逾時"
#~ "「humid_riversã€æœƒä¿®æ”¹åœ¨æ²³æµé™„近的濕度,在那些å€åŸŸé™„近水將會傾å‘變為一池。"
#~ "這å¯èƒ½æœƒå°å¾®å¦™èª¿æ•´éŽçš„生物群è½é€ æˆå¹²æ“¾ã€‚"
-#~ msgid "No!!!"
-#~ msgstr "å¦ï¼ï¼ï¼"
+#~ msgid "\""
+#~ msgstr "\""
-#~ msgid "Generate Normalmaps"
-#~ msgstr "生æˆä¸€èˆ¬åœ°åœ–"
+#~ msgid "Enable a bit lower water surface, so it doesn't "
+#~ msgstr "啟用較低的水é¢ï¼Œæ‰€ä»¥å®ƒä¸æœƒ "
-#~ msgid "Public Serverlist"
-#~ msgstr "公共伺æœå™¨æ¸…å–®"
+#~ msgid "If disabled "
+#~ msgstr "è‹¥åœç”¨ "
-#~ msgid "No of course not!"
-#~ msgstr "ä¸ï¼Œçµ•å°ä¸æ˜¯ï¼"
+#~ msgid "If enabled, "
+#~ msgstr "若啟用, "
+
+#~ msgid "Touch free target"
+#~ msgstr "碰觸自由目標"
+
+#~ msgid "Scaling factor applied to menu elements: "
+#~ msgstr "套用在é¸å–®å…ƒç´ çš„縮放係數: "
+
+#~ msgid "Preload inventory textures"
+#~ msgstr "é å…ˆè¼‰å…¥ç‰©å“欄æ質"
+
+#~ msgid "Enable selection highlighting for nodes (disables selectionbox)."
+#~ msgstr "啟用節點é¸æ“‡çªé¡¯ï¼ˆåœç”¨é¸å–框)。"
+
+#~ msgid ""
+#~ "Enable a bit lower water surface, so it doesn't \"fill\" the node "
+#~ "completely.\n"
+#~ "Note that this is not quite optimized and that smooth lighting on the\n"
+#~ "water surface doesn't work with this."
+#~ msgstr ""
+#~ "啟用略低的的水é¢ï¼Œæ‰€ä»¥å®ƒå°±ä¸æœƒå®Œå…¨ã€Œå¡«æ»¿ã€ç¯€é»žã€‚\n"
+#~ "注æ„,這個功能並未最佳化完æˆï¼Œæ°´é¢çš„\n"
+#~ "柔和光功能無法與此功能一åŒé‹ä½œã€‚"
+
+#, fuzzy
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen v7.\n"
+#~ "The 'ridges' flag controls the rivers.\n"
+#~ "The default flags set in the engine are: mountains, ridges\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "專用於 Mapgen v6 的地圖生æˆå±¬æ€§ã€‚\n"
+#~ "當 snowbiomes 與å¢æž—都啟用時,å¢æž—旗標會被忽略。\n"
+#~ "未在旗標字串中指定的旗標將ä¸æœƒè‡ªé è¨­å€¼ä¿®æ”¹ã€‚\n"
+#~ "以「noã€é–‹é ­çš„旗標字串將會用於明確的åœç”¨å®ƒå€‘。"
+
+#, fuzzy
+#~ msgid ""
+#~ "Map generation attributes specific to Mapgen flat.\n"
+#~ "Occasional lakes and hills can be added to the flat world.\n"
+#~ "The default flags set in the engine are: none\n"
+#~ "The flags string modifies the engine defaults.\n"
+#~ "Flags that are not specified in the flag string are not modified from the "
+#~ "default.\n"
+#~ "Flags starting with 'no' are used to explicitly disable them."
+#~ msgstr ""
+#~ "專用於 Mapgen flat 的地圖生æˆå±¬æ€§ã€‚\n"
+#~ "å¶è€Œæœƒåœ¨å¹³å¦çš„世界中加入湖泊與山丘。\n"
+#~ "未在旗標字串中指定的旗標將ä¸æœƒè‡ªé è¨­å€¼ä¿®æ”¹ã€‚\n"
+#~ "以「noã€é–‹é ­çš„旗標字串將會用於明確的åœç”¨å®ƒå€‘。"
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index feca199c1..3aa645df9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 2.6)
project(minetest)
INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckLibraryExists)
# Add custom SemiDebug build mode
set(CMAKE_CXX_FLAGS_SEMIDEBUG "-O1 -g -Wall -Wabi" CACHE STRING
@@ -189,6 +190,36 @@ if(ENABLE_CURSES)
endif()
endif(ENABLE_CURSES)
+option(ENABLE_POSTGRESQL "Enable PostgreSQL backend" TRUE)
+set(USE_POSTGRESQL FALSE)
+
+if(ENABLE_POSTGRESQL)
+ find_program(POSTGRESQL_CONFIG_EXECUTABLE pg_config DOC "pg_config")
+ find_library(POSTGRESQL_LIBRARY pq)
+ if(POSTGRESQL_CONFIG_EXECUTABLE)
+ execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE} --includedir-server
+ OUTPUT_VARIABLE POSTGRESQL_SERVER_INCLUDE_DIRS
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ execute_process(COMMAND ${POSTGRESQL_CONFIG_EXECUTABLE}
+ OUTPUT_VARIABLE POSTGRESQL_CLIENT_INCLUDE_DIRS
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ # This variable is case sensitive for the cmake PostgreSQL module
+ set(PostgreSQL_ADDITIONAL_SEARCH_PATHS ${POSTGRESQL_SERVER_INCLUDE_DIRS} ${POSTGRESQL_CLIENT_INCLUDE_DIRS})
+ endif()
+
+ find_package("PostgreSQL")
+
+ if(POSTGRESQL_FOUND)
+ set(USE_POSTGRESQL TRUE)
+ message(STATUS "PostgreSQL backend enabled")
+ # This variable is case sensitive, don't try to change it to POSTGRESQL_INCLUDE_DIR
+ message(STATUS "PostgreSQL includes: ${PostgreSQL_INCLUDE_DIR}")
+ include_directories(${PostgreSQL_INCLUDE_DIR})
+ else()
+ message(STATUS "PostgreSQL not found!")
+ endif()
+endif(ENABLE_POSTGRESQL)
+
option(ENABLE_LEVELDB "Enable LevelDB backend" TRUE)
set(USE_LEVELDB FALSE)
@@ -262,9 +293,10 @@ if(WIN32)
set(ZLIB_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/../../zlib/zlib-1.2.5"
CACHE PATH "Zlib include directory")
set(ZLIB_LIBRARIES "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.lib"
- CACHE FILEPATH "Path to zlibwapi.lib")
+ CACHE FILEPATH "Path to zlib library (usually zlibwapi.lib)")
set(ZLIB_DLL "${PROJECT_SOURCE_DIR}/../../zlib125dll/dll32/zlibwapi.dll"
- CACHE FILEPATH "Path to zlibwapi.dll (for installation)")
+ CACHE FILEPATH "Path to zlib DLL (for installation)")
+ set(ZLIBWAPI_DLL "" CACHE FILEPATH "Path to zlibwapi DLL")
set(IRRLICHT_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../../irrlicht-1.7.2"
CACHE PATH "irrlicht dir")
if(USE_FREETYPE)
@@ -306,7 +338,10 @@ else()
if(APPLE)
set(PLATFORM_LIBS "-framework CoreFoundation" ${PLATFORM_LIBS})
else()
- set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
+ check_library_exists(rt clock_gettime "" HAVE_LIBRT)
+ if (HAVE_LIBRT)
+ set(PLATFORM_LIBS -lrt ${PLATFORM_LIBS})
+ endif(HAVE_LIBRT)
endif(APPLE)
# This way Xxf86vm is found on OpenBSD too
@@ -346,6 +381,7 @@ add_subdirectory(network)
add_subdirectory(script)
add_subdirectory(unittest)
add_subdirectory(util)
+add_subdirectory(irrlicht_changes)
set(common_SRCS
ban.cpp
@@ -361,6 +397,7 @@ set(common_SRCS
craftdef.cpp
database-dummy.cpp
database-leveldb.cpp
+ database-postgresql.cpp
database-redis.cpp
database-sqlite3.cpp
database.cpp
@@ -379,6 +416,7 @@ set(common_SRCS
light.cpp
log.cpp
map.cpp
+ map_settings_manager.cpp
mapblock.cpp
mapgen.cpp
mapgen_flat.cpp
@@ -407,6 +445,8 @@ set(common_SRCS
porting.cpp
profiler.cpp
quicktune.cpp
+ reflowscan.cpp
+ remoteplayer.cpp
rollback.cpp
rollback_interface.cpp
serialization.cpp
@@ -435,6 +475,7 @@ set(common_SRCS
# This gives us the icon and file version information
if(WIN32)
set(WINRESOURCE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/winresource.rc")
+ set(MINETEST_EXE_MANIFEST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/../misc/minetest.exe.manifest")
if(MINGW)
if(NOT CMAKE_RC_COMPILER)
set(CMAKE_RC_COMPILER "windres.exe")
@@ -447,7 +488,7 @@ if(WIN32)
DEPENDS ${WINRESOURCE_FILE})
SET(common_SRCS ${common_SRCS} ${CMAKE_CURRENT_BINARY_DIR}/winresource_rc.o)
else(MINGW) # Probably MSVC
- set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE})
+ set(common_SRCS ${common_SRCS} ${WINRESOURCE_FILE} ${MINETEST_EXE_MANIFEST_FILE})
endif(MINGW)
endif()
@@ -462,6 +503,7 @@ set(client_SRCS
${common_SRCS}
${sound_SRCS}
${client_network_SRCS}
+ ${client_irrlicht_changes_SRCS}
camera.cpp
client.cpp
clientmap.cpp
@@ -499,6 +541,7 @@ set(client_SRCS
sky.cpp
wieldmesh.cpp
${client_SCRIPT_SRCS}
+ ${UNITTEST_CLIENT_SRCS}
)
list(SORT client_SRCS)
@@ -522,6 +565,7 @@ include_directories(
${LUA_INCLUDE_DIR}
${GMP_INCLUDE_DIR}
${JSON_INCLUDE_DIR}
+ ${X11_INCLUDE_DIR}
${PROJECT_SOURCE_DIR}/script
)
@@ -592,6 +636,9 @@ if(BUILD_CLIENT)
if (USE_CURSES)
target_link_libraries(${PROJECT_NAME} ${CURSES_LIBRARIES})
endif()
+ if (USE_POSTGRESQL)
+ target_link_libraries(${PROJECT_NAME} ${POSTGRESQL_LIBRARY})
+ endif()
if (USE_LEVELDB)
target_link_libraries(${PROJECT_NAME} ${LEVELDB_LIBRARY})
endif()
@@ -622,6 +669,9 @@ if(BUILD_SERVER)
if (USE_CURSES)
target_link_libraries(${PROJECT_NAME}server ${CURSES_LIBRARIES})
endif()
+ if (USE_POSTGRESQL)
+ target_link_libraries(${PROJECT_NAME}server ${POSTGRESQL_LIBRARY})
+ endif()
if (USE_LEVELDB)
target_link_libraries(${PROJECT_NAME}server ${LEVELDB_LIBRARY})
endif()
@@ -639,6 +689,28 @@ if(BUILD_SERVER)
endif()
endif(BUILD_SERVER)
+# Blacklisted locales that don't work.
+# see issue #4638
+set(GETTEXT_BLACKLISTED_LOCALES
+ be
+ he
+ ko
+ ky
+ zh_CN
+ zh_TW
+)
+
+option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
+
+if (GETTEXT_FOUND AND APPLY_LOCALE_BLACKLIST)
+ set(GETTEXT_USED_LOCALES "")
+ foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
+ if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};")
+ list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
+ endif()
+ endforeach()
+ message(STATUS "Locale blacklist applied; Locales used: ${GETTEXT_USED_LOCALES}")
+endif()
# Set some optimizations and tweaks
@@ -648,9 +720,9 @@ if(MSVC)
# Visual Studio
# EHa enables SEH exceptions (used for catching segfaults)
- set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /Ob2 /Oi /Ot /Oy /GL /FD /MT /GS- /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
+ set(CMAKE_CXX_FLAGS_RELEASE "/EHa /Ox /GL /FD /MT /GS- /Zi /arch:SSE /fp:fast /D NDEBUG /D _HAS_ITERATOR_DEBUGGING=0 /TP")
#set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /NODEFAULTLIB:\"libcmtd.lib\" /NODEFAULTLIB:\"libcmt.lib\"")
- set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG")
+ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /DEBUG /OPT:REF /OPT:ICF")
set(CMAKE_CXX_FLAGS_SEMIDEBUG "/MDd /Zi /Ob0 /O1 /RTC1")
@@ -678,8 +750,14 @@ else()
set(OTHER_FLAGS "${OTHER_FLAGS} -Wsign-compare")
endif()
+ if(WIN32 AND NOT ZLIBWAPI_DLL AND CMAKE_SIZEOF_VOID_P EQUAL 4)
+ set(OTHER_FLAGS "${OTHER_FLAGS} -DWIN32_NO_ZLIB_WINAPI")
+ message(WARNING "Defaulting to cdecl for zlib on win32 because ZLIBWAPI_DLL"
+ " isn't set, ensure that ZLIBWAPI_DLL is set if you want stdcall.")
+ endif()
+
if(MINGW)
- set(OTHER_FLAGS "-mthreads -fexceptions")
+ set(OTHER_FLAGS "${OTHER_FLAGS} -mthreads -fexceptions")
endif()
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG ${RELEASE_WARNING_FLAGS} ${WARNING_FLAGS} ${OTHER_FLAGS} -ffast-math -Wall -pipe -funroll-loops")
@@ -751,7 +829,7 @@ if(BUILD_CLIENT)
endif()
if(USE_GETTEXT)
- foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
+ foreach(LOCALE ${GETTEXT_USED_LOCALES})
set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
set(MO_BUILD_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
install(FILES ${MO_BUILD_PATH} DESTINATION ${MO_DEST_PATH})
@@ -780,7 +858,7 @@ endif()
if (USE_GETTEXT)
set(MO_FILES)
- foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
+ foreach(LOCALE ${GETTEXT_USED_LOCALES})
set(PO_FILE_PATH "${GETTEXT_PO_PATH}/${LOCALE}/${PROJECT_NAME}.po")
set_mo_paths(MO_BUILD_PATH MO_DEST_PATH ${LOCALE})
set(MO_FILE_PATH "${MO_BUILD_PATH}/${PROJECT_NAME}.mo")
diff --git a/src/camera.cpp b/src/camera.cpp
index 6893b8cbf..43980db1c 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -103,6 +103,7 @@ Camera::Camera(scene::ISceneManager* smgr, MapDrawControl& draw_control,
m_cache_fall_bobbing_amount = g_settings->getFloat("fall_bobbing_amount");
m_cache_view_bobbing_amount = g_settings->getFloat("view_bobbing_amount");
m_cache_fov = g_settings->getFloat("fov");
+ m_cache_zoom_fov = g_settings->getFloat("zoom_fov");
m_cache_view_bobbing = g_settings->getBool("view_bobbing");
m_nametags.clear();
}
@@ -387,8 +388,13 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
if (m_camera_mode == CAMERA_MODE_THIRD_FRONT)
m_camera_position = my_cp;
- // Get FOV setting
- f32 fov_degrees = m_cache_fov;
+ // Get FOV
+ f32 fov_degrees;
+ if (player->getPlayerControl().zoom && m_gamedef->checkLocalPrivilege("zoom")) {
+ fov_degrees = m_cache_zoom_fov;
+ } else {
+ fov_degrees = m_cache_fov;
+ }
fov_degrees = MYMAX(fov_degrees, 10.0);
fov_degrees = MYMIN(fov_degrees, 170.0);
@@ -466,7 +472,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
{
// Start animation
m_view_bobbing_state = 1;
- m_view_bobbing_speed = MYMIN(speed.getLength(), 40);
+ m_view_bobbing_speed = MYMIN(speed.getLength(), 70);
}
else if (m_view_bobbing_state == 1)
{
@@ -478,13 +484,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime,
void Camera::updateViewingRange()
{
+ f32 viewing_range = g_settings->getFloat("viewing_range");
+ m_draw_control.wanted_range = viewing_range;
if (m_draw_control.range_all) {
m_cameranode->setFarValue(100000.0);
return;
}
-
- f32 viewing_range = g_settings->getFloat("viewing_range");
- m_draw_control.wanted_range = viewing_range;
m_cameranode->setFarValue((viewing_range < 2000) ? 2000 * BS : viewing_range * BS);
}
@@ -546,7 +551,7 @@ void Camera::drawNametags()
// shadow can remain.
continue;
}
- v3f pos = nametag->parent_node->getPosition() + v3f(0.0, 1.1 * BS, 0.0);
+ v3f pos = nametag->parent_node->getAbsolutePosition() + v3f(0.0, 1.1 * BS, 0.0);
f32 transformed_pos[4] = { pos.X, pos.Y, pos.Z, 1.0f };
trans.multiplyWith1x4Matrix(transformed_pos);
if (transformed_pos[3] > 0) {
diff --git a/src/camera.h b/src/camera.h
index ce46c3190..cb0e9686d 100644
--- a/src/camera.h
+++ b/src/camera.h
@@ -231,6 +231,7 @@ private:
f32 m_cache_fall_bobbing_amount;
f32 m_cache_view_bobbing_amount;
f32 m_cache_fov;
+ f32 m_cache_zoom_fov;
bool m_cache_view_bobbing;
std::list<Nametag *> m_nametags;
diff --git a/src/cavegen.cpp b/src/cavegen.cpp
index b8abfbca5..bb6aa25a6 100644
--- a/src/cavegen.cpp
+++ b/src/cavegen.cpp
@@ -23,46 +23,183 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen_v5.h"
#include "mapgen_v6.h"
#include "mapgen_v7.h"
+#include "mg_biome.h"
#include "cavegen.h"
-NoiseParams nparams_caveliquids(0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0.6, 2.0);
+static NoiseParams nparams_caveliquids(0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0.6, 2.0);
-///////////////////////////////////////// Caves V5
+////
+//// CavesNoiseIntersection
+////
+CavesNoiseIntersection::CavesNoiseIntersection(
+ INodeDefManager *nodedef, BiomeManager *biomemgr, v3s16 chunksize,
+ NoiseParams *np_cave1, NoiseParams *np_cave2, s32 seed, float cave_width)
+{
+ assert(nodedef);
+ assert(biomemgr);
+
+ m_ndef = nodedef;
+ m_bmgr = biomemgr;
+
+ m_csize = chunksize;
+ m_cave_width = cave_width;
-CaveV5::CaveV5(Mapgen *mg, PseudoRandom *ps)
+ m_ystride = m_csize.X;
+ m_zstride_1d = m_csize.X * (m_csize.Y + 1);
+
+ // Noises are created using 1-down overgeneration
+ // A Nx-by-1-by-Nz-sized plane is at the bottom of the desired for
+ // re-carving the solid overtop placed for blocking sunlight
+ noise_cave1 = new Noise(np_cave1, seed, m_csize.X, m_csize.Y + 1, m_csize.Z);
+ noise_cave2 = new Noise(np_cave2, seed, m_csize.X, m_csize.Y + 1, m_csize.Z);
+}
+
+
+CavesNoiseIntersection::~CavesNoiseIntersection()
{
- this->mg = mg;
- this->vm = mg->vm;
- this->ndef = mg->ndef;
- this->water_level = mg->water_level;
- this->ps = ps;
- c_water_source = ndef->getId("mapgen_water_source");
- c_lava_source = ndef->getId("mapgen_lava_source");
- c_ice = ndef->getId("mapgen_ice");
- this->np_caveliquids = &nparams_caveliquids;
- this->ystride = mg->csize.X;
-
- if (c_ice == CONTENT_IGNORE)
- c_ice = CONTENT_AIR;
+ delete noise_cave1;
+ delete noise_cave2;
+}
- dswitchint = ps->range(1, 14);
- flooded = ps->range(1, 2) == 2;
- part_max_length_rs = ps->range(2, 4);
- tunnel_routepoints = ps->range(5, ps->range(15, 30));
- min_tunnel_diameter = 5;
- max_tunnel_diameter = ps->range(7, ps->range(8, 24));
+void CavesNoiseIntersection::generateCaves(MMVManip *vm,
+ v3s16 nmin, v3s16 nmax, u8 *biomemap)
+{
+ assert(vm);
+ assert(biomemap);
+
+ noise_cave1->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
+ noise_cave2->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
+
+ v3s16 em = vm->m_area.getExtent();
+ u32 index2d = 0;
+
+ for (s16 z = nmin.Z; z <= nmax.Z; z++)
+ for (s16 x = nmin.X; x <= nmax.X; x++, index2d++) {
+ bool column_is_open = false; // Is column open to overground
+ bool is_under_river = false; // Is column under river water
+ bool is_tunnel = false; // Is tunnel or tunnel floor
+ u32 vi = vm->m_area.index(x, nmax.Y, z);
+ u32 index3d = (z - nmin.Z) * m_zstride_1d + m_csize.Y * m_ystride +
+ (x - nmin.X);
+ // Biome of column
+ Biome *biome = (Biome *)m_bmgr->getRaw(biomemap[index2d]);
+
+ // Don't excavate the overgenerated stone at nmax.Y + 1,
+ // this creates a 'roof' over the tunnel, preventing light in
+ // tunnels at mapchunk borders when generating mapchunks upwards.
+ // This 'roof' is removed when the mapchunk above is generated.
+ for (s16 y = nmax.Y; y >= nmin.Y - 1; y--,
+ index3d -= m_ystride,
+ vm->m_area.add_y(em, vi, -1)) {
+
+ content_t c = vm->m_data[vi].getContent();
+ if (c == CONTENT_AIR || c == biome->c_water_top ||
+ c == biome->c_water) {
+ column_is_open = true;
+ continue;
+ } else if (c == biome->c_river_water) {
+ column_is_open = true;
+ is_under_river = true;
+ continue;
+ }
+ // Ground
+ float d1 = contour(noise_cave1->result[index3d]);
+ float d2 = contour(noise_cave2->result[index3d]);
+
+ if (d1 * d2 > m_cave_width && m_ndef->get(c).is_ground_content) {
+ // In tunnel and ground content, excavate
+ vm->m_data[vi] = MapNode(CONTENT_AIR);
+ is_tunnel = true;
+ } else {
+ // Not in tunnel or not ground content
+ if (is_tunnel && column_is_open &&
+ (c == biome->c_filler || c == biome->c_stone)) {
+ // Tunnel entrance floor
+ if (is_under_river)
+ vm->m_data[vi] = MapNode(biome->c_riverbed);
+ else
+ vm->m_data[vi] = MapNode(biome->c_top);
+ }
- large_cave_is_flat = (ps->range(0, 1) == 0);
+ column_is_open = false;
+ is_tunnel = false;
+ }
+ }
+ }
}
-void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
+////
+//// CavesRandomWalk
+////
+
+CavesRandomWalk::CavesRandomWalk(
+ INodeDefManager *ndef,
+ GenerateNotifier *gennotify,
+ s32 seed,
+ int water_level,
+ content_t water_source,
+ content_t lava_source)
{
- node_min = nmin;
- node_max = nmax;
+ assert(ndef);
+
+ this->ndef = ndef;
+ this->gennotify = gennotify;
+ this->seed = seed;
+ this->water_level = water_level;
+ this->np_caveliquids = &nparams_caveliquids;
+ this->lava_depth = DEFAULT_LAVA_DEPTH;
+
+ c_water_source = water_source;
+ if (c_water_source == CONTENT_IGNORE)
+ c_water_source = ndef->getId("mapgen_water_source");
+ if (c_water_source == CONTENT_IGNORE)
+ c_water_source = CONTENT_AIR;
+
+ c_lava_source = lava_source;
+ if (c_lava_source == CONTENT_IGNORE)
+ c_lava_source = ndef->getId("mapgen_lava_source");
+ if (c_lava_source == CONTENT_IGNORE)
+ c_lava_source = CONTENT_AIR;
+}
+
+
+void CavesRandomWalk::makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax,
+ PseudoRandom *ps, bool is_large_cave, int max_stone_height, s16 *heightmap)
+{
+ assert(vm);
+ assert(ps);
+
+ this->vm = vm;
+ this->ps = ps;
+ this->node_min = nmin;
+ this->node_max = nmax;
+ this->heightmap = heightmap;
+ this->large_cave = is_large_cave;
+
+ this->ystride = nmax.X - nmin.X + 1;
+
+ // Set initial parameters from randomness
+ int dswitchint = ps->range(1, 14);
+ flooded = ps->range(1, 2) == 2;
+
+ if (large_cave) {
+ part_max_length_rs = ps->range(2, 4);
+ tunnel_routepoints = ps->range(5, ps->range(15, 30));
+ min_tunnel_diameter = 5;
+ max_tunnel_diameter = ps->range(7, ps->range(8, 24));
+ } else {
+ part_max_length_rs = ps->range(2, 9);
+ tunnel_routepoints = ps->range(10, ps->range(15, 30));
+ min_tunnel_diameter = 2;
+ max_tunnel_diameter = ps->range(2, 6);
+ }
+
+ large_cave_is_flat = (ps->range(0, 1) == 0);
+
main_direction = v3f(0, 0, 0);
// Allowed route area size in nodes
@@ -72,10 +209,10 @@ void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
// Allow a bit more
//(this should be more than the maximum radius of the tunnel)
- s16 insure = 10;
+ const s16 insure = 10;
s16 more = MYMAX(MAP_BLOCKSIZE - max_tunnel_diameter / 2 - insure, 1);
- ar += v3s16(1,0,1) * more * 2;
- of -= v3s16(1,0,1) * more;
+ ar += v3s16(1, 0, 1) * more * 2;
+ of -= v3s16(1, 0, 1) * more;
route_y_min = 0;
// Allow half a diameter + 7 over stone surface
@@ -84,13 +221,15 @@ void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
// Limit maximum to area
route_y_max = rangelim(route_y_max, 0, ar.Y - 1);
- s16 min = 0;
+ if (large_cave) {
+ s16 minpos = 0;
if (node_min.Y < water_level && node_max.Y > water_level) {
- min = water_level - max_tunnel_diameter/3 - of.Y;
- route_y_max = water_level + max_tunnel_diameter/3 - of.Y;
+ minpos = water_level - max_tunnel_diameter / 3 - of.Y;
+ route_y_max = water_level + max_tunnel_diameter / 3 - of.Y;
}
- route_y_min = ps->range(min, min + max_tunnel_diameter);
- route_y_min = rangelim(route_y_min, 0, route_y_max);
+ route_y_min = ps->range(minpos, minpos + max_tunnel_diameter);
+ route_y_min = rangelim(route_y_min, 0, route_y_max);
+ }
s16 route_start_y_min = route_y_min;
s16 route_start_y_max = route_y_max;
@@ -99,30 +238,42 @@ void CaveV5::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y - 1);
// Randomize starting position
- orp = v3f(
- (float)(ps->next() % ar.X) + 0.5,
- (float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5,
- (float)(ps->next() % ar.Z) + 0.5
- );
+ orp.Z = (float)(ps->next() % ar.Z) + 0.5f;
+ orp.Y = (float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5f;
+ orp.X = (float)(ps->next() % ar.X) + 0.5f;
// Add generation notify begin event
- v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
- GenNotifyType notifytype = GENNOTIFY_LARGECAVE_BEGIN;
- mg->gennotify.addEvent(notifytype, abs_pos);
+ if (gennotify) {
+ v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+ GenNotifyType notifytype = large_cave ?
+ GENNOTIFY_LARGECAVE_BEGIN : GENNOTIFY_CAVE_BEGIN;
+ gennotify->addEvent(notifytype, abs_pos);
+ }
// Generate some tunnel starting from orp
for (u16 j = 0; j < tunnel_routepoints; j++)
makeTunnel(j % dswitchint == 0);
// Add generation notify end event
- abs_pos = v3s16(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
- notifytype = GENNOTIFY_LARGECAVE_END;
- mg->gennotify.addEvent(notifytype, abs_pos);
+ if (gennotify) {
+ v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+ GenNotifyType notifytype = large_cave ?
+ GENNOTIFY_LARGECAVE_END : GENNOTIFY_CAVE_END;
+ gennotify->addEvent(notifytype, abs_pos);
+ }
}
-void CaveV5::makeTunnel(bool dirswitch)
+void CavesRandomWalk::makeTunnel(bool dirswitch)
{
+ if (dirswitch && !large_cave) {
+ main_direction.Z = ((float)(ps->next() % 20) - (float)10) / 10;
+ main_direction.Y = ((float)(ps->next() % 20) - (float)10) / 30;
+ main_direction.X = ((float)(ps->next() % 20) - (float)10) / 10;
+
+ main_direction *= (float)ps->range(0, 10) / 10;
+ }
+
// Randomize size
s16 min_d = min_tunnel_diameter;
s16 max_d = max_tunnel_diameter;
@@ -130,47 +281,38 @@ void CaveV5::makeTunnel(bool dirswitch)
s16 rs_part_max_length_rs = rs * part_max_length_rs;
v3s16 maxlen;
- maxlen = v3s16(
- rs_part_max_length_rs,
- rs_part_max_length_rs / 2,
- rs_part_max_length_rs
- );
+ if (large_cave) {
+ maxlen = v3s16(
+ rs_part_max_length_rs,
+ rs_part_max_length_rs / 2,
+ rs_part_max_length_rs
+ );
+ } else {
+ maxlen = v3s16(
+ rs_part_max_length_rs,
+ ps->range(1, rs_part_max_length_rs),
+ rs_part_max_length_rs
+ );
+ }
v3f vec;
// Jump downward sometimes
- vec = v3f(
- (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
- (float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2,
- (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
- );
+ if (!large_cave && ps->range(0, 12) == 0) {
+ vec.Z = (float)(ps->next() % (maxlen.Z * 1)) - (float)maxlen.Z / 2;
+ vec.Y = (float)(ps->next() % (maxlen.Y * 2)) - (float)maxlen.Y;
+ vec.X = (float)(ps->next() % (maxlen.X * 1)) - (float)maxlen.X / 2;
+ } else {
+ vec.Z = (float)(ps->next() % (maxlen.Z * 1)) - (float)maxlen.Z / 2;
+ vec.Y = (float)(ps->next() % (maxlen.Y * 1)) - (float)maxlen.Y / 2;
+ vec.X = (float)(ps->next() % (maxlen.X * 1)) - (float)maxlen.X / 2;
+ }
// Do not make caves that are above ground.
// It is only necessary to check the startpoint and endpoint.
- v3s16 orpi(orp.X, orp.Y, orp.Z);
- v3s16 veci(vec.X, vec.Y, vec.Z);
- v3s16 p;
-
- p = orpi + veci + of + rs / 2;
- if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
- p.X >= node_min.X && p.X <= node_max.X) {
- u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
- s16 h = mg->heightmap[index];
- if (h < p.Y)
- return;
- } else if (p.Y > water_level) {
- return; // If it's not in our heightmap, use a simple heuristic
- }
-
- p = orpi + of + rs / 2;
- if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
- p.X >= node_min.X && p.X <= node_max.X) {
- u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
- s16 h = mg->heightmap[index];
- if (h < p.Y)
- return;
- } else if (p.Y > water_level) {
+ v3s16 p1 = v3s16(orp.X, orp.Y, orp.Z) + of + rs / 2;
+ v3s16 p2 = v3s16(vec.X, vec.Y, vec.Z) + p1;
+ if (isPosAboveSurface(p1) || isPosAboveSurface(p2))
return;
- }
vec += main_direction;
@@ -193,21 +335,21 @@ void CaveV5::makeTunnel(bool dirswitch)
vec = rp - orp;
float veclen = vec.getLength();
- if (veclen < 0.05)
- veclen = 1.0;
+ if (veclen < 0.05f)
+ veclen = 1.0f;
// Every second section is rough
bool randomize_xz = (ps->range(1, 2) == 1);
// Carve routes
- for (float f = 0; f < 1.0; f += 1.0 / veclen)
+ for (float f = 0.f; f < 1.0f; f += 1.0f / veclen)
carveRoute(vec, f, randomize_xz);
orp = rp;
}
-void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz)
+void CavesRandomWalk::carveRoute(v3f vec, float f, bool randomize_xz)
{
MapNode airnode(CONTENT_AIR);
MapNode waternode(c_water_source);
@@ -217,22 +359,24 @@ void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz)
startp += of;
float nval = NoisePerlin3D(np_caveliquids, startp.X,
- startp.Y, startp.Z, mg->seed);
- MapNode liquidnode = (nval < 0.40 && node_max.Y < MGV5_LAVA_DEPTH) ?
+ startp.Y, startp.Z, seed);
+ MapNode liquidnode = (nval < 0.40f && node_max.Y < lava_depth) ?
lavanode : waternode;
v3f fp = orp + vec * f;
- fp.X += 0.1 * ps->range(-10, 10);
- fp.Z += 0.1 * ps->range(-10, 10);
+ fp.X += 0.1f * ps->range(-10, 10);
+ fp.Z += 0.1f * ps->range(-10, 10);
v3s16 cp(fp.X, fp.Y, fp.Z);
- s16 d0 = -rs/2;
+ s16 d0 = -rs / 2;
s16 d1 = d0 + rs;
if (randomize_xz) {
d0 += ps->range(-1, 1);
d1 += ps->range(-1, 1);
}
+ bool flat_cave_floor = !large_cave && ps->range(0, 2) == 2;
+
for (s16 z0 = d0; z0 <= d1; z0++) {
s16 si = rs / 2 - MYMAX(0, abs(z0) - rs / 7 - 1);
for (s16 x0 = -si - ps->range(0,1); x0 <= si - 1 + ps->range(0,1); x0++) {
@@ -241,6 +385,10 @@ void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz)
s16 si2 = rs / 2 - MYMAX(0, maxabsxz - rs / 7 - 1);
for (s16 y0 = -si2; y0 <= si2; y0++) {
+ // Make better floors in small caves
+ if (flat_cave_floor && y0 <= -rs / 2 && rs <= 7)
+ continue;
+
if (large_cave_is_flat) {
// Make large caves not so tall
if (rs > 7 && abs(y0) >= rs / 3)
@@ -258,63 +406,105 @@ void CaveV5::carveRoute(v3f vec, float f, bool randomize_xz)
if (!ndef->get(c).is_ground_content)
continue;
- int full_ymin = node_min.Y - MAP_BLOCKSIZE;
- int full_ymax = node_max.Y + MAP_BLOCKSIZE;
-
- if (flooded && full_ymin < water_level &&
- full_ymax > water_level)
- vm->m_data[i] = (p.Y <= water_level) ?
- waternode : airnode;
- else if (flooded && full_ymax < water_level)
- vm->m_data[i] = (p.Y < startp.Y - 4) ?
- liquidnode : airnode;
- else
+ if (large_cave) {
+ int full_ymin = node_min.Y - MAP_BLOCKSIZE;
+ int full_ymax = node_max.Y + MAP_BLOCKSIZE;
+
+ if (flooded && full_ymin < water_level && full_ymax > water_level)
+ vm->m_data[i] = (p.Y <= water_level) ? waternode : airnode;
+ else if (flooded && full_ymax < water_level)
+ vm->m_data[i] = (p.Y < startp.Y - 4) ? liquidnode : airnode;
+ else
+ vm->m_data[i] = airnode;
+ } else {
+ if (c == CONTENT_IGNORE)
+ continue;
+
vm->m_data[i] = airnode;
+ vm->m_flags[i] |= VMANIP_FLAG_CAVE;
+ }
}
}
}
}
-///////////////////////////////////////// Caves V6
+inline bool CavesRandomWalk::isPosAboveSurface(v3s16 p)
+{
+ if (heightmap != NULL &&
+ p.Z >= node_min.Z && p.Z <= node_max.Z &&
+ p.X >= node_min.X && p.X <= node_max.X) {
+ u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
+ if (heightmap[index] < p.Y)
+ return true;
+ } else if (p.Y > water_level) {
+ return true;
+ }
+
+ return false;
+}
+
+
+////
+//// CavesV6
+////
+
+CavesV6::CavesV6(INodeDefManager *ndef, GenerateNotifier *gennotify,
+ int water_level, content_t water_source, content_t lava_source)
+{
+ assert(ndef);
+
+ this->ndef = ndef;
+ this->gennotify = gennotify;
+ this->water_level = water_level;
+
+ c_water_source = water_source;
+ if (c_water_source == CONTENT_IGNORE)
+ c_water_source = ndef->getId("mapgen_water_source");
+ if (c_water_source == CONTENT_IGNORE)
+ c_water_source = CONTENT_AIR;
+
+ c_lava_source = lava_source;
+ if (c_lava_source == CONTENT_IGNORE)
+ c_lava_source = ndef->getId("mapgen_lava_source");
+ if (c_lava_source == CONTENT_IGNORE)
+ c_lava_source = CONTENT_AIR;
+}
-CaveV6::CaveV6(MapgenV6 *mg, PseudoRandom *ps, PseudoRandom *ps2, bool is_large_cave)
+void CavesV6::makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax,
+ PseudoRandom *ps, PseudoRandom *ps2,
+ bool is_large_cave, int max_stone_height, s16 *heightmap)
{
- this->mg = mg;
- this->vm = mg->vm;
- this->ndef = mg->ndef;
- this->water_level = mg->water_level;
- this->large_cave = is_large_cave;
- this->ps = ps;
- this->ps2 = ps2;
- this->c_water_source = mg->c_water_source;
- this->c_lava_source = mg->c_lava_source;
+ assert(vm);
+ assert(ps);
+ assert(ps2);
+
+ this->vm = vm;
+ this->ps = ps;
+ this->ps2 = ps2;
+ this->node_min = nmin;
+ this->node_max = nmax;
+ this->heightmap = heightmap;
+ this->large_cave = is_large_cave;
+
+ this->ystride = nmax.X - nmin.X + 1;
+ // Set initial parameters from randomness
min_tunnel_diameter = 2;
max_tunnel_diameter = ps->range(2, 6);
- dswitchint = ps->range(1, 14);
- flooded = true;
-
+ int dswitchint = ps->range(1, 14);
if (large_cave) {
- part_max_length_rs = ps->range(2,4);
- tunnel_routepoints = ps->range(5, ps->range(15,30));
+ part_max_length_rs = ps->range(2, 4);
+ tunnel_routepoints = ps->range(5, ps->range(15, 30));
min_tunnel_diameter = 5;
- max_tunnel_diameter = ps->range(7, ps->range(8,24));
+ max_tunnel_diameter = ps->range(7, ps->range(8, 24));
} else {
- part_max_length_rs = ps->range(2,9);
- tunnel_routepoints = ps->range(10, ps->range(15,30));
+ part_max_length_rs = ps->range(2, 9);
+ tunnel_routepoints = ps->range(10, ps->range(15, 30));
}
+ large_cave_is_flat = (ps->range(0, 1) == 0);
- large_cave_is_flat = (ps->range(0,1) == 0);
-}
-
-
-void CaveV6::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
-{
- node_min = nmin;
- node_max = nmax;
- max_stone_y = max_stone_height;
main_direction = v3f(0, 0, 0);
// Allowed route area size in nodes
@@ -325,67 +515,68 @@ void CaveV6::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
// Allow a bit more
//(this should be more than the maximum radius of the tunnel)
const s16 max_spread_amount = MAP_BLOCKSIZE;
- s16 insure = 10;
+ const s16 insure = 10;
s16 more = MYMAX(max_spread_amount - max_tunnel_diameter / 2 - insure, 1);
- ar += v3s16(1,0,1) * more * 2;
- of -= v3s16(1,0,1) * more;
+ ar += v3s16(1, 0, 1) * more * 2;
+ of -= v3s16(1, 0, 1) * more;
route_y_min = 0;
// Allow half a diameter + 7 over stone surface
- route_y_max = -of.Y + max_stone_y + max_tunnel_diameter / 2 + 7;
+ route_y_max = -of.Y + max_stone_height + max_tunnel_diameter / 2 + 7;
// Limit maximum to area
route_y_max = rangelim(route_y_max, 0, ar.Y - 1);
if (large_cave) {
- s16 min = 0;
+ s16 minpos = 0;
if (node_min.Y < water_level && node_max.Y > water_level) {
- min = water_level - max_tunnel_diameter/3 - of.Y;
- route_y_max = water_level + max_tunnel_diameter/3 - of.Y;
+ minpos = water_level - max_tunnel_diameter / 3 - of.Y;
+ route_y_max = water_level + max_tunnel_diameter / 3 - of.Y;
}
- route_y_min = ps->range(min, min + max_tunnel_diameter);
+ route_y_min = ps->range(minpos, minpos + max_tunnel_diameter);
route_y_min = rangelim(route_y_min, 0, route_y_max);
}
s16 route_start_y_min = route_y_min;
s16 route_start_y_max = route_y_max;
- route_start_y_min = rangelim(route_start_y_min, 0, ar.Y-1);
- route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y-1);
+ route_start_y_min = rangelim(route_start_y_min, 0, ar.Y - 1);
+ route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y - 1);
// Randomize starting position
- orp = v3f(
- (float)(ps->next() % ar.X) + 0.5,
- (float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5,
- (float)(ps->next() % ar.Z) + 0.5
- );
+ orp.Z = (float)(ps->next() % ar.Z) + 0.5f;
+ orp.Y = (float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5f;
+ orp.X = (float)(ps->next() % ar.X) + 0.5f;
// Add generation notify begin event
- v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
- GenNotifyType notifytype = large_cave ?
- GENNOTIFY_LARGECAVE_BEGIN : GENNOTIFY_CAVE_BEGIN;
- mg->gennotify.addEvent(notifytype, abs_pos);
+ if (gennotify != NULL) {
+ v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+ GenNotifyType notifytype = large_cave ?
+ GENNOTIFY_LARGECAVE_BEGIN : GENNOTIFY_CAVE_BEGIN;
+ gennotify->addEvent(notifytype, abs_pos);
+ }
// Generate some tunnel starting from orp
for (u16 j = 0; j < tunnel_routepoints; j++)
makeTunnel(j % dswitchint == 0);
// Add generation notify end event
- abs_pos = v3s16(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
- notifytype = large_cave ?
- GENNOTIFY_LARGECAVE_END : GENNOTIFY_CAVE_END;
- mg->gennotify.addEvent(notifytype, abs_pos);
+ if (gennotify != NULL) {
+ v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
+ GenNotifyType notifytype = large_cave ?
+ GENNOTIFY_LARGECAVE_END : GENNOTIFY_CAVE_END;
+ gennotify->addEvent(notifytype, abs_pos);
+ }
}
-void CaveV6::makeTunnel(bool dirswitch)
+void CavesV6::makeTunnel(bool dirswitch)
{
if (dirswitch && !large_cave) {
- main_direction = v3f(
- ((float)(ps->next() % 20) - (float)10) / 10,
- ((float)(ps->next() % 20) - (float)10) / 30,
- ((float)(ps->next() % 20) - (float)10) / 10
- );
+ main_direction.Z = ((float)(ps->next() % 20) - (float)10) / 10;
+ main_direction.Y = ((float)(ps->next() % 20) - (float)10) / 30;
+ main_direction.X = ((float)(ps->next() % 20) - (float)10) / 10;
+
main_direction *= (float)ps->range(0, 10) / 10;
}
@@ -410,54 +601,30 @@ void CaveV6::makeTunnel(bool dirswitch)
);
}
- v3f vec(
- (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
- (float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2,
- (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
- );
+ v3f vec;
+ vec.Z = (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2;
+ vec.Y = (float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2;
+ vec.X = (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2;
// Jump downward sometimes
if (!large_cave && ps->range(0, 12) == 0) {
- vec = v3f(
- (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
- (float)(ps->next() % (maxlen.Y * 2)) - (float)maxlen.Y,
- (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
- );
+ vec.Z = (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2;
+ vec.Y = (float)(ps->next() % (maxlen.Y * 2)) - (float)maxlen.Y;
+ vec.X = (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2;
}
- // Do not make caves that are entirely above ground, to fix
- // shadow bugs caused by overgenerated large caves.
+ // Do not make caves that are entirely above ground, to fix shadow bugs
+ // caused by overgenerated large caves.
// It is only necessary to check the startpoint and endpoint.
- v3s16 orpi(orp.X, orp.Y, orp.Z);
- v3s16 veci(vec.X, vec.Y, vec.Z);
- s16 h1;
- s16 h2;
-
- v3s16 p1 = orpi + veci + of + rs / 2;
- if (p1.Z >= node_min.Z && p1.Z <= node_max.Z &&
- p1.X >= node_min.X && p1.X <= node_max.X) {
- u32 index1 = (p1.Z - node_min.Z) * mg->ystride +
- (p1.X - node_min.X);
- h1 = mg->heightmap[index1];
- } else {
- h1 = water_level; // If not in heightmap
- }
+ v3s16 p1 = v3s16(orp.X, orp.Y, orp.Z) + of + rs / 2;
+ v3s16 p2 = v3s16(vec.X, vec.Y, vec.Z) + p1;
- v3s16 p2 = orpi + of + rs / 2;
- if (p2.Z >= node_min.Z && p2.Z <= node_max.Z &&
- p2.X >= node_min.X && p2.X <= node_max.X) {
- u32 index2 = (p2.Z - node_min.Z) * mg->ystride +
- (p2.X - node_min.X);
- h2 = mg->heightmap[index2];
- } else {
- h2 = water_level;
- }
-
- // If startpoint and endpoint are above ground,
- // disable placing of nodes in carveRoute while
- // still running all pseudorandom calls to ensure
- // caves consistent with existing worlds.
- bool tunnel_above_ground = p1.Y > h1 && p2.Y > h2;
+ // If startpoint and endpoint are above ground, disable placement of nodes
+ // in carveRoute while still running all PseudoRandom calls to ensure caves
+ // are consistent with existing worlds.
+ bool tunnel_above_ground =
+ p1.Y > getSurfaceFromHeightmap(p1) &&
+ p2.Y > getSurfaceFromHeightmap(p2);
vec += main_direction;
@@ -481,21 +648,22 @@ void CaveV6::makeTunnel(bool dirswitch)
float veclen = vec.getLength();
// As odd as it sounds, veclen is *exactly* 0.0 sometimes, causing a FPE
- if (veclen < 0.05)
- veclen = 1.0;
+ if (veclen < 0.05f)
+ veclen = 1.0f;
// Every second section is rough
bool randomize_xz = (ps2->range(1, 2) == 1);
// Carve routes
- for (float f = 0; f < 1.0; f += 1.0 / veclen)
+ for (float f = 0.f; f < 1.0f; f += 1.0f / veclen)
carveRoute(vec, f, randomize_xz, tunnel_above_ground);
orp = rp;
}
-void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_ground)
+void CavesV6::carveRoute(v3f vec, float f, bool randomize_xz,
+ bool tunnel_above_ground)
{
MapNode airnode(CONTENT_AIR);
MapNode waternode(c_water_source);
@@ -505,11 +673,11 @@ void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_g
startp += of;
v3f fp = orp + vec * f;
- fp.X += 0.1 * ps->range(-10, 10);
- fp.Z += 0.1 * ps->range(-10, 10);
+ fp.X += 0.1f * ps->range(-10, 10);
+ fp.Z += 0.1f * ps->range(-10, 10);
v3s16 cp(fp.X, fp.Y, fp.Z);
- s16 d0 = -rs/2;
+ s16 d0 = -rs / 2;
s16 d1 = d0 + rs;
if (randomize_xz) {
d0 += ps->range(-1, 1);
@@ -546,13 +714,10 @@ void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_g
int full_ymin = node_min.Y - MAP_BLOCKSIZE;
int full_ymax = node_max.Y + MAP_BLOCKSIZE;
- if (flooded && full_ymin < water_level &&
- full_ymax > water_level) {
- vm->m_data[i] = (p.Y <= water_level) ?
- waternode : airnode;
- } else if (flooded && full_ymax < water_level) {
- vm->m_data[i] = (p.Y < startp.Y - 2) ?
- lavanode : airnode;
+ if (full_ymin < water_level && full_ymax > water_level) {
+ vm->m_data[i] = (p.Y <= water_level) ? waternode : airnode;
+ } else if (full_ymax < water_level) {
+ vm->m_data[i] = (p.Y < startp.Y - 2) ? lavanode : airnode;
} else {
vm->m_data[i] = airnode;
}
@@ -569,246 +734,14 @@ void CaveV6::carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_g
}
-///////////////////////////////////////// Caves V7
-
-
-CaveV7::CaveV7(MapgenV7 *mg, PseudoRandom *ps)
-{
- this->mg = mg;
- this->vm = mg->vm;
- this->ndef = mg->ndef;
- this->water_level = mg->water_level;
- this->ps = ps;
- this->c_water_source = mg->c_water_source;
- this->c_lava_source = mg->c_lava_source;
- this->c_ice = mg->c_ice;
- this->np_caveliquids = &nparams_caveliquids;
-
- dswitchint = ps->range(1, 14);
- flooded = ps->range(1, 2) == 2;
-
- part_max_length_rs = ps->range(2, 4);
- tunnel_routepoints = ps->range(5, ps->range(15, 30));
- min_tunnel_diameter = 5;
- max_tunnel_diameter = ps->range(7, ps->range(8, 24));
-
- large_cave_is_flat = (ps->range(0, 1) == 0);
-}
-
-
-void CaveV7::makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height)
+inline s16 CavesV6::getSurfaceFromHeightmap(v3s16 p)
{
- node_min = nmin;
- node_max = nmax;
- max_stone_y = max_stone_height;
- main_direction = v3f(0, 0, 0);
-
- // Allowed route area size in nodes
- ar = node_max - node_min + v3s16(1, 1, 1);
- // Area starting point in nodes
- of = node_min;
-
- // Allow a bit more
- //(this should be more than the maximum radius of the tunnel)
- s16 insure = 10;
- s16 more = MYMAX(MAP_BLOCKSIZE - max_tunnel_diameter / 2 - insure, 1);
- ar += v3s16(1,0,1) * more * 2;
- of -= v3s16(1,0,1) * more;
-
- route_y_min = 0;
- // Allow half a diameter + 7 over stone surface
- route_y_max = -of.Y + max_stone_y + max_tunnel_diameter / 2 + 7;
-
- // Limit maximum to area
- route_y_max = rangelim(route_y_max, 0, ar.Y - 1);
-
- s16 min = 0;
- if (node_min.Y < water_level && node_max.Y > water_level) {
- min = water_level - max_tunnel_diameter/3 - of.Y;
- route_y_max = water_level + max_tunnel_diameter/3 - of.Y;
- }
- route_y_min = ps->range(min, min + max_tunnel_diameter);
- route_y_min = rangelim(route_y_min, 0, route_y_max);
-
- s16 route_start_y_min = route_y_min;
- s16 route_start_y_max = route_y_max;
-
- route_start_y_min = rangelim(route_start_y_min, 0, ar.Y - 1);
- route_start_y_max = rangelim(route_start_y_max, route_start_y_min, ar.Y - 1);
-
- // Randomize starting position
- orp = v3f(
- (float)(ps->next() % ar.X) + 0.5,
- (float)(ps->range(route_start_y_min, route_start_y_max)) + 0.5,
- (float)(ps->next() % ar.Z) + 0.5
- );
-
- // Add generation notify begin event
- v3s16 abs_pos(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
- GenNotifyType notifytype = GENNOTIFY_LARGECAVE_BEGIN;
- mg->gennotify.addEvent(notifytype, abs_pos);
-
- // Generate some tunnel starting from orp
- for (u16 j = 0; j < tunnel_routepoints; j++)
- makeTunnel(j % dswitchint == 0);
-
- // Add generation notify end event
- abs_pos = v3s16(of.X + orp.X, of.Y + orp.Y, of.Z + orp.Z);
- notifytype = GENNOTIFY_LARGECAVE_END;
- mg->gennotify.addEvent(notifytype, abs_pos);
-}
-
-
-void CaveV7::makeTunnel(bool dirswitch)
-{
- // Randomize size
- s16 min_d = min_tunnel_diameter;
- s16 max_d = max_tunnel_diameter;
- rs = ps->range(min_d, max_d);
- s16 rs_part_max_length_rs = rs * part_max_length_rs;
-
- v3s16 maxlen;
- maxlen = v3s16(
- rs_part_max_length_rs,
- rs_part_max_length_rs / 2,
- rs_part_max_length_rs
- );
-
- v3f vec;
- // Jump downward sometimes
- vec = v3f(
- (float)(ps->next() % maxlen.X) - (float)maxlen.X / 2,
- (float)(ps->next() % maxlen.Y) - (float)maxlen.Y / 2,
- (float)(ps->next() % maxlen.Z) - (float)maxlen.Z / 2
- );
-
- // Do not make caves that are above ground.
- // It is only necessary to check the startpoint and endpoint.
- v3s16 orpi(orp.X, orp.Y, orp.Z);
- v3s16 veci(vec.X, vec.Y, vec.Z);
- v3s16 p;
-
- p = orpi + veci + of + rs / 2;
- if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
- p.X >= node_min.X && p.X <= node_max.X) {
- u32 index = (p.Z - node_min.Z) * mg->ystride + (p.X - node_min.X);
- s16 h = mg->ridge_heightmap[index];
- if (h < p.Y)
- return;
- } else if (p.Y > water_level) {
- return; // If it's not in our heightmap, use a simple heuristic
- }
-
- p = orpi + of + rs / 2;
- if (p.Z >= node_min.Z && p.Z <= node_max.Z &&
+ if (heightmap != NULL &&
+ p.Z >= node_min.Z && p.Z <= node_max.Z &&
p.X >= node_min.X && p.X <= node_max.X) {
- u32 index = (p.Z - node_min.Z) * mg->ystride + (p.X - node_min.X);
- s16 h = mg->ridge_heightmap[index];
- if (h < p.Y)
- return;
- } else if (p.Y > water_level) {
- return;
- }
-
- vec += main_direction;
-
- v3f rp = orp + vec;
- if (rp.X < 0)
- rp.X = 0;
- else if (rp.X >= ar.X)
- rp.X = ar.X - 1;
-
- if (rp.Y < route_y_min)
- rp.Y = route_y_min;
- else if (rp.Y >= route_y_max)
- rp.Y = route_y_max - 1;
-
- if (rp.Z < 0)
- rp.Z = 0;
- else if (rp.Z >= ar.Z)
- rp.Z = ar.Z - 1;
-
- vec = rp - orp;
-
- float veclen = vec.getLength();
- if (veclen < 0.05)
- veclen = 1.0;
-
- // Every second section is rough
- bool randomize_xz = (ps->range(1, 2) == 1);
-
- // Carve routes
- for (float f = 0; f < 1.0; f += 1.0 / veclen)
- carveRoute(vec, f, randomize_xz);
-
- orp = rp;
-}
-
-
-void CaveV7::carveRoute(v3f vec, float f, bool randomize_xz)
-{
- MapNode airnode(CONTENT_AIR);
- MapNode waternode(c_water_source);
- MapNode lavanode(c_lava_source);
-
- v3s16 startp(orp.X, orp.Y, orp.Z);
- startp += of;
-
- float nval = NoisePerlin3D(np_caveliquids, startp.X,
- startp.Y, startp.Z, mg->seed);
- MapNode liquidnode = (nval < 0.40 && node_max.Y < MGV7_LAVA_DEPTH) ?
- lavanode : waternode;
-
- v3f fp = orp + vec * f;
- fp.X += 0.1 * ps->range(-10, 10);
- fp.Z += 0.1 * ps->range(-10, 10);
- v3s16 cp(fp.X, fp.Y, fp.Z);
-
- s16 d0 = -rs/2;
- s16 d1 = d0 + rs;
- if (randomize_xz) {
- d0 += ps->range(-1, 1);
- d1 += ps->range(-1, 1);
- }
-
- for (s16 z0 = d0; z0 <= d1; z0++) {
- s16 si = rs / 2 - MYMAX(0, abs(z0) - rs / 7 - 1);
- for (s16 x0 = -si - ps->range(0,1); x0 <= si - 1 + ps->range(0,1); x0++) {
- s16 maxabsxz = MYMAX(abs(x0), abs(z0));
-
- s16 si2 = rs / 2 - MYMAX(0, maxabsxz - rs / 7 - 1);
-
- for (s16 y0 = -si2; y0 <= si2; y0++) {
- if (large_cave_is_flat) {
- // Make large caves not so tall
- if (rs > 7 && abs(y0) >= rs / 3)
- continue;
- }
-
- v3s16 p(cp.X + x0, cp.Y + y0, cp.Z + z0);
- p += of;
-
- if (vm->m_area.contains(p) == false)
- continue;
-
- u32 i = vm->m_area.index(p);
- content_t c = vm->m_data[i].getContent();
- if (!ndef->get(c).is_ground_content)
- continue;
-
- int full_ymin = node_min.Y - MAP_BLOCKSIZE;
- int full_ymax = node_max.Y + MAP_BLOCKSIZE;
-
- if (flooded && full_ymin < water_level &&
- full_ymax > water_level)
- vm->m_data[i] = (p.Y <= water_level) ?
- waternode : airnode;
- else if (flooded && full_ymax < water_level)
- vm->m_data[i] = (p.Y < startp.Y - 4) ?
- liquidnode : airnode;
- else
- vm->m_data[i] = airnode;
- }
- }
+ u32 index = (p.Z - node_min.Z) * ystride + (p.X - node_min.X);
+ return heightmap[index];
+ } else {
+ return water_level;
}
}
diff --git a/src/cavegen.h b/src/cavegen.h
index a1124711b..2bf503d47 100644
--- a/src/cavegen.h
+++ b/src/cavegen.h
@@ -21,69 +21,79 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define CAVEGEN_HEADER
#define VMANIP_FLAG_CAVE VOXELFLAG_CHECKED1
-#define MGV5_LAVA_DEPTH -256
-#define MGV7_LAVA_DEPTH -256
+#define DEFAULT_LAVA_DEPTH (-256)
-class MapgenV5;
-class MapgenV6;
-class MapgenV7;
+class GenerateNotifier;
-class CaveV5 {
-public:
- Mapgen *mg;
- MMVManip *vm;
- INodeDefManager *ndef;
+/*
+ CavesNoiseIntersection is a cave digging algorithm that carves smooth,
+ web-like, continuous tunnels at points where the density of the intersection
+ between two separate 3d noises is above a certain value. This value,
+ cave_width, can be modified to set the effective width of these tunnels.
- NoiseParams *np_caveliquids;
+ This algorithm is relatively heavyweight, taking ~80ms to generate an
+ 80x80x80 chunk of map on a modern processor. Use sparingly!
- s16 min_tunnel_diameter;
- s16 max_tunnel_diameter;
- u16 tunnel_routepoints;
- int dswitchint;
- int part_max_length_rs;
-
- bool large_cave_is_flat;
- bool flooded;
+ TODO(hmmmm): Remove dependency on biomes
+ TODO(hmmmm): Find alternative to overgeneration as solution for sunlight issue
+*/
+class CavesNoiseIntersection {
+public:
+ CavesNoiseIntersection(INodeDefManager *nodedef, BiomeManager *biomemgr,
+ v3s16 chunksize, NoiseParams *np_cave1, NoiseParams *np_cave2,
+ s32 seed, float cave_width);
+ ~CavesNoiseIntersection();
- s16 max_stone_y;
- v3s16 node_min;
- v3s16 node_max;
+ void generateCaves(MMVManip *vm, v3s16 nmin, v3s16 nmax, u8 *biomemap);
- v3f orp; // starting point, relative to caved space
- v3s16 of; // absolute coordinates of caved space
- v3s16 ar; // allowed route area
- s16 rs; // tunnel radius size
- v3f main_direction;
+private:
+ INodeDefManager *m_ndef;
+ BiomeManager *m_bmgr;
- s16 route_y_min;
- s16 route_y_max;
+ // configurable parameters
+ v3s16 m_csize;
+ float m_cave_width;
- PseudoRandom *ps;
+ // intermediate state variables
+ u16 m_ystride;
+ u16 m_zstride_1d;
- content_t c_water_source;
- content_t c_lava_source;
- content_t c_ice;
+ Noise *noise_cave1;
+ Noise *noise_cave2;
+};
- int water_level;
- int ystride;
+/*
+ CavesRandomWalk is an implementation of a cave-digging algorithm that
+ operates on the principle of a "random walk" to approximate the stochiastic
+ activity of cavern development.
- CaveV5() {}
- CaveV5(Mapgen *mg, PseudoRandom *ps);
- void makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height);
- void makeTunnel(bool dirswitch);
- void carveRoute(v3f vec, float f, bool randomize_xz);
-};
+ In summary, this algorithm works by carving a randomly sized tunnel in a
+ random direction a random amount of times, randomly varying in width.
+ All randomness here is uniformly distributed; alternative distributions have
+ not yet been implemented.
-class CaveV6 {
+ This algorithm is very fast, executing in less than 1ms on average for an
+ 80x80x80 chunk of map on a modern processor.
+*/
+class CavesRandomWalk {
public:
- MapgenV6 *mg;
MMVManip *vm;
INodeDefManager *ndef;
+ GenerateNotifier *gennotify;
+ s16 *heightmap;
+
+ // configurable parameters
+ s32 seed;
+ int water_level;
+ int lava_depth;
+ NoiseParams *np_caveliquids;
+
+ // intermediate state variables
+ u16 ystride;
s16 min_tunnel_diameter;
s16 max_tunnel_diameter;
u16 tunnel_routepoints;
- int dswitchint;
int part_max_length_rs;
bool large_cave;
@@ -104,38 +114,70 @@ public:
s16 route_y_max;
PseudoRandom *ps;
- PseudoRandom *ps2;
content_t c_water_source;
content_t c_lava_source;
- int water_level;
-
- CaveV6() {}
- CaveV6(MapgenV6 *mg, PseudoRandom *ps, PseudoRandom *ps2, bool large_cave);
- void makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height);
+ // ndef is a mandatory parameter.
+ // If gennotify is NULL, generation events are not logged.
+ CavesRandomWalk(INodeDefManager *ndef,
+ GenerateNotifier *gennotify = NULL,
+ s32 seed = 0,
+ int water_level = 1,
+ content_t water_source = CONTENT_IGNORE,
+ content_t lava_source = CONTENT_IGNORE);
+
+ // vm and ps are mandatory parameters.
+ // If heightmap is NULL, the surface level at all points is assumed to
+ // be water_level.
+ void makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax, PseudoRandom *ps,
+ bool is_large_cave, int max_stone_height, s16 *heightmap);
+
+private:
void makeTunnel(bool dirswitch);
- void carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_ground);
+ void carveRoute(v3f vec, float f, bool randomize_xz);
+
+ inline bool isPosAboveSurface(v3s16 p);
};
-class CaveV7 {
+/*
+ CavesV6 is the original version of caves used with Mapgen V6.
+
+ Though it uses the same fundamental algorithm as CavesRandomWalk, it is made
+ separate to preserve the exact sequence of PseudoRandom calls - any change
+ to this ordering results in the output being radically different.
+ Because caves in Mapgen V6 are responsible for a large portion of the basic
+ terrain shape, modifying this will break our contract of reverse
+ compatibility for a 'stable' mapgen such as V6.
+
+ tl;dr,
+ *** DO NOT TOUCH THIS CLASS UNLESS YOU KNOW WHAT YOU ARE DOING ***
+*/
+class CavesV6 {
public:
- MapgenV7 *mg;
MMVManip *vm;
INodeDefManager *ndef;
+ GenerateNotifier *gennotify;
+ PseudoRandom *ps;
+ PseudoRandom *ps2;
- NoiseParams *np_caveliquids;
+ // configurable parameters
+ s16 *heightmap;
+ content_t c_water_source;
+ content_t c_lava_source;
+ int water_level;
+
+ // intermediate state variables
+ u16 ystride;
s16 min_tunnel_diameter;
s16 max_tunnel_diameter;
u16 tunnel_routepoints;
- int dswitchint;
int part_max_length_rs;
+ bool large_cave;
bool large_cave_is_flat;
- bool flooded;
- s16 max_stone_y;
v3s16 node_min;
v3s16 node_max;
@@ -148,19 +190,26 @@ public:
s16 route_y_min;
s16 route_y_max;
- PseudoRandom *ps;
-
- content_t c_water_source;
- content_t c_lava_source;
- content_t c_ice;
-
- int water_level;
-
- CaveV7() {}
- CaveV7(MapgenV7 *mg, PseudoRandom *ps);
- void makeCave(v3s16 nmin, v3s16 nmax, int max_stone_height);
+ // ndef is a mandatory parameter.
+ // If gennotify is NULL, generation events are not logged.
+ CavesV6(INodeDefManager *ndef,
+ GenerateNotifier *gennotify = NULL,
+ int water_level = 1,
+ content_t water_source = CONTENT_IGNORE,
+ content_t lava_source = CONTENT_IGNORE);
+
+ // vm, ps, and ps2 are mandatory parameters.
+ // If heightmap is NULL, the surface level at all points is assumed to
+ // be water_level.
+ void makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax,
+ PseudoRandom *ps, PseudoRandom *ps2,
+ bool is_large_cave, int max_stone_height, s16 *heightmap = NULL);
+
+private:
void makeTunnel(bool dirswitch);
- void carveRoute(v3f vec, float f, bool randomize_xz);
+ void carveRoute(v3f vec, float f, bool randomize_xz, bool tunnel_above_ground);
+
+ inline s16 getSurfaceFromHeightmap(v3s16 p);
};
#endif
diff --git a/src/cguittfont/CGUITTFont.cpp b/src/cguittfont/CGUITTFont.cpp
index 2342eb748..c2d37c6c0 100644
--- a/src/cguittfont/CGUITTFont.cpp
+++ b/src/cguittfont/CGUITTFont.cpp
@@ -1,6 +1,7 @@
/*
CGUITTFont FreeType class for Irrlicht
Copyright (c) 2009-2010 John Norman
+ Copyright (c) 2016 Nathanaël Courant
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
@@ -545,6 +546,13 @@ void CGUITTFont::setFontHinting(const bool enable, const bool enable_auto_hintin
void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip)
{
+ draw(EnrichedString(std::wstring(text.c_str()), color), position, color, hcenter, vcenter, clip);
+}
+
+void CGUITTFont::draw(const EnrichedString &text, const core::rect<s32>& position, video::SColor color, bool hcenter, bool vcenter, const core::rect<s32>* clip)
+{
+ std::vector<video::SColor> colors = text.getColors();
+
if (!Driver)
return;
@@ -572,7 +580,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
}
// Convert to a unicode string.
- core::ustring utext(text);
+ core::ustring utext = text.getString();
// Set up our render map.
core::map<u32, CGUITTGlyphPage*> Render_Map;
@@ -581,6 +589,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
u32 n;
uchar32_t previousChar = 0;
core::ustring::const_iterator iter(utext);
+ std::vector<video::SColor> applied_colors;
while (!iter.atEnd())
{
uchar32_t currentChar = *iter;
@@ -590,7 +599,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
if (currentChar == L'\r') // Mac or Windows breaks
{
lineBreak = true;
- if (*(iter + 1) == (uchar32_t)'\n') // Windows line breaks.
+ if (*(iter + 1) == (uchar32_t)'\n') // Windows line breaks.
currentChar = *(++iter);
}
else if (currentChar == (uchar32_t)'\n') // Unix breaks
@@ -627,6 +636,9 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
page->render_positions.push_back(core::position2di(offset.X + offx, offset.Y + offy));
page->render_source_rects.push_back(glyph.source_rect);
Render_Map.set(glyph.glyph_page, page);
+ u32 current_color = iter.getPos();
+ if (current_color < colors.size())
+ applied_colors.push_back(colors[current_color]);
}
offset.X += getWidthFromCharacter(currentChar);
@@ -645,8 +657,6 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
CGUITTGlyphPage* page = n->getValue();
- if (!use_transparency) color.color |= 0xff000000;
-
if (shadow_offset) {
for (size_t i = 0; i < page->render_positions.size(); ++i)
page->render_positions[i] += core::vector2di(shadow_offset, shadow_offset);
@@ -654,7 +664,17 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
for (size_t i = 0; i < page->render_positions.size(); ++i)
page->render_positions[i] -= core::vector2di(shadow_offset, shadow_offset);
}
- Driver->draw2DImageBatch(page->texture, page->render_positions, page->render_source_rects, clip, color, true);
+ for (size_t i = 0; i < page->render_positions.size(); ++i) {
+ irr::video::SColor col;
+ if (!applied_colors.empty()) {
+ col = applied_colors[i < applied_colors.size() ? i : 0];
+ } else {
+ col = irr::video::SColor(255, 255, 255, 255);
+ }
+ if (!use_transparency)
+ col.color |= 0xff000000;
+ Driver->draw2DImage(page->texture, page->render_positions[i], page->render_source_rects[i], clip, col, true);
+ }
}
}
diff --git a/src/cguittfont/CGUITTFont.h b/src/cguittfont/CGUITTFont.h
index e24d8f18b..0aa540c5c 100644
--- a/src/cguittfont/CGUITTFont.h
+++ b/src/cguittfont/CGUITTFont.h
@@ -1,6 +1,7 @@
/*
CGUITTFont FreeType class for Irrlicht
Copyright (c) 2009-2010 John Norman
+ Copyright (c) 2016 Nathanaël Courant
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
@@ -33,6 +34,8 @@
#include <irrlicht.h>
#include <ft2build.h>
+#include <vector>
+#include "util/enriched_string.h"
#include FT_FREETYPE_H
namespace irr
@@ -258,6 +261,10 @@ namespace gui
virtual void draw(const core::stringw& text, const core::rect<s32>& position,
video::SColor color, bool hcenter=false, bool vcenter=false,
const core::rect<s32>* clip=0);
+
+ virtual void draw(const EnrichedString& text, const core::rect<s32>& position,
+ video::SColor color, bool hcenter=false, bool vcenter=false,
+ const core::rect<s32>* clip=0);
//! Returns the dimension of a character produced by this font.
virtual core::dimension2d<u32> getCharDimension(const wchar_t ch) const;
diff --git a/src/chat.cpp b/src/chat.cpp
index cebe31225..46555b3dc 100644
--- a/src/chat.cpp
+++ b/src/chat.cpp
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "chat.h"
#include "debug.h"
+#include "config.h"
#include "util/strfnd.h"
#include <cctype>
#include <sstream>
@@ -251,8 +252,7 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
u32 hanging_indentation = 0;
// Format the sender name and produce fragments
- if (!line.name.empty())
- {
+ if (!line.name.empty()) {
temp_frag.text = L"<";
temp_frag.column = 0;
//temp_frag.bold = 0;
@@ -267,22 +267,20 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
next_frags.push_back(temp_frag);
}
+ std::wstring name_sanitized = line.name.c_str();
+
// Choose an indentation level
- if (line.name.empty())
- {
+ if (line.name.empty()) {
// Server messages
hanging_indentation = 0;
- }
- else if (line.name.size() + 3 <= cols/2)
- {
+ } else if (name_sanitized.size() + 3 <= cols/2) {
// Names shorter than about half the console width
hanging_indentation = line.name.size() + 3;
- }
- else
- {
+ } else {
// Very long names
hanging_indentation = 2;
}
+ //EnrichedString line_text(line.text);
next_line.first = true;
bool text_processing = false;
@@ -338,7 +336,7 @@ u32 ChatBuffer::formatChatLine(const ChatLine& line, u32 cols,
while (frag_length < remaining_in_input &&
frag_length < remaining_in_output)
{
- if (isspace(line.text[in_pos + frag_length]))
+ if (isspace(line.text.getString()[in_pos + frag_length]))
space_pos = frag_length;
++frag_length;
}
@@ -686,9 +684,6 @@ ChatBackend::~ChatBackend()
void ChatBackend::addMessage(std::wstring name, std::wstring text)
{
- name = unescape_enriched(name);
- text = unescape_enriched(text);
-
// Note: A message may consist of multiple lines, for example the MOTD.
WStrfnd fnd(text);
while (!fnd.at_end())
@@ -732,19 +727,22 @@ ChatBuffer& ChatBackend::getRecentBuffer()
return m_recent_buffer;
}
-std::wstring ChatBackend::getRecentChat()
+EnrichedString ChatBackend::getRecentChat()
{
- std::wostringstream stream;
+ EnrichedString result;
for (u32 i = 0; i < m_recent_buffer.getLineCount(); ++i)
{
const ChatLine& line = m_recent_buffer.getLine(i);
if (i != 0)
- stream << L"\n";
- if (!line.name.empty())
- stream << L"<" << line.name << L"> ";
- stream << line.text;
+ result += L"\n";
+ if (!line.name.empty()) {
+ result += L"<";
+ result += line.name;
+ result += L"> ";
+ }
+ result += line.text;
}
- return stream.str();
+ return result;
}
ChatPrompt& ChatBackend::getPrompt()
diff --git a/src/chat.h b/src/chat.h
index db4146d35..11061fd39 100644
--- a/src/chat.h
+++ b/src/chat.h
@@ -20,11 +20,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef CHAT_HEADER
#define CHAT_HEADER
-#include "irrlichttypes.h"
#include <string>
#include <vector>
#include <list>
+#include "irrlichttypes.h"
+#include "util/enriched_string.h"
+
// Chat console related classes
struct ChatLine
@@ -32,9 +34,9 @@ struct ChatLine
// age in seconds
f32 age;
// name of sending player, or empty if sent by server
- std::wstring name;
+ EnrichedString name;
// message text
- std::wstring text;
+ EnrichedString text;
ChatLine(std::wstring a_name, std::wstring a_text):
age(0.0),
@@ -42,12 +44,19 @@ struct ChatLine
text(a_text)
{
}
+
+ ChatLine(EnrichedString a_name, EnrichedString a_text):
+ age(0.0),
+ name(a_name),
+ text(a_text)
+ {
+ }
};
struct ChatFormattedFragment
{
// text string
- std::wstring text;
+ EnrichedString text;
// starting column
u32 column;
// formatting
@@ -260,7 +269,7 @@ public:
// Get the recent messages buffer
ChatBuffer& getRecentBuffer();
// Concatenate all recent messages
- std::wstring getRecentChat();
+ EnrichedString getRecentChat();
// Get the console prompt
ChatPrompt& getPrompt();
diff --git a/src/client.cpp b/src/client.cpp
index 4ffcec6ba..5476aad0e 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <iostream>
#include <algorithm>
#include <sstream>
+#include <cmath>
#include <IFileSystem.h>
#include "threading/mutex_auto_lock.h"
#include "util/auth.h"
@@ -257,7 +258,7 @@ Client::Client(
m_localdb(NULL)
{
// Add local player
- m_env.addPlayer(new LocalPlayer(this, playername));
+ m_env.setLocalPlayer(new LocalPlayer(this, playername));
m_mapper = new Mapper(device, this);
m_cache_save_interval = g_settings->getU16("server_map_save_interval");
@@ -303,7 +304,7 @@ Client::~Client()
delete m_inventory_from_server;
// Delete detached inventories
- for (std::map<std::string, Inventory*>::iterator
+ for (UNORDERED_MAP<std::string, Inventory*>::iterator
i = m_detached_inventories.begin();
i != m_detached_inventories.end(); ++i) {
delete i->second;
@@ -383,7 +384,7 @@ void Client::step(float dtime)
if(counter <= 0.0) {
counter = 2.0;
- Player *myplayer = m_env.getLocalPlayer();
+ LocalPlayer *myplayer = m_env.getLocalPlayer();
FATAL_ERROR_IF(myplayer == NULL, "Local player not found in environment.");
u16 proto_version_min = g_settings->getFlag("send_pre_v25_init") ?
@@ -613,7 +614,7 @@ void Client::step(float dtime)
{
// Do this every <interval> seconds after TOCLIENT_INVENTORY
// Reset the locally changed inventory to the authoritative inventory
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
player->inventory = *m_inventory_from_server;
m_inventory_updated = true;
}
@@ -623,10 +624,8 @@ void Client::step(float dtime)
Update positions of sounds attached to objects
*/
{
- for(std::map<int, u16>::iterator
- i = m_sounds_to_objects.begin();
- i != m_sounds_to_objects.end(); ++i)
- {
+ for(UNORDERED_MAP<int, u16>::iterator i = m_sounds_to_objects.begin();
+ i != m_sounds_to_objects.end(); ++i) {
int client_id = i->first;
u16 object_id = i->second;
ClientActiveObject *cao = m_env.getActiveObject(object_id);
@@ -645,8 +644,7 @@ void Client::step(float dtime)
m_removed_sounds_check_timer = 0;
// Find removed sounds and clear references to them
std::vector<s32> removed_server_ids;
- for(std::map<s32, int>::iterator
- i = m_sounds_server_to_client.begin();
+ for(UNORDERED_MAP<s32, int>::iterator i = m_sounds_server_to_client.begin();
i != m_sounds_server_to_client.end();) {
s32 server_id = i->first;
int client_id = i->second;
@@ -820,7 +818,7 @@ void Client::initLocalMapSaving(const Address &address,
const std::string world_path = porting::path_user
+ DIR_DELIM + "worlds"
+ DIR_DELIM + "server_"
- + hostname + "_" + to_string(address.getPort());
+ + hostname + "_" + std::to_string(address.getPort());
fs::CreateAllDirs(world_path);
@@ -932,6 +930,36 @@ void Client::Send(NetworkPacket* pkt)
serverCommandFactoryTable[pkt->getCommand()].reliable);
}
+// Will fill up 12 + 12 + 4 + 4 + 4 bytes
+void writePlayerPos(LocalPlayer *myplayer, ClientMap *clientMap, NetworkPacket *pkt)
+{
+ v3f pf = myplayer->getPosition() * 100;
+ v3f sf = myplayer->getSpeed() * 100;
+ s32 pitch = myplayer->getPitch() * 100;
+ s32 yaw = myplayer->getYaw() * 100;
+ u32 keyPressed = myplayer->keyPressed;
+ // scaled by 80, so that pi can fit into a u8
+ u8 fov = clientMap->getCameraFov() * 80;
+ u8 wanted_range = MYMIN(255,
+ std::ceil(clientMap->getControl().wanted_range / MAP_BLOCKSIZE));
+
+ v3s32 position(pf.X, pf.Y, pf.Z);
+ v3s32 speed(sf.X, sf.Y, sf.Z);
+
+ /*
+ Format:
+ [0] v3s32 position*100
+ [12] v3s32 speed*100
+ [12+12] s32 pitch*100
+ [12+12+4] s32 yaw*100
+ [12+12+4+4] u32 keyPressed
+ [12+12+4+4+4] u8 fov*80
+ [12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE)
+ */
+ *pkt << position << speed << pitch << yaw << keyPressed;
+ *pkt << fov << wanted_range;
+}
+
void Client::interact(u8 action, const PointedThing& pointed)
{
if(m_state != LC_Ready) {
@@ -941,12 +969,17 @@ void Client::interact(u8 action, const PointedThing& pointed)
return;
}
+ LocalPlayer *myplayer = m_env.getLocalPlayer();
+ if (myplayer == NULL)
+ return;
+
/*
[0] u16 command
[2] u8 action
[3] u16 item
- [5] u32 length of the next item
+ [5] u32 length of the next item (plen)
[9] serialized PointedThing
+ [9 + plen] player position information
actions:
0: start digging (from undersurface) or use
1: stop digging (all parameters ignored)
@@ -966,6 +999,8 @@ void Client::interact(u8 action, const PointedThing& pointed)
pkt.putLongString(tmp_os.str());
+ writePlayerPos(myplayer, &m_env.getClientMap(), &pkt);
+
Send(&pkt);
}
@@ -1194,7 +1229,7 @@ void Client::sendChatMessage(const std::wstring &message)
void Client::sendChangePassword(const std::string &oldpassword,
const std::string &newpassword)
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
if (player == NULL)
return;
@@ -1268,19 +1303,30 @@ void Client::sendPlayerPos()
if(myplayer == NULL)
return;
+ ClientMap &map = m_env.getClientMap();
+
+ u8 camera_fov = map.getCameraFov();
+ u8 wanted_range = map.getControl().wanted_range;
+
// Save bandwidth by only updating position when something changed
if(myplayer->last_position == myplayer->getPosition() &&
- myplayer->last_speed == myplayer->getSpeed() &&
- myplayer->last_pitch == myplayer->getPitch() &&
- myplayer->last_yaw == myplayer->getYaw() &&
- myplayer->last_keyPressed == myplayer->keyPressed)
+ myplayer->last_speed == myplayer->getSpeed() &&
+ myplayer->last_pitch == myplayer->getPitch() &&
+ myplayer->last_yaw == myplayer->getYaw() &&
+ myplayer->last_keyPressed == myplayer->keyPressed &&
+ myplayer->last_camera_fov == camera_fov &&
+ myplayer->last_wanted_range == wanted_range)
return;
- myplayer->last_position = myplayer->getPosition();
- myplayer->last_speed = myplayer->getSpeed();
- myplayer->last_pitch = myplayer->getPitch();
- myplayer->last_yaw = myplayer->getYaw();
- myplayer->last_keyPressed = myplayer->keyPressed;
+ myplayer->last_position = myplayer->getPosition();
+ myplayer->last_speed = myplayer->getSpeed();
+ myplayer->last_pitch = myplayer->getPitch();
+ myplayer->last_yaw = myplayer->getYaw();
+ myplayer->last_keyPressed = myplayer->keyPressed;
+ myplayer->last_camera_fov = camera_fov;
+ myplayer->last_wanted_range = wanted_range;
+
+ //infostream << "Sending Player Position information" << std::endl;
u16 our_peer_id;
{
@@ -1294,33 +1340,16 @@ void Client::sendPlayerPos()
assert(myplayer->peer_id == our_peer_id);
- v3f pf = myplayer->getPosition();
- v3f sf = myplayer->getSpeed();
- s32 pitch = myplayer->getPitch() * 100;
- s32 yaw = myplayer->getYaw() * 100;
- u32 keyPressed = myplayer->keyPressed;
+ NetworkPacket pkt(TOSERVER_PLAYERPOS, 12 + 12 + 4 + 4 + 4 + 1 + 1);
- v3s32 position(pf.X*100, pf.Y*100, pf.Z*100);
- v3s32 speed(sf.X*100, sf.Y*100, sf.Z*100);
- /*
- Format:
- [0] v3s32 position*100
- [12] v3s32 speed*100
- [12+12] s32 pitch*100
- [12+12+4] s32 yaw*100
- [12+12+4+4] u32 keyPressed
- */
-
- NetworkPacket pkt(TOSERVER_PLAYERPOS, 12 + 12 + 4 + 4 + 4);
-
- pkt << position << speed << pitch << yaw << keyPressed;
+ writePlayerPos(myplayer, &map, &pkt);
Send(&pkt);
}
void Client::sendPlayerItem(u16 item)
{
- Player *myplayer = m_env.getLocalPlayer();
+ LocalPlayer *myplayer = m_env.getLocalPlayer();
if(myplayer == NULL)
return;
@@ -1401,7 +1430,7 @@ bool Client::getLocalInventoryUpdated()
// Copies the inventory of the local player to parameter
void Client::getLocalInventory(Inventory &dst)
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
dst = player->inventory;
}
@@ -1414,15 +1443,16 @@ Inventory* Client::getInventory(const InventoryLocation &loc)
break;
case InventoryLocation::CURRENT_PLAYER:
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
return &player->inventory;
}
break;
case InventoryLocation::PLAYER:
{
- Player *player = m_env.getPlayer(loc.name.c_str());
- if(!player)
+ // Check if we are working with local player inventory
+ LocalPlayer *player = m_env.getLocalPlayer();
+ if (!player || strcmp(player->getName(), loc.name.c_str()) != 0)
return NULL;
return &player->inventory;
}
@@ -1437,7 +1467,7 @@ Inventory* Client::getInventory(const InventoryLocation &loc)
break;
case InventoryLocation::DETACHED:
{
- if(m_detached_inventories.count(loc.name) == 0)
+ if (m_detached_inventories.count(loc.name) == 0)
return NULL;
return m_detached_inventories[loc.name];
}
@@ -1503,11 +1533,6 @@ ClientActiveObject * Client::getSelectedActiveObject(
return NULL;
}
-std::list<std::string> Client::getConnectedPlayerNames()
-{
- return m_env.getPlayerNames();
-}
-
float Client::getAnimationTime()
{
return m_animation_time;
@@ -1540,18 +1565,11 @@ void Client::setCrack(int level, v3s16 pos)
u16 Client::getHP()
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
return player->hp;
}
-u16 Client::getBreath()
-{
- Player *player = m_env.getLocalPlayer();
- assert(player != NULL);
- return player->getBreath();
-}
-
bool Client::getChatMessage(std::wstring &message)
{
if(m_chat_queue.size() == 0)
@@ -1674,7 +1692,7 @@ void Client::addUpdateMeshTaskForNode(v3s16 nodepos, bool ack_to_server, bool ur
ClientEvent Client::getClientEvent()
{
ClientEvent event;
- if(m_client_event_queue.size() == 0) {
+ if (m_client_event_queue.empty()) {
event.type = CE_NONE;
}
else {
diff --git a/src/client.h b/src/client.h
index cdadb9d3e..9f5bda059 100644
--- a/src/client.h
+++ b/src/client.h
@@ -182,6 +182,7 @@ struct ClientEvent
f32 expirationtime;
f32 size;
bool collisiondetection;
+ bool collision_removal;
bool vertical;
std::string *texture;
} spawn_particle;
@@ -199,6 +200,8 @@ struct ClientEvent
f32 minsize;
f32 maxsize;
bool collisiondetection;
+ bool collision_removal;
+ u16 attached_id;
bool vertical;
std::string *texture;
u32 id;
@@ -450,7 +453,10 @@ public:
core::line3d<f32> shootline_on_map
);
- std::list<std::string> getConnectedPlayerNames();
+ const std::list<std::string> &getConnectedPlayerNames()
+ {
+ return m_env.getPlayerNames();
+ }
float getAnimationTime();
@@ -458,9 +464,8 @@ public:
void setCrack(int level, v3s16 pos);
u16 getHP();
- u16 getBreath();
- bool checkPrivilege(const std::string &priv)
+ bool checkPrivilege(const std::string &priv) const
{ return (m_privileges.count(priv) != 0); }
bool getChatMessage(std::wstring &message);
@@ -497,6 +502,9 @@ public:
u8 getProtoVersion()
{ return m_proto_ver; }
+ bool connectedToServer()
+ { return m_con.Connected(); }
+
float mediaReceiveProgress();
void afterContentReceived(IrrlichtDevice *device);
@@ -658,18 +666,18 @@ private:
// Sounds
float m_removed_sounds_check_timer;
// Mapping from server sound ids to our sound ids
- std::map<s32, int> m_sounds_server_to_client;
+ UNORDERED_MAP<s32, int> m_sounds_server_to_client;
// And the other way!
- std::map<int, s32> m_sounds_client_to_server;
+ UNORDERED_MAP<int, s32> m_sounds_client_to_server;
// And relations to objects
- std::map<int, u16> m_sounds_to_objects;
+ UNORDERED_MAP<int, u16> m_sounds_to_objects;
// Privileges
- std::set<std::string> m_privileges;
+ UNORDERED_SET<std::string> m_privileges;
// Detached inventories
// key = name
- std::map<std::string, Inventory*> m_detached_inventories;
+ UNORDERED_MAP<std::string, Inventory*> m_detached_inventories;
// Storage for mesh data for creating multiple instances of the same mesh
StringMap m_mesh_data;
diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt
index a1ec37fe3..5faa186a7 100644
--- a/src/client/CMakeLists.txt
+++ b/src/client/CMakeLists.txt
@@ -1,6 +1,7 @@
set(client_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/clientlauncher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tile.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/joystick_controller.cpp
PARENT_SCOPE
)
diff --git a/src/client/clientlauncher.cpp b/src/client/clientlauncher.cpp
index 404a16310..6145e3dde 100644
--- a/src/client/clientlauncher.cpp
+++ b/src/client/clientlauncher.cpp
@@ -32,7 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "guiEngine.h"
#include "player.h"
#include "fontengine.h"
+#include "joystick_controller.h"
#include "clientlauncher.h"
+#include "version.h"
/* mainmenumanager.h
*/
@@ -112,6 +114,8 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
porting::setXorgClassHint(video_driver->getExposedVideoData(), PROJECT_NAME_C);
+ porting::setXorgWindowIcon(device);
+
/*
This changes the minimum allowed number of vertices in a VBO.
Default is 500.
@@ -184,7 +188,9 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
{
// Set the window caption
const wchar_t *text = wgettext("Main Menu");
- device->setWindowCaption((utf8_to_wide(PROJECT_NAME_C) + L" [" + text + L"]").c_str());
+ device->setWindowCaption((utf8_to_wide(PROJECT_NAME_C) +
+ L" " + utf8_to_wide(g_version_hash) +
+ L" [" + text + L"]").c_str());
delete[] text;
try { // This is used for catching disconnects
@@ -499,7 +505,8 @@ void ClientLauncher::main_menu(MainMenuData *menudata)
#endif
/* show main menu */
- GUIEngine mymenu(device, guiroot, &g_menumgr, smgr, menudata, *kill);
+ GUIEngine mymenu(device, &input->joystick, guiroot,
+ &g_menumgr, smgr, menudata, *kill);
smgr->clear(); /* leave scene manager in a clean state */
}
@@ -558,6 +565,22 @@ bool ClientLauncher::create_engine_device()
device = createDeviceEx(params);
if (device) {
+ if (g_settings->getBool("enable_joysticks")) {
+ irr::core::array<irr::SJoystickInfo> infos;
+ std::vector<irr::SJoystickInfo> joystick_infos;
+ // Make sure this is called maximum once per
+ // irrlicht device, otherwise it will give you
+ // multiple events for the same joystick.
+ if (device->activateJoysticks(infos)) {
+ infostream << "Joystick support enabled" << std::endl;
+ joystick_infos.reserve(infos.size());
+ for (u32 i = 0; i < infos.size(); i++) {
+ joystick_infos.push_back(infos[i]);
+ }
+ } else {
+ errorstream << "Could not activate joystick support." << std::endl;
+ }
+ }
porting::initIrrlicht(device);
}
diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h
index 69e4b25fa..824b0da2e 100644
--- a/src/client/inputhandler.h
+++ b/src/client/inputhandler.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define INPUT_HANDLER_H
#include "irrlichttypes_extrabloated.h"
+#include "joystick_controller.h"
class MyEventReceiver : public IEventReceiver
{
@@ -42,11 +43,15 @@ public:
// Remember whether each key is down or up
if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
- if (event.KeyInput.PressedDown) {
- keyIsDown.set(event.KeyInput);
- keyWasDown.set(event.KeyInput);
- } else {
- keyIsDown.unset(event.KeyInput);
+ const KeyPress &keyCode = event.KeyInput;
+ if (keysListenedFor[keyCode]) {
+ if (event.KeyInput.PressedDown) {
+ keyIsDown.set(keyCode);
+ keyWasDown.set(keyCode);
+ } else {
+ keyIsDown.unset(keyCode);
+ }
+ return true;
}
}
@@ -58,6 +63,14 @@ public:
return true;
}
#endif
+
+ if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) {
+ /* TODO add a check like:
+ if (event.JoystickEvent != joystick_we_listen_for)
+ return false;
+ */
+ return joystick->handleEvent(event.JoystickEvent);
+ }
// handle mouse events
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
if (noMenuActive() == false) {
@@ -116,6 +129,15 @@ public:
return b;
}
+ void listenForKey(const KeyPress &keyCode)
+ {
+ keysListenedFor.set(keyCode);
+ }
+ void dontListenForKeys()
+ {
+ keysListenedFor.clear();
+ }
+
s32 getMouseWheel()
{
s32 a = mouse_wheel;
@@ -159,6 +181,8 @@ public:
s32 mouse_wheel;
+ JoystickController *joystick;
+
#ifdef HAVE_TOUCHSCREENGUI
TouchScreenGUI* m_touchscreengui;
#endif
@@ -168,6 +192,12 @@ private:
KeyList keyIsDown;
// Whether a key has been pressed or not
KeyList keyWasDown;
+ // List of keys we listen for
+ // TODO perhaps the type of this is not really
+ // performant as KeyList is designed for few but
+ // often changing keys, and keysListenedFor is expected
+ // to change seldomly but contain lots of keys.
+ KeyList keysListenedFor;
};
@@ -183,6 +213,7 @@ public:
m_receiver(receiver),
m_mousepos(0,0)
{
+ m_receiver->joystick = &joystick;
}
virtual bool isKeyDown(const KeyPress &keyCode)
{
@@ -192,6 +223,14 @@ public:
{
return m_receiver->WasKeyDown(keyCode);
}
+ virtual void listenForKey(const KeyPress &keyCode)
+ {
+ m_receiver->listenForKey(keyCode);
+ }
+ virtual void dontListenForKeys()
+ {
+ m_receiver->dontListenForKeys();
+ }
virtual v2s32 getMousePos()
{
if (m_device->getCursorControl()) {
@@ -261,6 +300,7 @@ public:
void clear()
{
+ joystick.clear();
m_receiver->clearInput();
}
private:
diff --git a/src/client/joystick_controller.cpp b/src/client/joystick_controller.cpp
new file mode 100644
index 000000000..ef8d18ab0
--- /dev/null
+++ b/src/client/joystick_controller.cpp
@@ -0,0 +1,179 @@
+/*
+Minetest
+Copyright (C) 2016 est31, <MTest31@outlook.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "joystick_controller.h"
+#include "irrlichttypes_extrabloated.h"
+#include "keys.h"
+#include "settings.h"
+#include "gettime.h"
+
+bool JoystickButtonCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const
+{
+ u32 buttons = ev.ButtonStates;
+
+ buttons &= filter_mask;
+ return buttons == compare_mask;
+}
+
+bool JoystickAxisCmb::isTriggered(const irr::SEvent::SJoystickEvent &ev) const
+{
+ s16 ax_val = ev.Axis[axis_to_compare];
+
+ return (ax_val * direction < 0) && (thresh * direction > ax_val * direction);
+}
+
+// spares many characters
+#define JLO_B_PB(A, B, C) jlo.button_keys.push_back(JoystickButtonCmb(A, B, C))
+#define JLO_A_PB(A, B, C, D) jlo.axis_keys.push_back(JoystickAxisCmb(A, B, C, D))
+
+static JoystickLayout create_default_layout()
+{
+ JoystickLayout jlo;
+
+ jlo.axes_dead_border = 1024;
+
+ const JoystickAxisLayout axes[JA_COUNT] = {
+ {0, 1}, // JA_SIDEWARD_MOVE
+ {1, 1}, // JA_FORWARD_MOVE
+ {3, 1}, // JA_FRUSTUM_HORIZONTAL
+ {4, 1}, // JA_FRUSTUM_VERTICAL
+ };
+ memcpy(jlo.axes, axes, sizeof(jlo.axes));
+
+ u32 sb = 1 << 7; // START button mask
+ u32 fb = 1 << 3; // FOUR button mask
+ u32 bm = sb | fb; // Mask for Both Modifiers
+
+ // The back button means "ESC".
+ JLO_B_PB(KeyType::ESC, 1 << 6, 1 << 6);
+
+ // The start button counts as modifier as well as use key.
+ // JLO_B_PB(KeyType::USE, sb, sb));
+
+ // Accessible without start modifier button pressed
+ // regardless whether four is pressed or not
+ JLO_B_PB(KeyType::SNEAK, sb | 1 << 2, 1 << 2);
+
+ // Accessible without four modifier button pressed
+ // regardless whether start is pressed or not
+ JLO_B_PB(KeyType::MOUSE_L, fb | 1 << 4, 1 << 4);
+ JLO_B_PB(KeyType::MOUSE_R, fb | 1 << 5, 1 << 5);
+
+ // Accessible without any modifier pressed
+ JLO_B_PB(KeyType::JUMP, bm | 1 << 0, 1 << 0);
+ JLO_B_PB(KeyType::SPECIAL1, bm | 1 << 1, 1 << 1);
+
+ // Accessible with start button not pressed, but four pressed
+ // TODO find usage for button 0
+ JLO_B_PB(KeyType::DROP, bm | 1 << 1, fb | 1 << 1);
+ JLO_B_PB(KeyType::SCROLL_UP, bm | 1 << 4, fb | 1 << 4);
+ JLO_B_PB(KeyType::SCROLL_DOWN,bm | 1 << 5, fb | 1 << 5);
+
+ // Accessible with start button and four pressed
+ // TODO find usage for buttons 0, 1 and 4, 5
+
+ // Now about the buttons simulated by the axes
+
+ // Movement buttons, important for vessels
+ JLO_A_PB(KeyType::FORWARD, 1, 1, 1024);
+ JLO_A_PB(KeyType::BACKWARD, 1, -1, 1024);
+ JLO_A_PB(KeyType::LEFT, 0, 1, 1024);
+ JLO_A_PB(KeyType::RIGHT, 0, -1, 1024);
+
+ // Scroll buttons
+ JLO_A_PB(KeyType::SCROLL_UP, 2, -1, 1024);
+ JLO_A_PB(KeyType::SCROLL_DOWN, 5, -1, 1024);
+
+ return jlo;
+}
+
+static const JoystickLayout default_layout = create_default_layout();
+
+JoystickController::JoystickController()
+{
+ m_layout = &default_layout;
+ doubling_dtime = g_settings->getFloat("repeat_joystick_button_time");
+
+ for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) {
+ m_past_pressed_time[i] = 0;
+ }
+ clear();
+}
+
+bool JoystickController::handleEvent(const irr::SEvent::SJoystickEvent &ev)
+{
+ m_internal_time = getTimeMs() / 1000.f;
+
+ std::bitset<KeyType::INTERNAL_ENUM_COUNT> keys_pressed;
+
+ // First generate a list of keys pressed
+
+ for (size_t i = 0; i < m_layout->button_keys.size(); i++) {
+ if (m_layout->button_keys[i].isTriggered(ev)) {
+ keys_pressed.set(m_layout->button_keys[i].key);
+ }
+ }
+
+ for (size_t i = 0; i < m_layout->axis_keys.size(); i++) {
+ if (m_layout->axis_keys[i].isTriggered(ev)) {
+ keys_pressed.set(m_layout->axis_keys[i].key);
+ }
+ }
+
+ // Then update the values
+
+ for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) {
+ if (keys_pressed[i]) {
+ if (!m_past_pressed_keys[i] &&
+ m_past_pressed_time[i] < m_internal_time - doubling_dtime) {
+ m_past_pressed_keys[i] = true;
+ m_past_pressed_time[i] = m_internal_time;
+ }
+ } else if (m_pressed_keys[i]) {
+ m_past_released_keys[i] = true;
+ }
+
+ m_pressed_keys[i] = keys_pressed[i];
+ }
+
+ for (size_t i = 0; i < JA_COUNT; i++) {
+ const JoystickAxisLayout &ax_la = m_layout->axes[i];
+ m_axes_vals[i] = ax_la.invert * ev.Axis[ax_la.axis_id];
+ }
+
+
+ return true;
+}
+
+void JoystickController::clear()
+{
+ m_pressed_keys.reset();
+ m_past_pressed_keys.reset();
+ m_past_released_keys.reset();
+ memset(m_axes_vals, 0, sizeof(m_axes_vals));
+}
+
+s16 JoystickController::getAxisWithoutDead(JoystickAxis axis)
+{
+ s16 v = m_axes_vals[axis];
+ if (((v > 0) && (v < m_layout->axes_dead_border)) ||
+ ((v < 0) && (v > -m_layout->axes_dead_border)))
+ return 0;
+ return v;
+}
diff --git a/src/client/joystick_controller.h b/src/client/joystick_controller.h
new file mode 100644
index 000000000..ed0ee4068
--- /dev/null
+++ b/src/client/joystick_controller.h
@@ -0,0 +1,163 @@
+/*
+Minetest
+Copyright (C) 2016 est31, <MTest31@outlook.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef JOYSTICK_HEADER
+#define JOYSTICK_HEADER
+
+#include "irrlichttypes_extrabloated.h"
+#include "keys.h"
+#include <bitset>
+#include <vector>
+
+enum JoystickAxis {
+ JA_SIDEWARD_MOVE,
+ JA_FORWARD_MOVE,
+
+ JA_FRUSTUM_HORIZONTAL,
+ JA_FRUSTUM_VERTICAL,
+
+ // To know the count of enum values
+ JA_COUNT,
+};
+
+struct JoystickAxisLayout {
+ u16 axis_id;
+ // -1 if to invert, 1 if to keep it.
+ int invert;
+};
+
+
+struct JoystickCombination {
+
+ virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const=0;
+
+ GameKeyType key;
+};
+
+struct JoystickButtonCmb : public JoystickCombination {
+
+ JoystickButtonCmb() {}
+ JoystickButtonCmb(GameKeyType key, u32 filter_mask, u32 compare_mask) :
+ filter_mask(filter_mask),
+ compare_mask(compare_mask)
+ {
+ this->key = key;
+ }
+
+ virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const;
+
+ u32 filter_mask;
+ u32 compare_mask;
+};
+
+struct JoystickAxisCmb : public JoystickCombination {
+
+ JoystickAxisCmb() {}
+ JoystickAxisCmb(GameKeyType key, u16 axis_to_compare, int direction, s16 thresh) :
+ axis_to_compare(axis_to_compare),
+ direction(direction),
+ thresh(thresh)
+ {
+ this->key = key;
+ }
+
+ virtual bool isTriggered(const irr::SEvent::SJoystickEvent &ev) const;
+
+ u16 axis_to_compare;
+
+ // if -1, thresh must be smaller than the axis value in order to trigger
+ // if 1, thresh must be bigger than the axis value in order to trigger
+ int direction;
+ s16 thresh;
+};
+
+struct JoystickLayout {
+ std::vector<JoystickButtonCmb> button_keys;
+ std::vector<JoystickAxisCmb> axis_keys;
+ JoystickAxisLayout axes[JA_COUNT];
+ s16 axes_dead_border;
+};
+
+class JoystickController {
+
+public:
+ JoystickController();
+ bool handleEvent(const irr::SEvent::SJoystickEvent &ev);
+ void clear();
+
+ bool wasKeyDown(GameKeyType b)
+ {
+ bool r = m_past_pressed_keys[b];
+ m_past_pressed_keys[b] = false;
+ return r;
+ }
+ bool getWasKeyDown(GameKeyType b)
+ {
+ return m_past_pressed_keys[b];
+ }
+ void clearWasKeyDown(GameKeyType b)
+ {
+ m_past_pressed_keys[b] = false;
+ }
+
+ bool wasKeyReleased(GameKeyType b)
+ {
+ bool r = m_past_released_keys[b];
+ m_past_released_keys[b] = false;
+ return r;
+ }
+ bool getWasKeyReleased(GameKeyType b)
+ {
+ return m_past_pressed_keys[b];
+ }
+ void clearWasKeyReleased(GameKeyType b)
+ {
+ m_past_pressed_keys[b] = false;
+ }
+
+ bool isKeyDown(GameKeyType b)
+ {
+ return m_pressed_keys[b];
+ }
+
+ s16 getAxis(JoystickAxis axis)
+ {
+ return m_axes_vals[axis];
+ }
+
+ s16 getAxisWithoutDead(JoystickAxis axis);
+
+ f32 doubling_dtime;
+
+private:
+ const JoystickLayout *m_layout;
+
+ s16 m_axes_vals[JA_COUNT];
+
+ std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_pressed_keys;
+
+ f32 m_internal_time;
+
+ f32 m_past_pressed_time[KeyType::INTERNAL_ENUM_COUNT];
+
+ std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_pressed_keys;
+ std::bitset<KeyType::INTERNAL_ENUM_COUNT> m_past_released_keys;
+};
+
+#endif
diff --git a/src/client/keys.h b/src/client/keys.h
new file mode 100644
index 000000000..6467c443e
--- /dev/null
+++ b/src/client/keys.h
@@ -0,0 +1,86 @@
+/*
+Minetest
+Copyright (C) 2016 est31, <MTest31@outlook.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef KEYS_HEADER
+#define KEYS_HEADER
+
+#include<list>
+
+class KeyType {
+public:
+ enum T {
+ // Player movement
+ FORWARD,
+ BACKWARD,
+ LEFT,
+ RIGHT,
+ JUMP,
+ SPECIAL1,
+ SNEAK,
+ AUTORUN,
+
+ ESC,
+
+ // Other
+ DROP,
+ INVENTORY,
+ CHAT,
+ CMD,
+ CONSOLE,
+ MINIMAP,
+ FREEMOVE,
+ FASTMOVE,
+ NOCLIP,
+ CINEMATIC,
+ SCREENSHOT,
+ TOGGLE_HUD,
+ TOGGLE_CHAT,
+ TOGGLE_FORCE_FOG_OFF,
+ TOGGLE_UPDATE_CAMERA,
+ TOGGLE_DEBUG,
+ TOGGLE_PROFILER,
+ CAMERA_MODE,
+ INCREASE_VIEWING_RANGE,
+ DECREASE_VIEWING_RANGE,
+ RANGESELECT,
+ ZOOM,
+
+ QUICKTUNE_NEXT,
+ QUICKTUNE_PREV,
+ QUICKTUNE_INC,
+ QUICKTUNE_DEC,
+
+ DEBUG_STACKS,
+
+ // joystick specific keys
+ MOUSE_L,
+ MOUSE_R,
+ SCROLL_UP,
+ SCROLL_DOWN,
+
+ // Fake keycode for array size and internal checks
+ INTERNAL_ENUM_COUNT
+
+ };
+};
+
+typedef KeyType::T GameKeyType;
+
+
+#endif
diff --git a/src/client/tile.cpp b/src/client/tile.cpp
index ec8c95f02..8f0c39465 100644
--- a/src/client/tile.cpp
+++ b/src/client/tile.cpp
@@ -948,11 +948,10 @@ video::ITexture* TextureSource::generateTextureFromMesh(
video::IImage* TextureSource::generateImage(const std::string &name)
{
- /*
- Get the base image
- */
+ // Get the base image
const char separator = '^';
+ const char escape = '\\';
const char paren_open = '(';
const char paren_close = ')';
@@ -960,7 +959,9 @@ video::IImage* TextureSource::generateImage(const std::string &name)
s32 last_separator_pos = -1;
u8 paren_bal = 0;
for (s32 i = name.size() - 1; i >= 0; i--) {
- switch(name[i]) {
+ if (i > 0 && name[i-1] == escape)
+ continue;
+ switch (name[i]) {
case separator:
if (paren_bal == 0) {
last_separator_pos = i;
@@ -1028,10 +1029,12 @@ video::IImage* TextureSource::generateImage(const std::string &name)
return NULL;
}
core::dimension2d<u32> dim = tmp->getDimension();
- if (!baseimg)
- baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
- blit_with_alpha(tmp, baseimg, v2s32(0, 0), v2s32(0, 0), dim);
- tmp->drop();
+ if (baseimg) {
+ blit_with_alpha(tmp, baseimg, v2s32(0, 0), v2s32(0, 0), dim);
+ tmp->drop();
+ } else {
+ baseimg = tmp;
+ }
} else if (!generateImagePart(last_part_of_name, baseimg)) {
// Generate image according to part of name
errorstream << "generateImage(): "
@@ -1099,9 +1102,27 @@ video::IImage * Align2Npot2(video::IImage * image,
#endif
+static std::string unescape_string(const std::string &str, const char esc = '\\')
+{
+ std::string out;
+ size_t pos = 0, cpos;
+ out.reserve(str.size());
+ while (1) {
+ cpos = str.find_first_of(esc, pos);
+ if (cpos == std::string::npos) {
+ out += str.substr(pos);
+ break;
+ }
+ out += str.substr(pos, cpos - pos) + str[cpos + 1];
+ pos = cpos + 2;
+ }
+ return out;
+}
+
bool TextureSource::generateImagePart(std::string part_of_name,
video::IImage *& baseimg)
{
+ const char escape = '\\'; // same as in generateImage()
video::IVideoDriver* driver = m_device->getVideoDriver();
sanity_check(driver);
@@ -1251,7 +1272,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
}
/*
[combine:WxH:X,Y=filename:X,Y=filename2
- Creates a bigger texture from an amount of smaller ones
+ Creates a bigger texture from any amount of smaller ones
*/
else if (str_starts_with(part_of_name, "[combine"))
{
@@ -1259,7 +1280,6 @@ bool TextureSource::generateImagePart(std::string part_of_name,
sf.next(":");
u32 w0 = stoi(sf.next("x"));
u32 h0 = stoi(sf.next(":"));
- //infostream<<"combined w="<<w0<<" h="<<h0<<std::endl;
core::dimension2d<u32> dim(w0,h0);
if (baseimg == NULL) {
baseimg = driver->createImage(video::ECF_A8R8G8B8, dim);
@@ -1268,11 +1288,11 @@ bool TextureSource::generateImagePart(std::string part_of_name,
while (sf.at_end() == false) {
u32 x = stoi(sf.next(","));
u32 y = stoi(sf.next("="));
- std::string filename = sf.next(":");
+ std::string filename = unescape_string(sf.next_esc(":", escape), escape);
infostream<<"Adding \""<<filename
<<"\" to combined ("<<x<<","<<y<<")"
<<std::endl;
- video::IImage *img = m_sourcecache.getOrLoad(filename, m_device);
+ video::IImage *img = generateImage(filename);
if (img) {
core::dimension2d<u32> dim = img->getDimension();
infostream<<"Size "<<dim.Width
@@ -1295,7 +1315,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
}
}
/*
- "[brighten"
+ [brighten
*/
else if (str_starts_with(part_of_name, "[brighten"))
{
@@ -1309,7 +1329,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
brighten(baseimg);
}
/*
- "[noalpha"
+ [noalpha
Make image completely opaque.
Used for the leaves texture when in old leaves mode, so
that the transparent parts don't look completely black
@@ -1336,7 +1356,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
}
}
/*
- "[makealpha:R,G,B"
+ [makealpha:R,G,B
Convert one color to transparent.
*/
else if (str_starts_with(part_of_name, "[makealpha:"))
@@ -1375,7 +1395,7 @@ bool TextureSource::generateImagePart(std::string part_of_name,
}
}
/*
- "[transformN"
+ [transformN
Rotates and/or flips the image.
N can be a number (between 0 and 7) or a transform name.
@@ -1543,12 +1563,11 @@ bool TextureSource::generateImagePart(std::string part_of_name,
Strfnd sf(part_of_name);
sf.next(":");
u32 percent = stoi(sf.next(":"));
- std::string filename = sf.next(":");
- //infostream<<"power part "<<percent<<"%% of "<<filename<<std::endl;
+ std::string filename = unescape_string(sf.next_esc(":", escape), escape);
if (baseimg == NULL)
baseimg = driver->createImage(video::ECF_A8R8G8B8, v2u32(16,16));
- video::IImage *img = m_sourcecache.getOrLoad(filename, m_device);
+ video::IImage *img = generateImage(filename);
if (img)
{
core::dimension2d<u32> dim = img->getDimension();
@@ -1628,9 +1647,9 @@ bool TextureSource::generateImagePart(std::string part_of_name,
}
Strfnd sf(part_of_name);
sf.next(":");
- std::string filename = sf.next(":");
+ std::string filename = unescape_string(sf.next_esc(":", escape), escape);
- video::IImage *img = m_sourcecache.getOrLoad(filename, m_device);
+ video::IImage *img = generateImage(filename);
if (img) {
apply_mask(img, baseimg, v2s32(0, 0), v2s32(0, 0),
img->getDimension());
@@ -1673,6 +1692,10 @@ bool TextureSource::generateImagePart(std::string part_of_name,
apply_colorize(baseimg, v2u32(0, 0), baseimg->getDimension(), color, ratio, keep_alpha);
}
+ /*
+ [applyfiltersformesh
+ Internal modifier
+ */
else if (str_starts_with(part_of_name, "[applyfiltersformesh"))
{
// Apply the "clean transparent" filter, if configured.
@@ -1735,6 +1758,75 @@ bool TextureSource::generateImagePart(std::string part_of_name,
baseimg->drop();
baseimg = image;
}
+ /*
+ [opacity:R
+ Makes the base image transparent according to the given ratio.
+ R must be between 0 and 255.
+ 0 means totally transparent.
+ 255 means totally opaque.
+ */
+ else if (str_starts_with(part_of_name, "[opacity:")) {
+ if (baseimg == NULL) {
+ errorstream << "generateImagePart(): baseimg == NULL "
+ << "for part_of_name=\"" << part_of_name
+ << "\", cancelling." << std::endl;
+ return false;
+ }
+
+ Strfnd sf(part_of_name);
+ sf.next(":");
+
+ u32 ratio = mystoi(sf.next(""), 0, 255);
+
+ core::dimension2d<u32> dim = baseimg->getDimension();
+
+ for (u32 y = 0; y < dim.Height; y++)
+ for (u32 x = 0; x < dim.Width; x++)
+ {
+ video::SColor c = baseimg->getPixel(x, y);
+ c.setAlpha(floor((c.getAlpha() * ratio) / 255 + 0.5));
+ baseimg->setPixel(x, y, c);
+ }
+ }
+ /*
+ [invert:mode
+ Inverts the given channels of the base image.
+ Mode may contain the characters "r", "g", "b", "a".
+ Only the channels that are mentioned in the mode string
+ will be inverted.
+ */
+ else if (str_starts_with(part_of_name, "[invert:")) {
+ if (baseimg == NULL) {
+ errorstream << "generateImagePart(): baseimg == NULL "
+ << "for part_of_name=\"" << part_of_name
+ << "\", cancelling." << std::endl;
+ return false;
+ }
+
+ Strfnd sf(part_of_name);
+ sf.next(":");
+
+ std::string mode = sf.next("");
+ u32 mask = 0;
+ if (mode.find("a") != std::string::npos)
+ mask |= 0xff000000UL;
+ if (mode.find("r") != std::string::npos)
+ mask |= 0x00ff0000UL;
+ if (mode.find("g") != std::string::npos)
+ mask |= 0x0000ff00UL;
+ if (mode.find("b") != std::string::npos)
+ mask |= 0x000000ffUL;
+
+ core::dimension2d<u32> dim = baseimg->getDimension();
+
+ for (u32 y = 0; y < dim.Height; y++)
+ for (u32 x = 0; x < dim.Width; x++)
+ {
+ video::SColor c = baseimg->getPixel(x, y);
+ c.color ^= mask;
+ baseimg->setPixel(x, y, c);
+ }
+ }
else
{
errorstream << "generateImagePart(): Invalid "
diff --git a/src/clientiface.cpp b/src/clientiface.cpp
index a3a17d435..0390cf0ff 100644
--- a/src/clientiface.cpp
+++ b/src/clientiface.cpp
@@ -22,14 +22,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "clientiface.h"
#include "util/numeric.h"
#include "util/mathconstants.h"
-#include "player.h"
+#include "remoteplayer.h"
#include "settings.h"
#include "mapblock.h"
#include "network/connection.h"
#include "environment.h"
#include "map.h"
#include "emerge.h"
-#include "serverobject.h" // TODO this is used for cleanup of only
+#include "content_sao.h" // TODO this is used for cleanup of only
#include "log.h"
#include "util/srp.h"
@@ -77,9 +77,13 @@ void RemoteClient::GetNextBlocks (
if(m_nothing_to_send_pause_timer >= 0)
return;
- Player *player = env->getPlayer(peer_id);
+ RemotePlayer *player = env->getPlayer(peer_id);
// This can happen sometimes; clients and players are not in perfect sync.
- if(player == NULL)
+ if (player == NULL)
+ return;
+
+ PlayerSAO *sao = player->getPlayerSAO();
+ if (sao == NULL)
return;
// Won't send anything if already sending
@@ -90,7 +94,7 @@ void RemoteClient::GetNextBlocks (
return;
}
- v3f playerpos = player->getPosition();
+ v3f playerpos = sao->getBasePosition();
v3f playerspeed = player->getSpeed();
v3f playerspeeddir(0,0,0);
if(playerspeed.getLength() > 1.0*BS)
@@ -103,10 +107,10 @@ void RemoteClient::GetNextBlocks (
v3s16 center = getNodeBlockPos(center_nodepos);
// Camera position and direction
- v3f camera_pos = player->getEyePosition();
+ v3f camera_pos = sao->getEyePosition();
v3f camera_dir = v3f(0,0,1);
- camera_dir.rotateYZBy(player->getPitch());
- camera_dir.rotateXZBy(player->getYaw());
+ camera_dir.rotateYZBy(sao->getPitch());
+ camera_dir.rotateXZBy(sao->getYaw());
/*infostream<<"camera_dir=("<<camera_dir.X<<","<<camera_dir.Y<<","
<<camera_dir.Z<<")"<<std::endl;*/
@@ -169,9 +173,20 @@ void RemoteClient::GetNextBlocks (
*/
s32 new_nearest_unsent_d = -1;
- const s16 full_d_max = g_settings->getS16("max_block_send_distance");
+ // get view range and camera fov from the client
+ s16 wanted_range = sao->getWantedRange();
+ float camera_fov = sao->getFov();
+ // if FOV, wanted_range are not available (old client), fall back to old default
+ if (wanted_range <= 0) wanted_range = 1000;
+ if (camera_fov <= 0) camera_fov = (72.0*M_PI/180) * 4./3.;
+
+ const s16 full_d_max = MYMIN(g_settings->getS16("max_block_send_distance"), wanted_range);
+ const s16 d_opt = MYMIN(g_settings->getS16("block_send_optimize_distance"), wanted_range);
+ const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
+ //infostream << "Fov from client " << camera_fov << " full_d_max " << full_d_max << std::endl;
+
s16 d_max = full_d_max;
- s16 d_max_gen = g_settings->getS16("max_block_generate_distance");
+ s16 d_max_gen = MYMIN(g_settings->getS16("max_block_generate_distance"), wanted_range);
// Don't loop very much at a time
s16 max_d_increment_at_time = 2;
@@ -229,24 +244,13 @@ void RemoteClient::GetNextBlocks (
// If this is true, inexistent block will be made from scratch
bool generate = d <= d_max_gen;
- {
- /*// Limit the generating area vertically to 2/3
- if(abs(p.Y - center.Y) > d_max_gen - d_max_gen / 3)
- generate = false;*/
-
- // Limit the send area vertically to 1/2
- if (abs(p.Y - center.Y) > full_d_max / 2)
- continue;
- }
-
/*
Don't generate or send if not in sight
FIXME This only works if the client uses a small enough
FOV setting. The default of 72 degrees is fine.
*/
- float camera_fov = (72.0*M_PI/180) * 4./3.;
- if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, 10000*BS) == false)
+ if(isBlockInSight(p, camera_pos, camera_dir, camera_fov, d_blocks_in_sight) == false)
{
continue;
}
@@ -296,7 +300,7 @@ void RemoteClient::GetNextBlocks (
Block is near ground level if night-time mesh
differs from day-time mesh.
*/
- if(d >= 4)
+ if(d >= d_opt)
{
if(block->getDayNightDiff() == false)
continue;
@@ -353,7 +357,7 @@ queue_full_break:
} else if(nearest_emergefull_d != -1){
new_nearest_unsent_d = nearest_emergefull_d;
} else {
- if(d > g_settings->getS16("max_block_send_distance")){
+ if(d > full_d_max){
new_nearest_unsent_d = 0;
m_nothing_to_send_pause_timer = 2.0;
} else {
@@ -605,11 +609,8 @@ ClientInterface::~ClientInterface()
{
MutexAutoLock clientslock(m_clients_mutex);
- for(std::map<u16, RemoteClient*>::iterator
- i = m_clients.begin();
- i != m_clients.end(); ++i)
- {
-
+ for (UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin();
+ i != m_clients.end(); ++i) {
// Delete client
delete i->second;
}
@@ -621,10 +622,8 @@ std::vector<u16> ClientInterface::getClientIDs(ClientState min_state)
std::vector<u16> reply;
MutexAutoLock clientslock(m_clients_mutex);
- for(std::map<u16, RemoteClient*>::iterator
- i = m_clients.begin();
- i != m_clients.end(); ++i)
- {
+ for(UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin();
+ i != m_clients.end(); ++i) {
if (i->second->getState() >= min_state)
reply.push_back(i->second->peer_id);
}
@@ -632,12 +631,6 @@ std::vector<u16> ClientInterface::getClientIDs(ClientState min_state)
return reply;
}
-std::vector<std::string> ClientInterface::getPlayerNames()
-{
- return m_clients_names;
-}
-
-
void ClientInterface::step(float dtime)
{
m_print_info_timer += dtime;
@@ -650,8 +643,7 @@ void ClientInterface::step(float dtime)
void ClientInterface::UpdatePlayerList()
{
- if (m_env != NULL)
- {
+ if (m_env != NULL) {
std::vector<u16> clients = getClientIDs();
m_clients_names.clear();
@@ -659,10 +651,8 @@ void ClientInterface::UpdatePlayerList()
if(!clients.empty())
infostream<<"Players:"<<std::endl;
- for(std::vector<u16>::iterator
- i = clients.begin();
- i != clients.end(); ++i) {
- Player *player = m_env->getPlayer(*i);
+ for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
+ RemotePlayer *player = m_env->getPlayer(*i);
if (player == NULL)
continue;
@@ -691,8 +681,7 @@ void ClientInterface::sendToAll(u16 channelnum,
NetworkPacket* pkt, bool reliable)
{
MutexAutoLock clientslock(m_clients_mutex);
- for(std::map<u16, RemoteClient*>::iterator
- i = m_clients.begin();
+ for(UNORDERED_MAP<u16, RemoteClient*>::iterator i = m_clients.begin();
i != m_clients.end(); ++i) {
RemoteClient *client = i->second;
@@ -705,11 +694,10 @@ void ClientInterface::sendToAll(u16 channelnum,
RemoteClient* ClientInterface::getClientNoEx(u16 peer_id, ClientState state_min)
{
MutexAutoLock clientslock(m_clients_mutex);
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// The client may not exist; clients are immediately removed if their
// access is denied, and this event occurs later then.
- if(n == m_clients.end())
+ if (n == m_clients.end())
return NULL;
if (n->second->getState() >= state_min)
@@ -720,11 +708,10 @@ RemoteClient* ClientInterface::getClientNoEx(u16 peer_id, ClientState state_min)
RemoteClient* ClientInterface::lockedGetClientNoEx(u16 peer_id, ClientState state_min)
{
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// The client may not exist; clients are immediately removed if their
// access is denied, and this event occurs later then.
- if(n == m_clients.end())
+ if (n == m_clients.end())
return NULL;
if (n->second->getState() >= state_min)
@@ -736,11 +723,10 @@ RemoteClient* ClientInterface::lockedGetClientNoEx(u16 peer_id, ClientState stat
ClientState ClientInterface::getClientState(u16 peer_id)
{
MutexAutoLock clientslock(m_clients_mutex);
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// The client may not exist; clients are immediately removed if their
// access is denied, and this event occurs later then.
- if(n == m_clients.end())
+ if (n == m_clients.end())
return CS_Invalid;
return n->second->getState();
@@ -749,11 +735,10 @@ ClientState ClientInterface::getClientState(u16 peer_id)
void ClientInterface::setPlayerName(u16 peer_id,std::string name)
{
MutexAutoLock clientslock(m_clients_mutex);
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// The client may not exist; clients are immediately removed if their
// access is denied, and this event occurs later then.
- if(n != m_clients.end())
+ if (n != m_clients.end())
n->second->setName(name);
}
@@ -762,11 +747,10 @@ void ClientInterface::DeleteClient(u16 peer_id)
MutexAutoLock conlock(m_clients_mutex);
// Error check
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// The client may not exist; clients are immediately removed if their
// access is denied, and this event occurs later then.
- if(n == m_clients.end())
+ if (n == m_clients.end())
return;
/*
@@ -797,10 +781,9 @@ void ClientInterface::CreateClient(u16 peer_id)
MutexAutoLock conlock(m_clients_mutex);
// Error check
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// The client shouldn't already exist
- if(n != m_clients.end()) return;
+ if (n != m_clients.end()) return;
// Create client
RemoteClient *client = new RemoteClient();
@@ -814,8 +797,7 @@ void ClientInterface::event(u16 peer_id, ClientStateEvent event)
MutexAutoLock clientlock(m_clients_mutex);
// Error check
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// No client to deliver event
if (n == m_clients.end())
@@ -836,8 +818,7 @@ u16 ClientInterface::getProtocolVersion(u16 peer_id)
MutexAutoLock conlock(m_clients_mutex);
// Error check
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// No client to get version
if (n == m_clients.end())
@@ -851,8 +832,7 @@ void ClientInterface::setClientVersion(u16 peer_id, u8 major, u8 minor, u8 patch
MutexAutoLock conlock(m_clients_mutex);
// Error check
- std::map<u16, RemoteClient*>::iterator n;
- n = m_clients.find(peer_id);
+ UNORDERED_MAP<u16, RemoteClient*>::iterator n = m_clients.find(peer_id);
// No client to set versions
if (n == m_clients.end())
diff --git a/src/clientiface.h b/src/clientiface.h
index c09942909..551d71bbe 100644
--- a/src/clientiface.h
+++ b/src/clientiface.h
@@ -25,10 +25,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "serialization.h" // for SER_FMT_VER_INVALID
#include "threading/mutex.h"
#include "network/networkpacket.h"
+#include "util/cpp11_container.h"
#include <list>
#include <vector>
-#include <map>
#include <set>
class MapBlock;
@@ -453,7 +453,7 @@ public:
std::vector<u16> getClientIDs(ClientState min_state=CS_Active);
/* get list of client player names */
- std::vector<std::string> getPlayerNames();
+ const std::vector<std::string> &getPlayerNames() const { return m_clients_names; }
/* send message to client */
void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable);
@@ -502,8 +502,7 @@ protected:
void lock() { m_clients_mutex.lock(); }
void unlock() { m_clients_mutex.unlock(); }
- std::map<u16, RemoteClient*>& getClientList()
- { return m_clients; }
+ UNORDERED_MAP<u16, RemoteClient*>& getClientList() { return m_clients; }
private:
/* update internal player list */
@@ -513,7 +512,7 @@ private:
con::Connection* m_con;
Mutex m_clients_mutex;
// Connected clients (behind the con mutex)
- std::map<u16, RemoteClient*> m_clients;
+ UNORDERED_MAP<u16, RemoteClient*> m_clients;
std::vector<std::string> m_clients_names; //for announcing masterserver
// Environment
diff --git a/src/clientmap.cpp b/src/clientmap.cpp
index a0a780250..faa1461f6 100644
--- a/src/clientmap.cpp
+++ b/src/clientmap.cpp
@@ -132,9 +132,9 @@ static bool isOccluded(Map *map, v3s16 p0, v3s16 p1, float step, float stepfac,
else
is_transparent = (f.solidness != 2);
if(!is_transparent){
- if(count == needed_count)
- return true;
count++;
+ if(count >= needed_count)
+ return true;
}
step *= stepfac;
}
@@ -293,13 +293,22 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
float step = BS * 1;
float stepfac = 1.1;
float startoff = BS * 1;
- float endoff = -BS*MAP_BLOCKSIZE * 1.42 * 1.42;
- v3s16 spn = cam_pos_nodes + v3s16(0, 0, 0);
+ // The occlusion search of 'isOccluded()' must stop short of the target
+ // point by distance 'endoff' (end offset) to not enter the target mapblock.
+ // For the 8 mapblock corners 'endoff' must therefore be the maximum diagonal
+ // of a mapblock, because we must consider all view angles.
+ // sqrt(1^2 + 1^2 + 1^2) = 1.732
+ float endoff = -BS * MAP_BLOCKSIZE * 1.732050807569;
+ v3s16 spn = cam_pos_nodes;
s16 bs2 = MAP_BLOCKSIZE / 2 + 1;
- u32 needed_count = 1;
+ // to reduce the likelihood of falsely occluded blocks
+ // require at least two solid blocks
+ // this is a HACK, we should think of a more precise algorithm
+ u32 needed_count = 2;
if (occlusion_culling_enabled &&
- isOccluded(this, spn, cpn + v3s16(0, 0, 0),
- step, stepfac, startoff, endoff, needed_count, nodemgr) &&
+ // For the central point of the mapblock 'endoff' can be halved
+ isOccluded(this, spn, cpn,
+ step, stepfac, startoff, endoff / 2.0f, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(bs2,bs2,bs2),
step, stepfac, startoff, endoff, needed_count, nodemgr) &&
isOccluded(this, spn, cpn + v3s16(bs2,bs2,-bs2),
@@ -521,6 +530,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, m_cache_trilinear_filter);
buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, m_cache_bilinear_filter);
buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, m_cache_anistropic_filter);
+ buf->getMaterial().setFlag(video::EMF_WIREFRAME, m_control.show_wireframe);
const video::SMaterial& material = buf->getMaterial();
video::IMaterialRenderer* rnd =
diff --git a/src/clientmap.h b/src/clientmap.h
index 396e68f64..cb686ff33 100644
--- a/src/clientmap.h
+++ b/src/clientmap.h
@@ -32,6 +32,7 @@ struct MapDrawControl
range_all(false),
wanted_range(0),
wanted_max_blocks(0),
+ show_wireframe(false),
blocks_drawn(0),
blocks_would_have_drawn(0),
farthest_drawn(0)
@@ -43,6 +44,8 @@ struct MapDrawControl
float wanted_range;
// Maximum number of blocks to draw
u32 wanted_max_blocks;
+ // show a wire frame for debugging
+ bool show_wireframe;
// Number of blocks rendered is written here by the renderer
u32 blocks_drawn;
// Number of blocks that would have been drawn in wanted_range
@@ -135,7 +138,9 @@ public:
{
return (m_last_drawn_sectors.find(p) != m_last_drawn_sectors.end());
}
-
+
+ const MapDrawControl & getControl() const { return m_control; }
+ f32 getCameraFov() const { return m_camera_fov; }
private:
Client *m_client;
diff --git a/src/clientobject.cpp b/src/clientobject.cpp
index a11757ea6..ff3f47187 100644
--- a/src/clientobject.cpp
+++ b/src/clientobject.cpp
@@ -43,12 +43,11 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type,
IGameDef *gamedef, ClientEnvironment *env)
{
// Find factory function
- std::map<u16, Factory>::iterator n;
- n = m_types.find(type);
+ UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
if(n == m_types.end()) {
// If factory is not found, just return.
- warningstream<<"ClientActiveObject: No factory for type="
- <<(int)type<<std::endl;
+ warningstream << "ClientActiveObject: No factory for type="
+ << (int)type << std::endl;
return NULL;
}
@@ -59,8 +58,7 @@ ClientActiveObject* ClientActiveObject::create(ActiveObjectType type,
void ClientActiveObject::registerType(u16 type, Factory f)
{
- std::map<u16, Factory>::iterator n;
- n = m_types.find(type);
+ UNORDERED_MAP<u16, Factory>::iterator n = m_types.find(type);
if(n != m_types.end())
return;
m_types[type] = f;
diff --git a/src/clientobject.h b/src/clientobject.h
index 3cc7c2391..83931e438 100644
--- a/src/clientobject.h
+++ b/src/clientobject.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_extrabloated.h"
#include "activeobject.h"
#include <map>
+#include "util/cpp11_container.h"
/*
@@ -60,6 +61,7 @@ public:
virtual bool getCollisionBox(aabb3f *toset){return false;}
virtual bool collideWithObjects(){return false;}
virtual v3f getPosition(){return v3f(0,0,0);}
+ virtual float getYaw() const {return 0;}
virtual scene::ISceneNode *getSceneNode(){return NULL;}
virtual scene::IMeshSceneNode *getMeshSceneNode(){return NULL;}
virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(){return NULL;}
@@ -103,7 +105,7 @@ protected:
ClientEnvironment *m_env;
private:
// Used for creating objects based on type
- static std::map<u16, Factory> m_types;
+ static UNORDERED_MAP<u16, Factory> m_types;
};
struct DistanceSortedActiveObject
diff --git a/src/cmake_config.h.in b/src/cmake_config.h.in
index 018532d13..4b731020a 100644
--- a/src/cmake_config.h.in
+++ b/src/cmake_config.h.in
@@ -14,6 +14,7 @@
#define STATIC_SHAREDIR "@SHAREDIR@"
#define STATIC_LOCALEDIR "@LOCALEDIR@"
#define BUILD_TYPE "@CMAKE_BUILD_TYPE@"
+#define ICON_DIR "@ICONDIR@"
#cmakedefine01 RUN_IN_PLACE
#cmakedefine01 USE_GETTEXT
#cmakedefine01 USE_CURL
@@ -22,6 +23,7 @@
#cmakedefine01 USE_CURSES
#cmakedefine01 USE_LEVELDB
#cmakedefine01 USE_LUAJIT
+#cmakedefine01 USE_POSTGRESQL
#cmakedefine01 USE_SPATIAL
#cmakedefine01 USE_SYSTEM_GMP
#cmakedefine01 USE_REDIS
diff --git a/src/collision.cpp b/src/collision.cpp
index 74c0c25c3..8e5dbcc9b 100644
--- a/src/collision.cpp
+++ b/src/collision.cpp
@@ -34,6 +34,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
//#define COLL_ZERO 0.032 // broken unit tests
#define COLL_ZERO 0
+
+struct NearbyCollisionInfo {
+ NearbyCollisionInfo(bool is_ul, bool is_obj, int bouncy,
+ const v3s16 &pos, const aabb3f &box) :
+ is_unloaded(is_ul),
+ is_step_up(false),
+ is_object(is_obj),
+ bouncy(bouncy),
+ position(pos),
+ box(box)
+ {}
+
+ bool is_unloaded;
+ bool is_step_up;
+ bool is_object;
+ int bouncy;
+ v3s16 position;
+ aabb3f box;
+};
+
+
// Helper function:
// Checks for collision of a moving aabbox with a static aabbox
// Returns -1 if no collision, 0 if X collision, 1 if Y collision, 2 if Z collision
@@ -160,7 +181,7 @@ int axisAlignedCollision(
// Helper function:
// Checks if moving the movingbox up by the given distance would hit a ceiling.
bool wouldCollideWithCeiling(
- const std::vector<aabb3f> &staticboxes,
+ const std::vector<NearbyCollisionInfo> &cinfo,
const aabb3f &movingbox,
f32 y_increase, f32 d)
{
@@ -168,12 +189,10 @@ bool wouldCollideWithCeiling(
assert(y_increase >= 0); // pre-condition
- for(std::vector<aabb3f>::const_iterator
- i = staticboxes.begin();
- i != staticboxes.end(); ++i)
- {
- const aabb3f& staticbox = *i;
- if((movingbox.MaxEdge.Y - d <= staticbox.MinEdge.Y) &&
+ for (std::vector<NearbyCollisionInfo>::const_iterator it = cinfo.begin();
+ it != cinfo.end(); ++it) {
+ const aabb3f &staticbox = it->box;
+ if ((movingbox.MaxEdge.Y - d <= staticbox.MinEdge.Y) &&
(movingbox.MaxEdge.Y + y_increase > staticbox.MinEdge.Y) &&
(movingbox.MinEdge.X < staticbox.MaxEdge.X) &&
(movingbox.MaxEdge.X > staticbox.MinEdge.X) &&
@@ -234,12 +253,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
/*
Collect node boxes in movement range
*/
- std::vector<aabb3f> cboxes;
- std::vector<bool> is_unloaded;
- std::vector<bool> is_step_up;
- std::vector<bool> is_object;
- std::vector<int> bouncy_values;
- std::vector<v3s16> node_positions;
+ std::vector<NearbyCollisionInfo> cinfo;
{
//TimeTaker tt2("collisionMoveSimple collect boxes");
ScopeProfiler sp(g_profiler, "collisionMoveSimple collect boxes avg", SPT_AVG);
@@ -310,23 +324,13 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
aabb3f box = *i;
box.MinEdge += v3f(x, y, z)*BS;
box.MaxEdge += v3f(x, y, z)*BS;
- cboxes.push_back(box);
- is_unloaded.push_back(false);
- is_step_up.push_back(false);
- bouncy_values.push_back(n_bouncy_value);
- node_positions.push_back(p);
- is_object.push_back(false);
+ cinfo.push_back(NearbyCollisionInfo(false,
+ false, n_bouncy_value, p, box));
}
- }
- else {
+ } else {
// Collide with unloaded nodes
aabb3f box = getNodeBox(p, BS);
- cboxes.push_back(box);
- is_unloaded.push_back(true);
- is_step_up.push_back(false);
- bouncy_values.push_back(0);
- node_positions.push_back(p);
- is_object.push_back(false);
+ cinfo.push_back(NearbyCollisionInfo(true, false, 0, p, box));
}
}
@@ -344,7 +348,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
ScopeProfiler sp(g_profiler, "collisionMoveSimple objects avg", SPT_AVG);
//TimeTaker tt3("collisionMoveSimple collect object boxes");
- /* add object boxes to cboxes */
+ /* add object boxes to cinfo */
std::vector<ActiveObject*> objects;
#ifndef SERVER
@@ -363,7 +367,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
#endif
{
ServerEnvironment *s_env = dynamic_cast<ServerEnvironment*>(env);
- if (s_env != 0) {
+ if (s_env != NULL) {
f32 distance = speed_f->getLength();
std::vector<u16> s_objects;
s_env->getObjectsInsideRadius(s_objects, *pos_f, distance * 1.5);
@@ -384,23 +388,12 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
aabb3f object_collisionbox;
if (object->getCollisionBox(&object_collisionbox) &&
object->collideWithObjects()) {
- cboxes.push_back(object_collisionbox);
- is_unloaded.push_back(false);
- is_step_up.push_back(false);
- bouncy_values.push_back(0);
- node_positions.push_back(v3s16(0,0,0));
- is_object.push_back(true);
+ cinfo.push_back(NearbyCollisionInfo(false, true, 0, v3s16(), object_collisionbox));
}
}
}
} //tt3
- assert(cboxes.size() == is_unloaded.size()); // post-condition
- assert(cboxes.size() == is_step_up.size()); // post-condition
- assert(cboxes.size() == bouncy_values.size()); // post-condition
- assert(cboxes.size() == node_positions.size()); // post-condition
- assert(cboxes.size() == is_object.size()); // post-condition
-
/*
Collision detection
*/
@@ -440,15 +433,16 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
/*
Go through every nodebox, find nearest collision
*/
- for (u32 boxindex = 0; boxindex < cboxes.size(); boxindex++) {
+ for (u32 boxindex = 0; boxindex < cinfo.size(); boxindex++) {
+ NearbyCollisionInfo box_info = cinfo[boxindex];
// Ignore if already stepped up this nodebox.
- if(is_step_up[boxindex])
+ if (box_info.is_step_up)
continue;
// Find nearest collision of the two boxes (raytracing-like)
f32 dtime_tmp;
- int collided = axisAlignedCollision(
- cboxes[boxindex], movingbox, *speed_f, d, &dtime_tmp);
+ int collided = axisAlignedCollision(box_info.box,
+ movingbox, *speed_f, d, &dtime_tmp);
if (collided == -1 || dtime_tmp >= nearest_dtime)
continue;
@@ -464,19 +458,19 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
dtime = 0; // Set to 0 to avoid "infinite" loop due to small FP numbers
} else {
// Otherwise, a collision occurred.
-
- const aabb3f& cbox = cboxes[nearest_boxindex];
+ NearbyCollisionInfo &nearest_info = cinfo[nearest_boxindex];
+ const aabb3f& cbox = nearest_info.box;
// Check for stairs.
bool step_up = (nearest_collided != 1) && // must not be Y direction
(movingbox.MinEdge.Y < cbox.MaxEdge.Y) &&
(movingbox.MinEdge.Y + stepheight > cbox.MaxEdge.Y) &&
- (!wouldCollideWithCeiling(cboxes, movingbox,
+ (!wouldCollideWithCeiling(cinfo, movingbox,
cbox.MaxEdge.Y - movingbox.MinEdge.Y,
d));
// Get bounce multiplier
- bool bouncy = (bouncy_values[nearest_boxindex] >= 1);
- float bounce = -(float)bouncy_values[nearest_boxindex] / 100.0;
+ bool bouncy = (nearest_info.bouncy >= 1);
+ float bounce = -(float)nearest_info.bouncy / 100.0;
// Move to the point of collision and reduce dtime by nearest_dtime
if (nearest_dtime < 0) {
@@ -495,39 +489,38 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
}
bool is_collision = true;
- if (is_unloaded[nearest_boxindex])
+ if (nearest_info.is_unloaded)
is_collision = false;
CollisionInfo info;
- if (is_object[nearest_boxindex])
+ if (nearest_info.is_object)
info.type = COLLISION_OBJECT;
else
info.type = COLLISION_NODE;
- info.node_p = node_positions[nearest_boxindex];
+ info.node_p = nearest_info.position;
info.bouncy = bouncy;
info.old_speed = *speed_f;
// Set the speed component that caused the collision to zero
if (step_up) {
// Special case: Handle stairs
- is_step_up[nearest_boxindex] = true;
+ nearest_info.is_step_up = true;
is_collision = false;
- } else if(nearest_collided == 0) { // X
+ } else if (nearest_collided == 0) { // X
if (fabs(speed_f->X) > BS * 3)
speed_f->X *= bounce;
else
speed_f->X = 0;
result.collides = true;
result.collides_xz = true;
- }
- else if(nearest_collided == 1) { // Y
- if (fabs(speed_f->Y) > BS * 3)
+ } else if (nearest_collided == 1) { // Y
+ if(fabs(speed_f->Y) > BS * 3)
speed_f->Y *= bounce;
else
speed_f->Y = 0;
result.collides = true;
- } else if(nearest_collided == 2) { // Z
+ } else if (nearest_collided == 2) { // Z
if (fabs(speed_f->Z) > BS * 3)
speed_f->Z *= bounce;
else
@@ -552,8 +545,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
aabb3f box = box_0;
box.MinEdge += *pos_f;
box.MaxEdge += *pos_f;
- for (u32 boxindex = 0; boxindex < cboxes.size(); boxindex++) {
- const aabb3f& cbox = cboxes[boxindex];
+ for (u32 boxindex = 0; boxindex < cinfo.size(); boxindex++) {
+ NearbyCollisionInfo &box_info = cinfo[boxindex];
+ const aabb3f &cbox = box_info.box;
/*
See if the object is touching ground.
@@ -567,8 +561,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
if (cbox.MaxEdge.X - d > box.MinEdge.X && cbox.MinEdge.X + d < box.MaxEdge.X &&
cbox.MaxEdge.Z - d > box.MinEdge.Z &&
cbox.MinEdge.Z + d < box.MaxEdge.Z) {
- if (is_step_up[boxindex]) {
- pos_f->Y += (cbox.MaxEdge.Y - box.MinEdge.Y);
+ if (box_info.is_step_up) {
+ pos_f->Y += cbox.MaxEdge.Y - box.MinEdge.Y;
box = box_0;
box.MinEdge += *pos_f;
box.MaxEdge += *pos_f;
@@ -576,9 +570,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
if (fabs(cbox.MaxEdge.Y - box.MinEdge.Y) < 0.15 * BS) {
result.touching_ground = true;
- if (is_object[boxindex])
+ if (box_info.is_object)
result.standing_on_object = true;
- if (is_unloaded[boxindex])
+ if (box_info.is_unloaded)
result.standing_on_unloaded = true;
}
}
diff --git a/src/constants.h b/src/constants.h
index b606fc4fa..55ae9daf3 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -112,7 +112,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#if defined(_WIN32)
#define TTF_DEFAULT_FONT_SIZE (18)
#else
- #define TTF_DEFAULT_FONT_SIZE (15)
+ #define TTF_DEFAULT_FONT_SIZE (16)
#endif
#define DEFAULT_FONT_SIZE (10)
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index d701e4f72..6b35d5881 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -51,7 +51,7 @@ struct ToolCapabilities;
#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
-std::map<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
+UNORDERED_MAP<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
SmoothTranslator::SmoothTranslator():
vect_old(0,0,0),
@@ -313,7 +313,8 @@ public:
{return &m_selection_box;}
v3f getPosition()
{return m_position;}
-
+ inline float getYaw() const
+ {return 0;}
std::string infoText()
{return m_infotext;}
@@ -546,7 +547,6 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env):
//
m_smgr(NULL),
m_irr(NULL),
- m_camera(NULL),
m_gamedef(NULL),
m_selection_box(-BS/3.,-BS/3.,-BS/3., BS/3.,BS/3.,BS/3.),
m_meshnode(NULL),
@@ -567,7 +567,7 @@ GenericCAO::GenericCAO(IGameDef *gamedef, ClientEnvironment *env):
m_animation_speed(15),
m_animation_blend(0),
m_animation_loop(true),
- m_bone_position(std::map<std::string, core::vector2d<v3f> >()),
+ m_bone_position(UNORDERED_MAP<std::string, core::vector2d<v3f> >()),
m_attachment_bone(""),
m_attachment_position(v3f(0,0,0)),
m_attachment_rotation(v3f(0,0,0)),
@@ -614,13 +614,28 @@ bool GenericCAO::collideWithObjects()
void GenericCAO::initialize(const std::string &data)
{
infostream<<"GenericCAO: Got init data"<<std::endl;
+ processInitData(data);
+
+ if (m_is_player) {
+ // Check if it's the current player
+ LocalPlayer *player = m_env->getLocalPlayer();
+ if (player && strcmp(player->getName(), m_name.c_str()) == 0) {
+ m_is_local_player = true;
+ m_is_visible = false;
+ player->setCAO(this);
+ }
+ m_env->addPlayerName(m_name.c_str());
+ }
+}
+
+void GenericCAO::processInitData(const std::string &data)
+{
std::istringstream is(data, std::ios::binary);
int num_messages = 0;
// version
u8 version = readU8(is);
// check version
- if(version == 1) // In PROTOCOL_VERSION 14
- {
+ if (version == 1) { // In PROTOCOL_VERSION 14
m_name = deSerializeString(is);
m_is_player = readU8(is);
m_id = readS16(is);
@@ -628,46 +643,26 @@ void GenericCAO::initialize(const std::string &data)
m_yaw = readF1000(is);
m_hp = readS16(is);
num_messages = readU8(is);
- }
- else if(version == 0) // In PROTOCOL_VERSION 13
- {
+ } else if (version == 0) { // In PROTOCOL_VERSION 13
m_name = deSerializeString(is);
m_is_player = readU8(is);
m_position = readV3F1000(is);
m_yaw = readF1000(is);
m_hp = readS16(is);
num_messages = readU8(is);
- }
- else
- {
+ } else {
errorstream<<"GenericCAO: Unsupported init data version"
<<std::endl;
return;
}
- for(int i=0; i<num_messages; i++)
- {
+ for (int i = 0; i < num_messages; i++) {
std::string message = deSerializeLongString(is);
processMessage(message);
}
pos_translator.init(m_position);
updateNodePos();
-
- if(m_is_player)
- {
- Player *player = m_env->getPlayer(m_name.c_str());
- if(player && player->isLocal())
- {
- m_is_local_player = true;
- m_is_visible = false;
- LocalPlayer* localplayer = dynamic_cast<LocalPlayer*>(player);
-
- assert( localplayer != NULL );
- localplayer->setCAO(this);
- }
- m_env->addPlayerName(m_name.c_str());
- }
}
GenericCAO::~GenericCAO()
@@ -804,7 +799,7 @@ void GenericCAO::removeFromScene(bool permanent)
}
}
-void GenericCAO::addToScene(scene::ISceneManager *smgr,
+void GenericCAO::addToScene(scene::ISceneManager *smgr,
ITextureSource *tsrc, IrrlichtDevice *irr)
{
m_smgr = smgr;
@@ -840,54 +835,50 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr,
setBillboardTextureMatrix(m_spritenode,
txs, tys, 0, 0);
}
- }
- else if(m_prop.visual == "upright_sprite") {
+ } else if (m_prop.visual == "upright_sprite") {
scene::SMesh *mesh = new scene::SMesh();
- double dx = BS*m_prop.visual_size.X/2;
- double dy = BS*m_prop.visual_size.Y/2;
- { // Front
- scene::IMeshBuffer *buf = new scene::SMeshBuffer();
+ double dx = BS * m_prop.visual_size.X / 2;
+ double dy = BS * m_prop.visual_size.Y / 2;
u8 li = m_last_light;
- video::SColor c(255,li,li,li);
- video::S3DVertex vertices[4] =
- {
- video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1),
- video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1),
- video::S3DVertex(dx,dy,0, 0,0,0, c, 1,0),
- video::S3DVertex(-dx,dy,0, 0,0,0, c, 0,0),
- };
- u16 indices[] = {0,1,2,2,3,0};
- buf->append(vertices, 4, indices, 6);
- // Set material
- buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
- buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
- buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
- buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
- // Add to mesh
- mesh->addMeshBuffer(buf);
- buf->drop();
+ video::SColor c(255, li, li, li);
+
+ { // Front
+ scene::IMeshBuffer *buf = new scene::SMeshBuffer();
+ video::S3DVertex vertices[4] = {
+ video::S3DVertex(-dx, -dy, 0, 0,0,0, c, 1,1),
+ video::S3DVertex( dx, -dy, 0, 0,0,0, c, 0,1),
+ video::S3DVertex( dx, dy, 0, 0,0,0, c, 0,0),
+ video::S3DVertex(-dx, dy, 0, 0,0,0, c, 1,0),
+ };
+ u16 indices[] = {0,1,2,2,3,0};
+ buf->append(vertices, 4, indices, 6);
+ // Set material
+ buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
+ buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
+ buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
+ buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
+ // Add to mesh
+ mesh->addMeshBuffer(buf);
+ buf->drop();
}
{ // Back
- scene::IMeshBuffer *buf = new scene::SMeshBuffer();
- u8 li = m_last_light;
- video::SColor c(255,li,li,li);
- video::S3DVertex vertices[4] =
- {
- video::S3DVertex(dx,-dy,0, 0,0,0, c, 1,1),
- video::S3DVertex(-dx,-dy,0, 0,0,0, c, 0,1),
- video::S3DVertex(-dx,dy,0, 0,0,0, c, 0,0),
- video::S3DVertex(dx,dy,0, 0,0,0, c, 1,0),
- };
- u16 indices[] = {0,1,2,2,3,0};
- buf->append(vertices, 4, indices, 6);
- // Set material
- buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
- buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
- buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
- buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
- // Add to mesh
- mesh->addMeshBuffer(buf);
- buf->drop();
+ scene::IMeshBuffer *buf = new scene::SMeshBuffer();
+ video::S3DVertex vertices[4] = {
+ video::S3DVertex( dx,-dy, 0, 0,0,0, c, 1,1),
+ video::S3DVertex(-dx,-dy, 0, 0,0,0, c, 0,1),
+ video::S3DVertex(-dx, dy, 0, 0,0,0, c, 0,0),
+ video::S3DVertex( dx, dy, 0, 0,0,0, c, 1,0),
+ };
+ u16 indices[] = {0,1,2,2,3,0};
+ buf->append(vertices, 4, indices, 6);
+ // Set material
+ buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
+ buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
+ buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
+ buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
+ // Add to mesh
+ mesh->addMeshBuffer(buf);
+ buf->drop();
}
m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
m_meshnode->grab();
@@ -1057,7 +1048,9 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
PlayerControl controls = player->getPlayerControl();
bool walking = false;
- if(controls.up || controls.down || controls.left || controls.right)
+ if (controls.up || controls.down || controls.left || controls.right ||
+ controls.forw_move_joystick_axis != 0.f ||
+ controls.sidew_move_joystick_axis != 0.f)
walking = true;
f32 new_speed = player->local_animation_speed;
@@ -1508,10 +1501,8 @@ void GenericCAO::updateBonePosition()
return;
m_animated_meshnode->setJointMode(irr::scene::EJUOR_CONTROL); // To write positions to the mesh on render
- for(std::map<std::string,
- core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin();
- ii != m_bone_position.end(); ++ii)
- {
+ for(UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+ ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
std::string bone_name = (*ii).first;
v3f bone_pos = (*ii).second.X;
v3f bone_rot = (*ii).second.Y;
@@ -1572,8 +1563,7 @@ void GenericCAO::processMessage(const std::string &data)
std::istringstream is(data, std::ios::binary);
// command
u8 cmd = readU8(is);
- if(cmd == GENERIC_CMD_SET_PROPERTIES)
- {
+ if (cmd == GENERIC_CMD_SET_PROPERTIES) {
m_prop = gob_read_set_properties(is);
m_selection_box = m_prop.collisionbox;
@@ -1592,9 +1582,7 @@ void GenericCAO::processMessage(const std::string &data)
m_prop.nametag = m_name;
expireVisuals();
- }
- else if(cmd == GENERIC_CMD_UPDATE_POSITION)
- {
+ } else if (cmd == GENERIC_CMD_UPDATE_POSITION) {
// Not sent by the server if this object is an attachment.
// We might however get here if the server notices the object being detached before the client.
m_position = readV3F1000(is);
@@ -1624,12 +1612,10 @@ void GenericCAO::processMessage(const std::string &data)
pos_translator.init(m_position);
}
updateNodePos();
- }
- else if(cmd == GENERIC_CMD_SET_TEXTURE_MOD) {
+ } else if (cmd == GENERIC_CMD_SET_TEXTURE_MOD) {
std::string mod = deSerializeString(is);
updateTextures(mod);
- }
- else if(cmd == GENERIC_CMD_SET_SPRITE) {
+ } else if (cmd == GENERIC_CMD_SET_SPRITE) {
v2s16 p = readV2S16(is);
int num_frames = readU16(is);
float framelength = readF1000(is);
@@ -1641,8 +1627,7 @@ void GenericCAO::processMessage(const std::string &data)
m_tx_select_horiz_by_yawpitch = select_horiz_by_yawpitch;
updateTexturePos();
- }
- else if(cmd == GENERIC_CMD_SET_PHYSICS_OVERRIDE) {
+ } else if (cmd == GENERIC_CMD_SET_PHYSICS_OVERRIDE) {
float override_speed = readF1000(is);
float override_jump = readF1000(is);
float override_gravity = readF1000(is);
@@ -1660,8 +1645,7 @@ void GenericCAO::processMessage(const std::string &data)
player->physics_override_sneak = sneak;
player->physics_override_sneak_glitch = sneak_glitch;
}
- }
- else if(cmd == GENERIC_CMD_SET_ANIMATION) {
+ } else if (cmd == GENERIC_CMD_SET_ANIMATION) {
// TODO: change frames send as v2s32 value
v2f range = readV2F1000(is);
if (!m_is_local_player) {
@@ -1695,8 +1679,7 @@ void GenericCAO::processMessage(const std::string &data)
updateAnimation();
}
}
- }
- else if(cmd == GENERIC_CMD_SET_BONE_POSITION) {
+ } else if (cmd == GENERIC_CMD_SET_BONE_POSITION) {
std::string bone = deSerializeString(is);
v3f position = readV3F1000(is);
v3f rotation = readV3F1000(is);
@@ -1729,8 +1712,7 @@ void GenericCAO::processMessage(const std::string &data)
}
updateAttachments();
- }
- else if(cmd == GENERIC_CMD_PUNCHED) {
+ } else if (cmd == GENERIC_CMD_PUNCHED) {
/*s16 damage =*/ readS16(is);
s16 result_hp = readS16(is);
@@ -1758,8 +1740,7 @@ void GenericCAO::processMessage(const std::string &data)
updateTextures("^[brighten");
}
}
- }
- else if(cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) {
+ } else if (cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) {
m_armor_groups.clear();
int armor_groups_size = readU16(is);
for(int i=0; i<armor_groups_size; i++)
@@ -1775,6 +1756,19 @@ void GenericCAO::processMessage(const std::string &data)
if (m_nametag != NULL) {
m_nametag->nametag_color = m_prop.nametag_color;
}
+ } else if (cmd == GENERIC_CMD_SPAWN_INFANT) {
+ u16 child_id = readU16(is);
+ u8 type = readU8(is);
+
+ if (GenericCAO *childobj = m_env->getGenericCAO(child_id)) {
+ childobj->processInitData(deSerializeLongString(is));
+ } else {
+ m_env->addActiveObject(child_id, type, deSerializeLongString(is));
+ }
+ } else {
+ warningstream << FUNCTION_NAME
+ << ": unknown command or outdated client \""
+ << cmd << std::endl;
}
}
diff --git a/src/content_cao.h b/src/content_cao.h
index a166ff494..a158e8296 100644
--- a/src/content_cao.h
+++ b/src/content_cao.h
@@ -68,7 +68,6 @@ private:
//
scene::ISceneManager *m_smgr;
IrrlichtDevice *m_irr;
- Camera* m_camera;
IGameDef *m_gamedef;
aabb3f m_selection_box;
scene::IMeshSceneNode *m_meshnode;
@@ -91,7 +90,7 @@ private:
int m_animation_speed;
int m_animation_blend;
bool m_animation_loop;
- std::map<std::string, core::vector2d<v3f> > m_bone_position; // stores position and rotation for each bone name
+ UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position; // stores position and rotation for each bone name
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
@@ -126,6 +125,8 @@ public:
void initialize(const std::string &data);
+ void processInitData(const std::string &data);
+
ClientActiveObject *getParent();
bool getCollisionBox(aabb3f *toset);
@@ -135,6 +136,10 @@ public:
aabb3f *getSelectionBox();
v3f getPosition();
+ inline float getYaw() const
+ {
+ return m_yaw;
+ }
scene::ISceneNode *getSceneNode();
@@ -206,7 +211,7 @@ public:
float time_from_last_punch=1000000);
std::string debugInfoText();
-
+
std::string infoText()
{
return m_prop.infotext;
diff --git a/src/content_mapblock.cpp b/src/content_mapblock.cpp
index 6a83bd8f3..8ce0f1e0a 100644
--- a/src/content_mapblock.cpp
+++ b/src/content_mapblock.cpp
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <IMeshManipulator.h>
#include "gamedef.h"
#include "log.h"
+#include "noise.h"
// Create a cuboid.
@@ -171,6 +172,15 @@ static inline void getNeighborConnectingFace(v3s16 p, INodeDefManager *nodedef,
*neighbors |= v;
}
+// For use in mapblock_mesh_generate_special
+// X,Y,Z of position must be -1,0,1
+// This expression is a simplification of
+// 3 * 3 * (pos.X + 1) + 3 * (pos.Y + 1) + (pos.Z + 1)
+static inline int NeighborToIndex(const v3s16 &pos)
+{
+ return 9 * pos.X + 3 * pos.Y + pos.Z + 13;
+}
+
/*
TODO: Fix alpha blending for special nodes
Currently only the last element rendered is blended correct
@@ -400,9 +410,14 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
// Neighbor liquid levels (key = relative position)
// Includes current node
- std::map<v3s16, f32> neighbor_levels;
- std::map<v3s16, content_t> neighbor_contents;
- std::map<v3s16, u8> neighbor_flags;
+
+ struct NeighborData {
+ f32 level;
+ content_t content;
+ u8 flags;
+ };
+ NeighborData neighbor_data_matrix[27];
+
const u8 neighborflag_top_is_same_liquid = 0x01;
v3s16 neighbor_dirs[9] = {
v3s16(0,0,0),
@@ -448,9 +463,12 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
flags |= neighborflag_top_is_same_liquid;
}
- neighbor_levels[neighbor_dirs[i]] = level;
- neighbor_contents[neighbor_dirs[i]] = content;
- neighbor_flags[neighbor_dirs[i]] = flags;
+ NeighborData &neighbor_data =
+ neighbor_data_matrix[NeighborToIndex(neighbor_dirs[i])];
+
+ neighbor_data.level = level;
+ neighbor_data.content = content;
+ neighbor_data.flags = flags;
}
// Corner heights (average between four liquids)
@@ -471,10 +489,12 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
for(u32 j=0; j<4; j++)
{
v3s16 neighbordir = cornerdir - halfdirs[j];
- content_t content = neighbor_contents[neighbordir];
+
+ NeighborData &neighbor_data =
+ neighbor_data_matrix[NeighborToIndex(neighbordir)];
+ content_t content = neighbor_data.content;
// If top is liquid, draw starting from top of node
- if(neighbor_flags[neighbordir] &
- neighborflag_top_is_same_liquid)
+ if (neighbor_data.flags & neighborflag_top_is_same_liquid)
{
cornerlevel = 0.5*BS;
valid_count = 1;
@@ -490,7 +510,7 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
// Flowing liquid has level information
else if(content == c_flowing)
{
- cornerlevel += neighbor_levels[neighbordir];
+ cornerlevel += neighbor_data.level;
valid_count++;
}
else if(content == CONTENT_AIR)
@@ -525,15 +545,17 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
{
v3s16 dir = side_dirs[i];
+ NeighborData& neighbor_data =
+ neighbor_data_matrix[NeighborToIndex(dir)];
/*
If our topside is liquid and neighbor's topside
is liquid, don't draw side face
*/
- if(top_is_same_liquid &&
- neighbor_flags[dir] & neighborflag_top_is_same_liquid)
+ if (top_is_same_liquid &&
+ neighbor_data.flags & neighborflag_top_is_same_liquid)
continue;
- content_t neighbor_content = neighbor_contents[dir];
+ content_t neighbor_content = neighbor_data.content;
const ContentFeatures &n_feat = nodedef->get(neighbor_content);
// Don't draw face if neighbor is blocking the view
@@ -1104,6 +1126,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
break;}
case NDT_PLANTLIKE:
{
+ PseudoRandom rng(x<<8 | z | y<<16);
+
TileSpec tile = getNodeTileN(n, p, 0, data);
tile.material_flags |= MATERIAL_FLAG_CRACK_OVERLAY;
@@ -1111,9 +1135,18 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
video::SColor c = MapBlock_LightColor(255, l, f.light_source);
float s = BS / 2 * f.visual_scale;
+ // add sqrt(2) visual scale
+ if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x10) != 0))
+ s *= 1.41421;
+
+ float random_offset_X = .0;
+ float random_offset_Z = .0;
+ if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x8) != 0)) {
+ random_offset_X = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145);
+ random_offset_Z = BS * ((rng.next() % 16 / 16.0) * 0.29 - 0.145);
+ }
- for (int j = 0; j < 2; j++)
- {
+ for (int j = 0; j < 4; j++) {
video::S3DVertex vertices[4] =
{
video::S3DVertex(-s,-BS/2, 0, 0,0,0, c, 0,1),
@@ -1121,28 +1154,146 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
video::S3DVertex( s,-BS/2 + s*2,0, 0,0,0, c, 1,0),
video::S3DVertex(-s,-BS/2 + s*2,0, 0,0,0, c, 0,0),
};
+
float rotate_degree = 0;
+ u8 p2mesh = 0;
if (f.param_type_2 == CPT2_DEGROTATE)
rotate_degree = n.param2 * 2;
-
- if (j == 0) {
- for(u16 i = 0; i < 4; i++)
- vertices[i].Pos.rotateXZBy(46 + rotate_degree);
- } else if (j == 1) {
- for(u16 i = 0; i < 4; i++)
- vertices[i].Pos.rotateXZBy(-44 + rotate_degree);
+ if (f.param_type_2 != CPT2_MESHOPTIONS) {
+ if (j == 0) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(46 + rotate_degree);
+ } else if (j == 1) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(-44 + rotate_degree);
+ }
+ } else {
+ p2mesh = n.param2 & 0x7;
+ switch (p2mesh) {
+ case 0:
+ // x
+ if (j == 0) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(46);
+ } else if (j == 1) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(-44);
+ }
+ break;
+ case 1:
+ // +
+ if (j == 0) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(91);
+ } else if (j == 1) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(1);
+ }
+ break;
+ case 2:
+ // *
+ if (j == 0) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(121);
+ } else if (j == 1) {
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(241);
+ } else { // (j == 2)
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(1);
+ }
+ break;
+ case 3:
+ // #
+ switch (j) {
+ case 0:
+ for (u16 i = 0; i < 4; i++) {
+ vertices[i].Pos.rotateXZBy(1);
+ vertices[i].Pos.Z += BS / 4;
+ }
+ break;
+ case 1:
+ for (u16 i = 0; i < 4; i++) {
+ vertices[i].Pos.rotateXZBy(91);
+ vertices[i].Pos.X += BS / 4;
+ }
+ break;
+ case 2:
+ for (u16 i = 0; i < 4; i++) {
+ vertices[i].Pos.rotateXZBy(181);
+ vertices[i].Pos.Z -= BS / 4;
+ }
+ break;
+ case 3:
+ for (u16 i = 0; i < 4; i++) {
+ vertices[i].Pos.rotateXZBy(271);
+ vertices[i].Pos.X -= BS / 4;
+ }
+ break;
+ }
+ break;
+ case 4:
+ // outward leaning #-like
+ switch (j) {
+ case 0:
+ for (u16 i = 2; i < 4; i++)
+ vertices[i].Pos.Z -= BS / 2;
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(1);
+ break;
+ case 1:
+ for (u16 i = 2; i < 4; i++)
+ vertices[i].Pos.Z -= BS / 2;
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(91);
+ break;
+ case 2:
+ for (u16 i = 2; i < 4; i++)
+ vertices[i].Pos.Z -= BS / 2;
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(181);
+ break;
+ case 3:
+ for (u16 i = 2; i < 4; i++)
+ vertices[i].Pos.Z -= BS / 2;
+ for (u16 i = 0; i < 4; i++)
+ vertices[i].Pos.rotateXZBy(271);
+ break;
+ }
+ break;
+ }
}
- for (int i = 0; i < 4; i++)
- {
+ for (int i = 0; i < 4; i++) {
vertices[i].Pos *= f.visual_scale;
vertices[i].Pos.Y += BS/2 * (f.visual_scale - 1);
vertices[i].Pos += intToFloat(p, BS);
+ // move to a random spot to avoid moire
+ if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x8) != 0)) {
+ vertices[i].Pos.X += random_offset_X;
+ vertices[i].Pos.Z += random_offset_Z;
+ }
+ // randomly move each face up/down
+ if ((f.param_type_2 == CPT2_MESHOPTIONS) && ((n.param2 & 0x20) != 0)) {
+ PseudoRandom yrng(j | x<<16 | z<<8 | y<<24 );
+ vertices[i].Pos.Y -= BS * ((yrng.next() % 16 / 16.0) * 0.125);
+ }
}
u16 indices[] = {0, 1, 2, 2, 3, 0};
// Add to mesh collector
collector.append(tile, vertices, 4, indices, 6);
+
+ // stop adding faces for meshes with less than 4 faces
+ if (f.param_type_2 == CPT2_MESHOPTIONS) {
+ if (((p2mesh == 0) || (p2mesh == 1)) && (j == 1))
+ break;
+ else if ((p2mesh == 2) && (j == 2))
+ break;
+ } else if (j == 1) {
+ break;
+ }
+
}
break;}
case NDT_FIRELIKE:
@@ -1376,8 +1527,8 @@ void mapblock_mesh_generate_special(MeshMakeData *data,
continue;
MapNode n_xy = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x + xz, y + y0, z));
MapNode n_zy = data->m_vmanip.getNodeNoEx(blockpos_nodes + v3s16(x, y + y0, z + xz));
- ContentFeatures def_xy = nodedef->get(n_xy);
- ContentFeatures def_zy = nodedef->get(n_zy);
+ const ContentFeatures &def_xy = nodedef->get(n_xy);
+ const ContentFeatures &def_zy = nodedef->get(n_zy);
// Check if current node would connect with the rail
is_rail_x[index] = ((def_xy.drawtype == NDT_RAILLIKE
diff --git a/src/content_nodemeta.cpp b/src/content_nodemeta.cpp
index 7f4264d8e..79a32b6bf 100644
--- a/src/content_nodemeta.cpp
+++ b/src/content_nodemeta.cpp
@@ -186,7 +186,7 @@ void content_nodemeta_deserialize_legacy(std::istream &is,
meta->set(p, data);
if(need_timer)
- timers->set(p, NodeTimer(1., 0.));
+ timers->set(NodeTimer(1., 0., p));
}
}
diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 53bf3154f..77ab51a02 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "serialization.h" // For compressZlib
#include "tool.h" // For ToolCapabilities
#include "gamedef.h"
-#include "player.h"
+#include "remoteplayer.h"
#include "server.h"
#include "scripting_game.h"
#include "genericobject.h"
@@ -118,14 +118,12 @@ LuaEntitySAO proto_LuaEntitySAO(NULL, v3f(0,0,0), "_prototype", "");
LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
const std::string &name, const std::string &state):
- ServerActiveObject(env, pos),
+ UnitSAO(env, pos),
m_init_name(name),
m_init_state(state),
m_registered(false),
- m_hp(-1),
m_velocity(0,0,0),
m_acceleration(0,0,0),
- m_yaw(0),
m_properties_sent(true),
m_last_sent_yaw(0),
m_last_sent_position(0,0,0),
@@ -156,6 +154,11 @@ LuaEntitySAO::~LuaEntitySAO()
if(m_registered){
m_env->getScriptIface()->luaentity_Remove(m_id);
}
+
+ for (UNORDERED_SET<u32>::iterator it = m_attached_particle_spawners.begin();
+ it != m_attached_particle_spawners.end(); ++it) {
+ m_env->deleteParticleSpawner(*it, false);
+ }
}
void LuaEntitySAO::addedToEnvironment(u32 dtime_s)
@@ -175,6 +178,8 @@ void LuaEntitySAO::addedToEnvironment(u32 dtime_s)
// Activate entity, supplying serialized state
m_env->getScriptIface()->
luaentity_Activate(m_id, m_init_state.c_str(), dtime_s);
+ } else {
+ m_prop.infotext = m_init_name;
}
}
@@ -345,8 +350,10 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
if(m_bone_position_sent == false){
m_bone_position_sent = true;
- for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
- std::string str = gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y);
+ for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+ ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
+ std::string str = gob_cmd_update_bone_position((*ii).first,
+ (*ii).second.X, (*ii).second.Y);
// create message and add to list
ActiveObjectMessage aom(getId(), true, str);
m_messages_out.push(aom);
@@ -376,15 +383,30 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
writeF1000(os, m_yaw);
writeS16(os, m_hp);
- writeU8(os, 4 + m_bone_position.size()); // number of messages stuffed in here
- os<<serializeLongString(getPropertyPacket()); // message 1
- os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
- os<<serializeLongString(gob_cmd_update_animation(
+ std::ostringstream msg_os(std::ios::binary);
+ msg_os << serializeLongString(getPropertyPacket()); // message 1
+ msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
+ msg_os << serializeLongString(gob_cmd_update_animation(
m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
- for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
- os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
+ for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+ ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
+ msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
+ (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
+ }
+ msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id,
+ m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
+ int message_count = 4 + m_bone_position.size();
+ for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
+ (ii != m_attachment_child_ids.end()); ++ii) {
+ if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
+ message_count++;
+ msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(),
+ obj->getClientInitializationData(protocol_version)));
+ }
}
- os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
+
+ writeU8(os, message_count);
+ os.write(msg_os.str().c_str(), msg_os.str().size());
}
else
{
@@ -492,7 +514,7 @@ void LuaEntitySAO::rightClick(ServerActiveObject *clicker)
m_env->getScriptIface()->luaentity_Rightclick(m_id, clicker);
}
-void LuaEntitySAO::setPos(v3f pos)
+void LuaEntitySAO::setPos(const v3f &pos)
{
if(isAttached())
return;
@@ -612,7 +634,7 @@ void LuaEntitySAO::removeAttachmentChild(int child_id)
m_attachment_child_ids.erase(child_id);
}
-std::set<int> LuaEntitySAO::getAttachmentChildIds()
+UNORDERED_SET<int> LuaEntitySAO::getAttachmentChildIds()
{
return m_attachment_child_ids;
}
@@ -647,16 +669,6 @@ v3f LuaEntitySAO::getAcceleration()
return m_acceleration;
}
-void LuaEntitySAO::setYaw(float yaw)
-{
- m_yaw = yaw;
-}
-
-float LuaEntitySAO::getYaw()
-{
- return m_yaw;
-}
-
void LuaEntitySAO::setTextureMod(const std::string &mod)
{
std::string str = gob_cmd_set_texture_mod(mod);
@@ -745,10 +757,9 @@ bool LuaEntitySAO::collideWithObjects(){
// No prototype, PlayerSAO does not need to be deserialized
-PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
- const std::set<std::string> &privs, bool is_singleplayer):
- ServerActiveObject(env_, v3f(0,0,0)),
- m_player(player_),
+PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer):
+ UnitSAO(env_, v3f(0,0,0)),
+ m_player(NULL),
m_peer_id(peer_id_),
m_inventory(NULL),
m_damage(0),
@@ -760,7 +771,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
m_position_not_sent(false),
m_armor_groups_sent(false),
m_properties_sent(true),
- m_privs(privs),
m_is_singleplayer(is_singleplayer),
m_animation_speed(0),
m_animation_blend(0),
@@ -769,6 +779,10 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
m_bone_position_sent(false),
m_attachment_parent_id(0),
m_attachment_sent(false),
+ m_breath(PLAYER_MAX_BREATH),
+ m_pitch(0),
+ m_fov(0),
+ m_wanted_range(0),
// public
m_physics_override_speed(1),
m_physics_override_jump(1),
@@ -777,10 +791,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
m_physics_override_sneak_glitch(true),
m_physics_override_sent(false)
{
- assert(m_player); // pre-condition
assert(m_peer_id != 0); // pre-condition
- setBasePosition(m_player->getPosition());
- m_inventory = &m_player->inventory;
m_armor_groups["fleshy"] = 100;
m_prop.hp_max = PLAYER_MAX_HP;
@@ -799,13 +810,21 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
// end of default appearance
m_prop.is_visible = true;
m_prop.makes_footstep_sound = true;
+ m_hp = PLAYER_MAX_HP;
}
PlayerSAO::~PlayerSAO()
{
if(m_inventory != &m_player->inventory)
delete m_inventory;
+}
+void PlayerSAO::initialize(RemotePlayer *player, const std::set<std::string> &privs)
+{
+ assert(player);
+ m_player = player;
+ m_privs = privs;
+ m_inventory = &m_player->inventory;
}
std::string PlayerSAO::getDescription()
@@ -817,22 +836,22 @@ std::string PlayerSAO::getDescription()
void PlayerSAO::addedToEnvironment(u32 dtime_s)
{
ServerActiveObject::addedToEnvironment(dtime_s);
- ServerActiveObject::setBasePosition(m_player->getPosition());
+ ServerActiveObject::setBasePosition(m_base_position);
m_player->setPlayerSAO(this);
m_player->peer_id = m_peer_id;
- m_last_good_position = m_player->getPosition();
+ m_last_good_position = m_base_position;
}
// Called before removing from environment
void PlayerSAO::removingFromEnvironment()
{
ServerActiveObject::removingFromEnvironment();
- if(m_player->getPlayerSAO() == this)
- {
- m_player->setPlayerSAO(NULL);
- m_player->peer_id = 0;
- m_env->savePlayer((RemotePlayer*)m_player);
- m_env->removePlayer(m_player);
+ if (m_player->getPlayerSAO() == this) {
+ unlinkPlayerSessionAndSave();
+ for (UNORDERED_SET<u32>::iterator it = m_attached_particle_spawners.begin();
+ it != m_attached_particle_spawners.end(); ++it) {
+ m_env->deleteParticleSpawner(*it, false);
+ }
}
}
@@ -851,31 +870,47 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
os<<serializeString(m_player->getName()); // name
writeU8(os, 1); // is_player
writeS16(os, getId()); //id
- writeV3F1000(os, m_player->getPosition() + v3f(0,BS*1,0));
- writeF1000(os, m_player->getYaw());
+ writeV3F1000(os, m_base_position + v3f(0,BS*1,0));
+ writeF1000(os, m_yaw);
writeS16(os, getHP());
- writeU8(os, 6 + m_bone_position.size()); // number of messages stuffed in here
- os<<serializeLongString(getPropertyPacket()); // message 1
- os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
- os<<serializeLongString(gob_cmd_update_animation(
+ std::ostringstream msg_os(std::ios::binary);
+ msg_os << serializeLongString(getPropertyPacket()); // message 1
+ msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
+ msg_os << serializeLongString(gob_cmd_update_animation(
m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
- for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
- os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
+ for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+ ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
+ msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
+ (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
}
- os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
- os<<serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
+ msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id,
+ m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
+ msg_os << serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
m_physics_override_jump, m_physics_override_gravity, m_physics_override_sneak,
m_physics_override_sneak_glitch)); // 5
- os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6 (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
+ // (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
+ msg_os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6
+ int message_count = 6 + m_bone_position.size();
+ for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
+ ii != m_attachment_child_ids.end(); ++ii) {
+ if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
+ message_count++;
+ msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(),
+ obj->getClientInitializationData(protocol_version)));
+ }
+ }
+
+ writeU8(os, message_count);
+ os.write(msg_os.str().c_str(), msg_os.str().size());
}
else
{
writeU8(os, 0); // version
os<<serializeString(m_player->getName()); // name
writeU8(os, 1); // is_player
- writeV3F1000(os, m_player->getPosition() + v3f(0,BS*1,0));
- writeF1000(os, m_player->getYaw());
+ writeV3F1000(os, m_base_position + v3f(0,BS*1,0));
+ writeF1000(os, m_yaw);
writeS16(os, getHP());
writeU8(os, 2); // number of messages stuffed in here
os<<serializeLongString(getPropertyPacket()); // message 1
@@ -921,7 +956,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
m_attachment_bone = "";
m_attachment_position = v3f(0,0,0);
m_attachment_rotation = v3f(0,0,0);
- m_player->setPosition(m_last_good_position);
+ setBasePosition(m_last_good_position);
((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
}
@@ -943,14 +978,13 @@ void PlayerSAO::step(float dtime, bool send_recommended)
// Each frame, parent position is copied if the object is attached, otherwise it's calculated normally
// If the object gets detached this comes into effect automatically from the last known origin
- if(isAttached())
- {
+ if (isAttached()) {
v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
m_last_good_position = pos;
- m_player->setPosition(pos);
+ setBasePosition(pos);
}
- if(send_recommended == false)
+ if (!send_recommended)
return;
// If the object is attached client-side, don't waste bandwidth sending its position to clients
@@ -962,12 +996,12 @@ void PlayerSAO::step(float dtime, bool send_recommended)
if(isAttached()) // Just in case we ever do send attachment position too
pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
else
- pos = m_player->getPosition() + v3f(0,BS*1,0);
+ pos = m_base_position + v3f(0,BS*1,0);
std::string str = gob_cmd_update_position(
pos,
v3f(0,0,0),
v3f(0,0,0),
- m_player->getYaw(),
+ m_yaw,
true,
false,
update_interval
@@ -977,7 +1011,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
m_messages_out.push(aom);
}
- if(m_armor_groups_sent == false) {
+ if (!m_armor_groups_sent) {
m_armor_groups_sent = true;
std::string str = gob_cmd_update_armor_groups(
m_armor_groups);
@@ -986,7 +1020,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
m_messages_out.push(aom);
}
- if(m_physics_override_sent == false){
+ if (!m_physics_override_sent) {
m_physics_override_sent = true;
std::string str = gob_cmd_update_physics_override(m_physics_override_speed,
m_physics_override_jump, m_physics_override_gravity,
@@ -996,7 +1030,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
m_messages_out.push(aom);
}
- if(m_animation_sent == false){
+ if (!m_animation_sent) {
m_animation_sent = true;
std::string str = gob_cmd_update_animation(
m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop);
@@ -1005,19 +1039,22 @@ void PlayerSAO::step(float dtime, bool send_recommended)
m_messages_out.push(aom);
}
- if(m_bone_position_sent == false){
+ if (!m_bone_position_sent) {
m_bone_position_sent = true;
- for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
- std::string str = gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y);
+ for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+ ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
+ std::string str = gob_cmd_update_bone_position((*ii).first,
+ (*ii).second.X, (*ii).second.Y);
// create message and add to list
ActiveObjectMessage aom(getId(), true, str);
m_messages_out.push(aom);
}
}
- if(m_attachment_sent == false){
+ if (!m_attachment_sent){
m_attachment_sent = true;
- std::string str = gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation);
+ std::string str = gob_cmd_update_attachment(m_attachment_parent_id,
+ m_attachment_bone, m_attachment_position, m_attachment_rotation);
// create message and add to list
ActiveObjectMessage aom(getId(), true, str);
m_messages_out.push(aom);
@@ -1026,16 +1063,20 @@ void PlayerSAO::step(float dtime, bool send_recommended)
void PlayerSAO::setBasePosition(const v3f &position)
{
+ if (m_player && position != m_base_position)
+ m_player->setDirty(true);
+
// This needs to be ran for attachments too
ServerActiveObject::setBasePosition(position);
m_position_not_sent = true;
}
-void PlayerSAO::setPos(v3f pos)
+void PlayerSAO::setPos(const v3f &pos)
{
if(isAttached())
return;
- m_player->setPosition(pos);
+
+ setBasePosition(pos);
// Movement caused by this command is always valid
m_last_good_position = pos;
((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
@@ -1045,21 +1086,54 @@ void PlayerSAO::moveTo(v3f pos, bool continuous)
{
if(isAttached())
return;
- m_player->setPosition(pos);
+
+ setBasePosition(pos);
// Movement caused by this command is always valid
m_last_good_position = pos;
((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
}
-void PlayerSAO::setYaw(float yaw)
+void PlayerSAO::setYaw(const float yaw)
+{
+ if (m_player && yaw != m_yaw)
+ m_player->setDirty(true);
+
+ UnitSAO::setYaw(yaw);
+}
+
+void PlayerSAO::setFov(const float fov)
+{
+ if (m_player && fov != m_fov)
+ m_player->setDirty(true);
+
+ m_fov = fov;
+}
+
+void PlayerSAO::setWantedRange(const s16 range)
+{
+ if (m_player && range != m_wanted_range)
+ m_player->setDirty(true);
+
+ m_wanted_range = range;
+}
+
+void PlayerSAO::setYawAndSend(const float yaw)
{
- m_player->setYaw(yaw);
+ setYaw(yaw);
((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
}
-void PlayerSAO::setPitch(float pitch)
+void PlayerSAO::setPitch(const float pitch)
+{
+ if (m_player && pitch != m_pitch)
+ m_player->setDirty(true);
+
+ m_pitch = pitch;
+}
+
+void PlayerSAO::setPitchAndSend(const float pitch)
{
- m_player->setPitch(pitch);
+ setPitch(pitch);
((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
}
@@ -1124,15 +1198,10 @@ int PlayerSAO::punch(v3f dir,
return hitparams.wear;
}
-void PlayerSAO::rightClick(ServerActiveObject *clicker)
+void PlayerSAO::rightClick(ServerActiveObject *)
{
}
-s16 PlayerSAO::getHP() const
-{
- return m_player->hp;
-}
-
s16 PlayerSAO::readDamage()
{
s16 damage = m_damage;
@@ -1142,10 +1211,9 @@ s16 PlayerSAO::readDamage()
void PlayerSAO::setHP(s16 hp)
{
- s16 oldhp = m_player->hp;
+ s16 oldhp = m_hp;
- s16 hp_change = m_env->getScriptIface()->on_player_hpchange(this,
- hp - oldhp);
+ s16 hp_change = m_env->getScriptIface()->on_player_hpchange(this, hp - oldhp);
if (hp_change == 0)
return;
hp = oldhp + hp_change;
@@ -1155,11 +1223,11 @@ void PlayerSAO::setHP(s16 hp)
else if (hp > PLAYER_MAX_HP)
hp = PLAYER_MAX_HP;
- if(hp < oldhp && g_settings->getBool("enable_damage") == false) {
+ if (hp < oldhp && !g_settings->getBool("enable_damage")) {
return;
}
- m_player->hp = hp;
+ m_hp = hp;
if (oldhp > hp)
m_damage += (oldhp - hp);
@@ -1169,14 +1237,12 @@ void PlayerSAO::setHP(s16 hp)
m_properties_sent = false;
}
-u16 PlayerSAO::getBreath() const
+void PlayerSAO::setBreath(const u16 breath)
{
- return m_player->getBreath();
-}
+ if (m_player && breath != m_breath)
+ m_player->setDirty(true);
-void PlayerSAO::setBreath(u16 breath)
-{
- m_player->setBreath(breath);
+ m_breath = breath;
}
void PlayerSAO::setArmorGroups(const ItemGroupList &armor_groups)
@@ -1257,7 +1323,7 @@ void PlayerSAO::removeAttachmentChild(int child_id)
m_attachment_child_ids.erase(child_id);
}
-std::set<int> PlayerSAO::getAttachmentChildIds()
+UNORDERED_SET<int> PlayerSAO::getAttachmentChildIds()
{
return m_attachment_child_ids;
}
@@ -1293,6 +1359,42 @@ std::string PlayerSAO::getWieldList() const
return "main";
}
+ItemStack PlayerSAO::getWieldedItem() const
+{
+ const Inventory *inv = getInventory();
+ ItemStack ret;
+ const InventoryList *mlist = inv->getList(getWieldList());
+ if (mlist && getWieldIndex() < (s32)mlist->getSize())
+ ret = mlist->getItem(getWieldIndex());
+ if (ret.name.empty()) {
+ const InventoryList *hlist = inv->getList("hand");
+ if (hlist)
+ ret = hlist->getItem(0);
+ }
+ return ret;
+}
+
+bool PlayerSAO::setWieldedItem(const ItemStack &item)
+{
+ Inventory *inv = getInventory();
+ if (inv) {
+ InventoryList *mlist = inv->getList(getWieldList());
+ if (mlist) {
+ ItemStack olditem = mlist->getItem(getWieldIndex());
+ if (olditem.name.empty()) {
+ InventoryList *hlist = inv->getList("hand");
+ if (hlist) {
+ hlist->changeItem(0, item);
+ return true;
+ }
+ }
+ mlist->changeItem(getWieldIndex(), item);
+ return true;
+ }
+ }
+ return false;
+}
+
int PlayerSAO::getWieldIndex() const
{
return m_wield_index;
@@ -1305,15 +1407,20 @@ void PlayerSAO::setWieldIndex(int i)
}
}
+// Erase the peer id and make the object for removal
void PlayerSAO::disconnected()
{
m_peer_id = 0;
m_removed = true;
- if(m_player->getPlayerSAO() == this)
- {
- m_player->setPlayerSAO(NULL);
- m_player->peer_id = 0;
- }
+}
+
+void PlayerSAO::unlinkPlayerSessionAndSave()
+{
+ assert(m_player->getPlayerSAO() == this);
+ m_player->peer_id = 0;
+ m_env->savePlayer(m_player);
+ m_player->setPlayerSAO(NULL);
+ m_env->removePlayer(m_player);
}
std::string PlayerSAO::getPropertyPacket()
@@ -1324,66 +1431,65 @@ std::string PlayerSAO::getPropertyPacket()
bool PlayerSAO::checkMovementCheat()
{
+ if (isAttached() || m_is_singleplayer ||
+ g_settings->getBool("disable_anticheat")) {
+ m_last_good_position = m_base_position;
+ return false;
+ }
+
bool cheated = false;
- if(isAttached() || m_is_singleplayer ||
- g_settings->getBool("disable_anticheat"))
- {
- m_last_good_position = m_player->getPosition();
+ /*
+ Check player movements
+
+ NOTE: Actually the server should handle player physics like the
+ client does and compare player's position to what is calculated
+ on our side. This is required when eg. players fly due to an
+ explosion. Altough a node-based alternative might be possible
+ too, and much more lightweight.
+ */
+
+ float player_max_speed = 0;
+
+ if (m_privs.count("fast") != 0) {
+ // Fast speed
+ player_max_speed = m_player->movement_speed_fast * m_physics_override_speed;
+ } else {
+ // Normal speed
+ player_max_speed = m_player->movement_speed_walk * m_physics_override_speed;
}
- else
- {
- /*
- Check player movements
-
- NOTE: Actually the server should handle player physics like the
- client does and compare player's position to what is calculated
- on our side. This is required when eg. players fly due to an
- explosion. Altough a node-based alternative might be possible
- too, and much more lightweight.
- */
-
- float player_max_speed = 0;
- if(m_privs.count("fast") != 0){
- // Fast speed
- player_max_speed = m_player->movement_speed_fast;
- } else {
- // Normal speed
- player_max_speed = m_player->movement_speed_walk;
- }
- // Tolerance. With the lag pool we shouldn't need it.
- //player_max_speed *= 2.5;
- //player_max_speed_up *= 2.5;
-
- v3f diff = (m_player->getPosition() - m_last_good_position);
- float d_vert = diff.Y;
- diff.Y = 0;
- float d_horiz = diff.getLength();
- float required_time = d_horiz/player_max_speed;
- if(d_vert > 0 && d_vert/player_max_speed > required_time)
- required_time = d_vert/player_max_speed;
- if(m_move_pool.grab(required_time)){
- m_last_good_position = m_player->getPosition();
- } else {
- actionstream<<"Player "<<m_player->getName()
- <<" moved too fast; resetting position"
- <<std::endl;
- m_player->setPosition(m_last_good_position);
- cheated = true;
- }
+ // Tolerance. The lag pool does this a bit.
+ //player_max_speed *= 2.5;
+
+ v3f diff = (m_base_position - m_last_good_position);
+ float d_vert = diff.Y;
+ diff.Y = 0;
+ float d_horiz = diff.getLength();
+ float required_time = d_horiz / player_max_speed;
+
+ if (d_vert > 0 && d_vert / player_max_speed > required_time)
+ required_time = d_vert / player_max_speed; // Moving upwards
+
+ if (m_move_pool.grab(required_time)) {
+ m_last_good_position = m_base_position;
+ } else {
+ actionstream << "Player " << m_player->getName()
+ << " moved too fast; resetting position"
+ << std::endl;
+ setBasePosition(m_last_good_position);
+ cheated = true;
}
return cheated;
}
-bool PlayerSAO::getCollisionBox(aabb3f *toset) {
- //update collision box
- *toset = m_player->getCollisionbox();
-
+bool PlayerSAO::getCollisionBox(aabb3f *toset)
+{
+ *toset = aabb3f(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30);
toset->MinEdge += m_base_position;
toset->MaxEdge += m_base_position;
-
return true;
}
-bool PlayerSAO::collideWithObjects(){
+bool PlayerSAO::collideWithObjects()
+{
return true;
}
diff --git a/src/content_sao.h b/src/content_sao.h
index 44d40d332..86255183d 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -22,14 +22,36 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "serverobject.h"
#include "itemgroup.h"
-#include "player.h"
#include "object_properties.h"
+#include "constants.h"
+
+class UnitSAO: public ServerActiveObject
+{
+public:
+ UnitSAO(ServerEnvironment *env, v3f pos):
+ ServerActiveObject(env, pos),
+ m_hp(-1), m_yaw(0) {}
+ virtual ~UnitSAO() {}
+
+ virtual void setYaw(const float yaw) { m_yaw = yaw; }
+ float getYaw() const { return m_yaw; };
+ f32 getRadYaw() const { return m_yaw * core::DEGTORAD; }
+ // Deprecated
+ f32 getRadYawDep() const { return (m_yaw + 90.) * core::DEGTORAD; }
+
+ s16 getHP() const { return m_hp; }
+ // Use a function, if isDead can be defined by other conditions
+ bool isDead() const { return m_hp == 0; }
+protected:
+ s16 m_hp;
+ float m_yaw;
+};
/*
LuaEntitySAO needs some internals exposed.
*/
-class LuaEntitySAO : public ServerActiveObject
+class LuaEntitySAO : public UnitSAO
{
public:
LuaEntitySAO(ServerEnvironment *env, v3f pos,
@@ -51,7 +73,7 @@ public:
ServerActiveObject *puncher=NULL,
float time_from_last_punch=1000000);
void rightClick(ServerActiveObject *clicker);
- void setPos(v3f pos);
+ void setPos(const v3f &pos);
void moveTo(v3f pos, bool continuous);
float getMinimumSavedMovement();
std::string getDescription();
@@ -67,7 +89,7 @@ public:
void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
void addAttachmentChild(int child_id);
void removeAttachmentChild(int child_id);
- std::set<int> getAttachmentChildIds();
+ UNORDERED_SET<int> getAttachmentChildIds();
ObjectProperties* accessObjectProperties();
void notifyObjectPropertiesModified();
/* LuaEntitySAO-specific */
@@ -75,8 +97,7 @@ public:
v3f getVelocity();
void setAcceleration(v3f acceleration);
v3f getAcceleration();
- void setYaw(float yaw);
- float getYaw();
+
void setTextureMod(const std::string &mod);
void setSprite(v2s16 p, int num_frames, float framelength,
bool select_horiz_by_yawpitch);
@@ -92,10 +113,9 @@ private:
bool m_registered;
struct ObjectProperties m_prop;
- s16 m_hp;
v3f m_velocity;
v3f m_acceleration;
- float m_yaw;
+
ItemGroupList m_armor_groups;
bool m_properties_sent;
@@ -112,11 +132,11 @@ private:
bool m_animation_loop;
bool m_animation_sent;
- std::map<std::string, core::vector2d<v3f> > m_bone_position;
+ UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;
int m_attachment_parent_id;
- std::set<int> m_attachment_child_ids;
+ UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
@@ -157,11 +177,12 @@ public:
}
};
-class PlayerSAO : public ServerActiveObject
+class RemotePlayer;
+
+class PlayerSAO : public UnitSAO
{
public:
- PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
- const std::set<std::string> &privs, bool is_singleplayer);
+ PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer);
~PlayerSAO();
ActiveObjectType getType() const
{ return ACTIVEOBJECT_TYPE_PLAYER; }
@@ -181,10 +202,22 @@ public:
bool isAttached();
void step(float dtime, bool send_recommended);
void setBasePosition(const v3f &position);
- void setPos(v3f pos);
+ void setPos(const v3f &pos);
void moveTo(v3f pos, bool continuous);
- void setYaw(float);
- void setPitch(float);
+ void setYaw(const float yaw);
+ // Data should not be sent at player initialization
+ void setYawAndSend(const float yaw);
+ void setPitch(const float pitch);
+ // Data should not be sent at player initialization
+ void setPitchAndSend(const float pitch);
+ f32 getPitch() const { return m_pitch; }
+ f32 getRadPitch() const { return m_pitch * core::DEGTORAD; }
+ // Deprecated
+ f32 getRadPitchDep() const { return -1.0 * m_pitch * core::DEGTORAD; }
+ void setFov(const float pitch);
+ f32 getFov() const { return m_fov; }
+ void setWantedRange(const s16 range);
+ s16 getWantedRange() const { return m_wanted_range; }
/*
Interaction interface
@@ -195,11 +228,11 @@ public:
ServerActiveObject *puncher,
float time_from_last_punch);
void rightClick(ServerActiveObject *clicker);
- s16 getHP() const;
void setHP(s16 hp);
+ void setHPRaw(s16 hp) { m_hp = hp; }
s16 readDamage();
- u16 getBreath() const;
- void setBreath(u16 breath);
+ u16 getBreath() const { return m_breath; }
+ void setBreath(const u16 breath);
void setArmorGroups(const ItemGroupList &armor_groups);
ItemGroupList getArmorGroups();
void setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop);
@@ -210,7 +243,7 @@ public:
void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation);
void addAttachmentChild(int child_id);
void removeAttachmentChild(int child_id);
- std::set<int> getAttachmentChildIds();
+ UNORDERED_SET<int> getAttachmentChildIds();
ObjectProperties* accessObjectProperties();
void notifyObjectPropertiesModified();
@@ -222,6 +255,8 @@ public:
const Inventory* getInventory() const;
InventoryLocation getInventoryLocation() const;
std::string getWieldList() const;
+ ItemStack getWieldedItem() const;
+ bool setWieldedItem(const ItemStack &item);
int getWieldIndex() const;
void setWieldIndex(int i);
@@ -231,14 +266,8 @@ public:
void disconnected();
- Player* getPlayer()
- {
- return m_player;
- }
- u16 getPeerID() const
- {
- return m_peer_id;
- }
+ RemotePlayer *getPlayer() { return m_player; }
+ u16 getPeerID() const { return m_peer_id; }
// Cheat prevention
@@ -288,10 +317,16 @@ public:
bool getCollisionBox(aabb3f *toset);
bool collideWithObjects();
+ void initialize(RemotePlayer *player, const std::set<std::string> &privs);
+
+ v3f getEyePosition() const { return m_base_position + getEyeOffset(); }
+ v3f getEyeOffset() const { return v3f(0, BS * 1.625f, 0); }
+
private:
std::string getPropertyPacket();
+ void unlinkPlayerSessionAndSave();
- Player *m_player;
+ RemotePlayer *m_player;
u16 m_peer_id;
Inventory *m_inventory;
s16 m_damage;
@@ -321,17 +356,20 @@ private:
bool m_animation_loop;
bool m_animation_sent;
- std::map<std::string, core::vector2d<v3f> > m_bone_position; // Stores position and rotation for each bone name
+ // Stores position and rotation for each bone name
+ UNORDERED_MAP<std::string, core::vector2d<v3f> > m_bone_position;
bool m_bone_position_sent;
int m_attachment_parent_id;
- std::set<int> m_attachment_child_ids;
+ UNORDERED_SET<int> m_attachment_child_ids;
std::string m_attachment_bone;
v3f m_attachment_position;
v3f m_attachment_rotation;
bool m_attachment_sent;
-
-
+ u16 m_breath;
+ f32 m_pitch;
+ f32 m_fov;
+ s16 m_wanted_range;
public:
float m_physics_override_speed;
float m_physics_override_jump;
diff --git a/src/convert_json.h b/src/convert_json.h
index 6732fcfa3..55321af5f 100644
--- a/src/convert_json.h
+++ b/src/convert_json.h
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef __CONVERT_JSON_H__
#define __CONVERT_JSON_H__
-#include "json/json.h"
+#include <json/json.h>
struct ModStoreMod;
struct ModStoreModDetails;
diff --git a/src/craftdef.cpp b/src/craftdef.cpp
index d3f1edaf9..45d3018a7 100644
--- a/src/craftdef.cpp
+++ b/src/craftdef.cpp
@@ -960,6 +960,96 @@ public:
return recipes;
}
+
+ virtual bool clearCraftRecipesByOutput(const CraftOutput &output, IGameDef *gamedef)
+ {
+ std::map<std::string, std::vector<CraftDefinition*> >::iterator vec_iter =
+ m_output_craft_definitions.find(output.item);
+
+ if (vec_iter == m_output_craft_definitions.end())
+ return false;
+
+ std::vector<CraftDefinition*> &vec = vec_iter->second;
+ for (std::vector<CraftDefinition*>::iterator i = vec.begin();
+ i != vec.end(); ++i) {
+ CraftDefinition *def = *i;
+ // Recipes are not yet hashed at this point
+ std::vector<CraftDefinition*> &unhashed_inputs_vec = m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0];
+ std::vector<CraftDefinition*> new_vec_by_input;
+ /* We will preallocate necessary memory addresses, so we don't need to reallocate them later.
+ This would save us some performance. */
+ new_vec_by_input.reserve(unhashed_inputs_vec.size());
+ for (std::vector<CraftDefinition*>::iterator i2 = unhashed_inputs_vec.begin();
+ i2 != unhashed_inputs_vec.end(); ++i2) {
+ if (def != *i2) {
+ new_vec_by_input.push_back(*i2);
+ }
+ }
+ m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].swap(new_vec_by_input);
+ }
+ m_output_craft_definitions.erase(output.item);
+ return true;
+ }
+
+ virtual bool clearCraftRecipesByInput(CraftMethod craft_method, unsigned int craft_grid_width,
+ const std::vector<std::string> &recipe, IGameDef *gamedef)
+ {
+ bool all_empty = true;
+ for (std::vector<std::string>::size_type i = 0;
+ i < recipe.size(); i++) {
+ if (!recipe[i].empty()) {
+ all_empty = false;
+ break;
+ }
+ }
+ if (all_empty)
+ return false;
+
+ CraftInput input(craft_method, craft_grid_width, craftGetItems(recipe, gamedef));
+ // Recipes are not yet hashed at this point
+ std::vector<CraftDefinition*> &unhashed_inputs_vec = m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0];
+ std::vector<CraftDefinition*> new_vec_by_input;
+ bool got_hit = false;
+ for (std::vector<CraftDefinition*>::size_type
+ i = unhashed_inputs_vec.size(); i > 0; i--) {
+ CraftDefinition *def = unhashed_inputs_vec[i - 1];
+ /* If the input doesn't match the recipe definition, this recipe definition later
+ will be added back in source map. */
+ if (!def->check(input, gamedef)) {
+ new_vec_by_input.push_back(def);
+ continue;
+ }
+ CraftOutput output = def->getOutput(input, gamedef);
+ got_hit = true;
+ std::map<std::string, std::vector<CraftDefinition*> >::iterator
+ vec_iter = m_output_craft_definitions.find(output.item);
+ if (vec_iter == m_output_craft_definitions.end())
+ continue;
+ std::vector<CraftDefinition*> &vec = vec_iter->second;
+ std::vector<CraftDefinition*> new_vec_by_output;
+ /* We will preallocate necessary memory addresses, so we don't need
+ to reallocate them later. This would save us some performance. */
+ new_vec_by_output.reserve(vec.size());
+ for (std::vector<CraftDefinition*>::iterator i = vec.begin();
+ i != vec.end(); ++i) {
+ /* If pointers from map by input and output are not same,
+ we will add 'CraftDefinition*' to a new vector. */
+ if (def != *i) {
+ /* Adding dereferenced iterator value (which are
+ 'CraftDefinition' reference) to a new vector. */
+ new_vec_by_output.push_back(*i);
+ }
+ }
+ // Swaps assigned to current key value with new vector for output map.
+ m_output_craft_definitions[output.item].swap(new_vec_by_output);
+ }
+ if (got_hit)
+ // Swaps value with new vector for input map.
+ m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].swap(new_vec_by_input);
+
+ return got_hit;
+ }
+
virtual std::string dump() const
{
std::ostringstream os(std::ios::binary);
diff --git a/src/craftdef.h b/src/craftdef.h
index cebb2d7ae..695ee0c2c 100644
--- a/src/craftdef.h
+++ b/src/craftdef.h
@@ -426,6 +426,10 @@ public:
virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
IGameDef *gamedef, unsigned limit=0) const=0;
+ virtual bool clearCraftRecipesByOutput(const CraftOutput &output, IGameDef *gamedef) = 0;
+ virtual bool clearCraftRecipesByInput(CraftMethod craft_method,
+ unsigned int craft_grid_width, const std::vector<std::string> &recipe, IGameDef *gamedef) = 0;
+
// Print crafting recipes for debugging
virtual std::string dump() const=0;
diff --git a/src/database-dummy.cpp b/src/database-dummy.cpp
index b38db1fb9..ef2148f70 100644
--- a/src/database-dummy.cpp
+++ b/src/database-dummy.cpp
@@ -30,13 +30,16 @@ bool Database_Dummy::saveBlock(const v3s16 &pos, const std::string &data)
return true;
}
-std::string Database_Dummy::loadBlock(const v3s16 &pos)
+void Database_Dummy::loadBlock(const v3s16 &pos, std::string *block)
{
s64 i = getBlockAsInteger(pos);
std::map<s64, std::string>::iterator it = m_database.find(i);
- if (it == m_database.end())
- return "";
- return it->second;
+ if (it == m_database.end()) {
+ *block = "";
+ return;
+ }
+
+ *block = it->second;
}
bool Database_Dummy::deleteBlock(const v3s16 &pos)
diff --git a/src/database-dummy.h b/src/database-dummy.h
index 0cf56928e..72100edd0 100644
--- a/src/database-dummy.h
+++ b/src/database-dummy.h
@@ -28,10 +28,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class Database_Dummy : public Database
{
public:
- virtual bool saveBlock(const v3s16 &pos, const std::string &data);
- virtual std::string loadBlock(const v3s16 &pos);
- virtual bool deleteBlock(const v3s16 &pos);
- virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
+ bool saveBlock(const v3s16 &pos, const std::string &data);
+ void loadBlock(const v3s16 &pos, std::string *block);
+ bool deleteBlock(const v3s16 &pos);
+ void listAllLoadableBlocks(std::vector<v3s16> &dst);
private:
std::map<s64, std::string> m_database;
diff --git a/src/database-leveldb.cpp b/src/database-leveldb.cpp
index acd0fd1eb..4a4904c6a 100644
--- a/src/database-leveldb.cpp
+++ b/src/database-leveldb.cpp
@@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define ENSURE_STATUS_OK(s) \
if (!(s).ok()) { \
- throw FileNotGoodException(std::string("LevelDB error: ") + \
+ throw DatabaseException(std::string("LevelDB error: ") + \
(s).ToString()); \
}
@@ -65,16 +65,13 @@ bool Database_LevelDB::saveBlock(const v3s16 &pos, const std::string &data)
return true;
}
-std::string Database_LevelDB::loadBlock(const v3s16 &pos)
+void Database_LevelDB::loadBlock(const v3s16 &pos, std::string *block)
{
std::string datastr;
leveldb::Status status = m_database->Get(leveldb::ReadOptions(),
i64tos(getBlockAsInteger(pos)), &datastr);
- if(status.ok())
- return datastr;
- else
- return "";
+ *block = (status.ok()) ? datastr : "";
}
bool Database_LevelDB::deleteBlock(const v3s16 &pos)
diff --git a/src/database-leveldb.h b/src/database-leveldb.h
index 4afe2fdc7..3993db0c3 100644
--- a/src/database-leveldb.h
+++ b/src/database-leveldb.h
@@ -34,10 +34,10 @@ public:
Database_LevelDB(const std::string &savedir);
~Database_LevelDB();
- virtual bool saveBlock(const v3s16 &pos, const std::string &data);
- virtual std::string loadBlock(const v3s16 &pos);
- virtual bool deleteBlock(const v3s16 &pos);
- virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
+ bool saveBlock(const v3s16 &pos, const std::string &data);
+ void loadBlock(const v3s16 &pos, std::string *block);
+ bool deleteBlock(const v3s16 &pos);
+ void listAllLoadableBlocks(std::vector<v3s16> &dst);
private:
leveldb::DB *m_database;
diff --git a/src/database-postgresql.cpp b/src/database-postgresql.cpp
new file mode 100644
index 000000000..3b6b42aea
--- /dev/null
+++ b/src/database-postgresql.cpp
@@ -0,0 +1,286 @@
+/*
+Copyright (C) 2016 Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "config.h"
+
+#if USE_POSTGRESQL
+
+#include "database-postgresql.h"
+
+#ifdef _WIN32
+ #ifndef WIN32_LEAN_AND_MEAN
+ #define WIN32_LEAN_AND_MEAN
+ #endif
+ // Without this some of the network functions are not found on mingw
+ #ifndef _WIN32_WINNT
+ #define _WIN32_WINNT 0x0501
+ #endif
+ #include <windows.h>
+ #include <winsock2.h>
+#else
+#include <netinet/in.h>
+#endif
+
+#include "log.h"
+#include "exceptions.h"
+#include "settings.h"
+
+Database_PostgreSQL::Database_PostgreSQL(const Settings &conf) :
+ m_connect_string(""),
+ m_conn(NULL),
+ m_pgversion(0)
+{
+ if (!conf.getNoEx("pgsql_connection", m_connect_string)) {
+ throw SettingNotFoundException(
+ "Set pgsql_connection string in world.mt to "
+ "use the postgresql backend\n"
+ "Notes:\n"
+ "pgsql_connection has the following form: \n"
+ "\tpgsql_connection = host=127.0.0.1 port=5432 user=mt_user "
+ "password=mt_password dbname=minetest_world\n"
+ "mt_user should have CREATE TABLE, INSERT, SELECT, UPDATE and "
+ "DELETE rights on the database.\n"
+ "Don't create mt_user as a SUPERUSER!");
+ }
+
+ connectToDatabase();
+}
+
+Database_PostgreSQL::~Database_PostgreSQL()
+{
+ PQfinish(m_conn);
+}
+
+void Database_PostgreSQL::connectToDatabase()
+{
+ m_conn = PQconnectdb(m_connect_string.c_str());
+
+ if (PQstatus(m_conn) != CONNECTION_OK) {
+ throw DatabaseException(std::string(
+ "PostgreSQL database error: ") +
+ PQerrorMessage(m_conn));
+ }
+
+ m_pgversion = PQserverVersion(m_conn);
+
+ /*
+ * We are using UPSERT feature from PostgreSQL 9.5
+ * to have the better performance,
+ * set the minimum version to 90500
+ */
+ if (m_pgversion < 90500) {
+ throw DatabaseException("PostgreSQL database error: "
+ "Server version 9.5 or greater required.");
+ }
+
+ infostream << "PostgreSQL Database: Version " << m_pgversion
+ << " Connection made." << std::endl;
+
+ createDatabase();
+ initStatements();
+}
+
+void Database_PostgreSQL::verifyDatabase()
+{
+ if (PQstatus(m_conn) == CONNECTION_OK)
+ return;
+
+ PQreset(m_conn);
+ ping();
+}
+
+void Database_PostgreSQL::ping()
+{
+ if (PQping(m_connect_string.c_str()) != PQPING_OK) {
+ throw DatabaseException(std::string(
+ "PostgreSQL database error: ") +
+ PQerrorMessage(m_conn));
+ }
+}
+
+bool Database_PostgreSQL::initialized() const
+{
+ return (PQstatus(m_conn) == CONNECTION_OK);
+}
+
+void Database_PostgreSQL::initStatements()
+{
+ prepareStatement("read_block",
+ "SELECT data FROM blocks "
+ "WHERE posX = $1::int4 AND posY = $2::int4 AND "
+ "posZ = $3::int4");
+
+ prepareStatement("write_block",
+ "INSERT INTO blocks (posX, posY, posZ, data) VALUES "
+ "($1::int4, $2::int4, $3::int4, $4::bytea) "
+ "ON CONFLICT ON CONSTRAINT blocks_pkey DO "
+ "UPDATE SET data = $4::bytea");
+
+ prepareStatement("delete_block", "DELETE FROM blocks WHERE "
+ "posX = $1::int4 AND posY = $2::int4 AND posZ = $3::int4");
+
+ prepareStatement("list_all_loadable_blocks",
+ "SELECT posX, posY, posZ FROM blocks");
+}
+
+PGresult *Database_PostgreSQL::checkResults(PGresult *result, bool clear)
+{
+ ExecStatusType statusType = PQresultStatus(result);
+
+ switch (statusType) {
+ case PGRES_COMMAND_OK:
+ case PGRES_TUPLES_OK:
+ break;
+ case PGRES_FATAL_ERROR:
+ default:
+ throw DatabaseException(
+ std::string("PostgreSQL database error: ") +
+ PQresultErrorMessage(result));
+ }
+
+ if (clear)
+ PQclear(result);
+
+ return result;
+}
+
+void Database_PostgreSQL::createDatabase()
+{
+ PGresult *result = checkResults(PQexec(m_conn,
+ "SELECT relname FROM pg_class WHERE relname='blocks';"),
+ false);
+
+ // If table doesn't exist, create it
+ if (!PQntuples(result)) {
+ static const char* dbcreate_sql = "CREATE TABLE blocks ("
+ "posX INT NOT NULL,"
+ "posY INT NOT NULL,"
+ "posZ INT NOT NULL,"
+ "data BYTEA,"
+ "PRIMARY KEY (posX,posY,posZ)"
+ ");";
+ checkResults(PQexec(m_conn, dbcreate_sql));
+ }
+
+ PQclear(result);
+
+ infostream << "PostgreSQL: Game Database was inited." << std::endl;
+}
+
+
+void Database_PostgreSQL::beginSave()
+{
+ verifyDatabase();
+ checkResults(PQexec(m_conn, "BEGIN;"));
+}
+
+void Database_PostgreSQL::endSave()
+{
+ checkResults(PQexec(m_conn, "COMMIT;"));
+}
+
+bool Database_PostgreSQL::saveBlock(const v3s16 &pos,
+ const std::string &data)
+{
+ // Verify if we don't overflow the platform integer with the mapblock size
+ if (data.size() > INT_MAX) {
+ errorstream << "Database_PostgreSQL::saveBlock: Data truncation! "
+ << "data.size() over 0xFFFF (== " << data.size()
+ << ")" << std::endl;
+ return false;
+ }
+
+ verifyDatabase();
+
+ s32 x, y, z;
+ x = htonl(pos.X);
+ y = htonl(pos.Y);
+ z = htonl(pos.Z);
+
+ const void *args[] = { &x, &y, &z, data.c_str() };
+ const int argLen[] = {
+ sizeof(x), sizeof(y), sizeof(z), (int)data.size()
+ };
+ const int argFmt[] = { 1, 1, 1, 1 };
+
+ execPrepared("write_block", ARRLEN(args), args, argLen, argFmt);
+ return true;
+}
+
+void Database_PostgreSQL::loadBlock(const v3s16 &pos,
+ std::string *block)
+{
+ verifyDatabase();
+
+ s32 x, y, z;
+ x = htonl(pos.X);
+ y = htonl(pos.Y);
+ z = htonl(pos.Z);
+
+ const void *args[] = { &x, &y, &z };
+ const int argLen[] = { sizeof(x), sizeof(y), sizeof(z) };
+ const int argFmt[] = { 1, 1, 1 };
+
+ PGresult *results = execPrepared("read_block", ARRLEN(args), args,
+ argLen, argFmt, false);
+
+ *block = "";
+
+ if (PQntuples(results)) {
+ *block = std::string(PQgetvalue(results, 0, 0),
+ PQgetlength(results, 0, 0));
+ }
+
+ PQclear(results);
+}
+
+bool Database_PostgreSQL::deleteBlock(const v3s16 &pos)
+{
+ verifyDatabase();
+
+ s32 x, y, z;
+ x = htonl(pos.X);
+ y = htonl(pos.Y);
+ z = htonl(pos.Z);
+
+ const void *args[] = { &x, &y, &z };
+ const int argLen[] = { sizeof(x), sizeof(y), sizeof(z) };
+ const int argFmt[] = { 1, 1, 1 };
+
+ execPrepared("read_block", ARRLEN(args), args, argLen, argFmt);
+
+ return true;
+}
+
+void Database_PostgreSQL::listAllLoadableBlocks(std::vector<v3s16> &dst)
+{
+ verifyDatabase();
+
+ PGresult *results = execPrepared("list_all_loadable_blocks", 0,
+ NULL, NULL, NULL, false, false);
+
+ int numrows = PQntuples(results);
+
+ for (int row = 0; row < numrows; ++row) {
+ dst.push_back(pg_to_v3s16(results, 0, 0));
+ }
+
+ PQclear(results);
+}
+
+#endif // USE_POSTGRESQL
diff --git a/src/database-postgresql.h b/src/database-postgresql.h
new file mode 100644
index 000000000..1cfa544e3
--- /dev/null
+++ b/src/database-postgresql.h
@@ -0,0 +1,95 @@
+/*
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef DATABASE_POSTGRESQL_HEADER
+#define DATABASE_POSTGRESQL_HEADER
+
+#include <string>
+#include <libpq-fe.h>
+#include "database.h"
+#include "util/basic_macros.h"
+
+class Settings;
+
+class Database_PostgreSQL : public Database
+{
+public:
+ Database_PostgreSQL(const Settings &conf);
+ ~Database_PostgreSQL();
+
+ void beginSave();
+ void endSave();
+
+ bool saveBlock(const v3s16 &pos, const std::string &data);
+ void loadBlock(const v3s16 &pos, std::string *block);
+ bool deleteBlock(const v3s16 &pos);
+ void listAllLoadableBlocks(std::vector<v3s16> &dst);
+ bool initialized() const;
+
+private:
+ // Database initialization
+ void connectToDatabase();
+ void initStatements();
+ void createDatabase();
+
+ inline void prepareStatement(const std::string &name, const std::string &sql)
+ {
+ checkResults(PQprepare(m_conn, name.c_str(), sql.c_str(), 0, NULL));
+ }
+
+ // Database connectivity checks
+ void ping();
+ void verifyDatabase();
+
+ // Database usage
+ PGresult *checkResults(PGresult *res, bool clear = true);
+
+ inline PGresult *execPrepared(const char *stmtName, const int paramsNumber,
+ const void **params,
+ const int *paramsLengths = NULL, const int *paramsFormats = NULL,
+ bool clear = true, bool nobinary = true)
+ {
+ return checkResults(PQexecPrepared(m_conn, stmtName, paramsNumber,
+ (const char* const*) params, paramsLengths, paramsFormats,
+ nobinary ? 1 : 0), clear);
+ }
+
+ // Conversion helpers
+ inline int pg_to_int(PGresult *res, int row, int col)
+ {
+ return atoi(PQgetvalue(res, row, col));
+ }
+
+ inline v3s16 pg_to_v3s16(PGresult *res, int row, int col)
+ {
+ return v3s16(
+ pg_to_int(res, row, col),
+ pg_to_int(res, row, col + 1),
+ pg_to_int(res, row, col + 2)
+ );
+ }
+
+ // Attributes
+ std::string m_connect_string;
+ PGconn *m_conn;
+ int m_pgversion;
+};
+
+#endif
+
diff --git a/src/database-redis.cpp b/src/database-redis.cpp
index 498e9d39a..3bcedad9b 100644
--- a/src/database-redis.cpp
+++ b/src/database-redis.cpp
@@ -46,11 +46,11 @@ Database_Redis::Database_Redis(Settings &conf)
int port = conf.exists("redis_port") ? conf.getU16("redis_port") : 6379;
ctx = redisConnect(addr, port);
if (!ctx) {
- throw FileNotGoodException("Cannot allocate redis context");
+ throw DatabaseException("Cannot allocate redis context");
} else if (ctx->err) {
std::string err = std::string("Connection error: ") + ctx->errstr;
redisFree(ctx);
- throw FileNotGoodException(err);
+ throw DatabaseException(err);
}
}
@@ -62,7 +62,7 @@ Database_Redis::~Database_Redis()
void Database_Redis::beginSave() {
redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "MULTI"));
if (!reply) {
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Redis command 'MULTI' failed: ") + ctx->errstr);
}
freeReplyObject(reply);
@@ -71,7 +71,7 @@ void Database_Redis::beginSave() {
void Database_Redis::endSave() {
redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "EXEC"));
if (!reply) {
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Redis command 'EXEC' failed: ") + ctx->errstr);
}
freeReplyObject(reply);
@@ -101,42 +101,45 @@ bool Database_Redis::saveBlock(const v3s16 &pos, const std::string &data)
return true;
}
-std::string Database_Redis::loadBlock(const v3s16 &pos)
+void Database_Redis::loadBlock(const v3s16 &pos, std::string *block)
{
std::string tmp = i64tos(getBlockAsInteger(pos));
redisReply *reply = static_cast<redisReply *>(redisCommand(ctx,
"HGET %s %s", hash.c_str(), tmp.c_str()));
if (!reply) {
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Redis command 'HGET %s %s' failed: ") + ctx->errstr);
}
+
switch (reply->type) {
case REDIS_REPLY_STRING: {
- std::string str(reply->str, reply->len);
+ *block = std::string(reply->str, reply->len);
// std::string copies the memory so this won't cause any problems
freeReplyObject(reply);
- return str;
+ return;
}
case REDIS_REPLY_ERROR: {
std::string errstr(reply->str, reply->len);
freeReplyObject(reply);
errorstream << "loadBlock: loading block " << PP(pos)
<< " failed: " << errstr << std::endl;
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Redis command 'HGET %s %s' errored: ") + errstr);
}
case REDIS_REPLY_NIL: {
+ *block = "";
// block not found in database
freeReplyObject(reply);
- return "";
+ return;
}
}
+
errorstream << "loadBlock: loading block " << PP(pos)
<< " returned invalid reply type " << reply->type
<< ": " << std::string(reply->str, reply->len) << std::endl;
freeReplyObject(reply);
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Redis command 'HGET %s %s' gave invalid reply."));
}
@@ -147,7 +150,7 @@ bool Database_Redis::deleteBlock(const v3s16 &pos)
redisReply *reply = static_cast<redisReply *>(redisCommand(ctx,
"HDEL %s %s", hash.c_str(), tmp.c_str()));
if (!reply) {
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Redis command 'HDEL %s %s' failed: ") + ctx->errstr);
} else if (reply->type == REDIS_REPLY_ERROR) {
warningstream << "deleteBlock: deleting block " << PP(pos)
@@ -164,7 +167,7 @@ void Database_Redis::listAllLoadableBlocks(std::vector<v3s16> &dst)
{
redisReply *reply = static_cast<redisReply *>(redisCommand(ctx, "HKEYS %s", hash.c_str()));
if (!reply) {
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Redis command 'HKEYS %s' failed: ") + ctx->errstr);
}
switch (reply->type) {
@@ -176,7 +179,7 @@ void Database_Redis::listAllLoadableBlocks(std::vector<v3s16> &dst)
}
break;
case REDIS_REPLY_ERROR:
- throw FileNotGoodException(std::string(
+ throw DatabaseException(std::string(
"Failed to get keys from database: ") +
std::string(reply->str, reply->len));
}
diff --git a/src/database-redis.h b/src/database-redis.h
index 45e702c83..3addaa20a 100644
--- a/src/database-redis.h
+++ b/src/database-redis.h
@@ -36,13 +36,13 @@ public:
Database_Redis(Settings &conf);
~Database_Redis();
- virtual void beginSave();
- virtual void endSave();
+ void beginSave();
+ void endSave();
- virtual bool saveBlock(const v3s16 &pos, const std::string &data);
- virtual std::string loadBlock(const v3s16 &pos);
- virtual bool deleteBlock(const v3s16 &pos);
- virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
+ bool saveBlock(const v3s16 &pos, const std::string &data);
+ void loadBlock(const v3s16 &pos, std::string *block);
+ bool deleteBlock(const v3s16 &pos);
+ void listAllLoadableBlocks(std::vector<v3s16> &dst);
private:
redisContext *ctx;
diff --git a/src/database-sqlite3.cpp b/src/database-sqlite3.cpp
index 56f937bf2..095d485c0 100644
--- a/src/database-sqlite3.cpp
+++ b/src/database-sqlite3.cpp
@@ -47,7 +47,7 @@ SQLite format specification:
#define SQLRES(s, r, m) \
if ((s) != (r)) { \
- throw FileNotGoodException(std::string(m) + ": " +\
+ throw DatabaseException(std::string(m) + ": " +\
sqlite3_errmsg(m_database)); \
}
#define SQLOK(s, m) SQLRES(s, SQLITE_OK, m)
@@ -56,8 +56,14 @@ SQLite format specification:
SQLOK(sqlite3_prepare_v2(m_database, query, -1, &m_stmt_##name, NULL),\
"Failed to prepare query '" query "'")
-#define FINALIZE_STATEMENT(statement) \
- SQLOK(sqlite3_finalize(statement), "Failed to finalize " #statement)
+#define SQLOK_ERRSTREAM(s, m) \
+ if ((s) != SQLITE_OK) { \
+ errorstream << (m) << ": " \
+ << sqlite3_errmsg(m_database) << std::endl; \
+ }
+
+#define FINALIZE_STATEMENT(statement) SQLOK_ERRSTREAM(sqlite3_finalize(statement), \
+ "Failed to finalize " #statement)
int Database_SQLite3::busyHandler(void *data, int count)
{
@@ -237,7 +243,7 @@ bool Database_SQLite3::saveBlock(const v3s16 &pos, const std::string &data)
return true;
}
-std::string Database_SQLite3::loadBlock(const v3s16 &pos)
+void Database_SQLite3::loadBlock(const v3s16 &pos, std::string *block)
{
verifyDatabase();
@@ -245,20 +251,17 @@ std::string Database_SQLite3::loadBlock(const v3s16 &pos)
if (sqlite3_step(m_stmt_read) != SQLITE_ROW) {
sqlite3_reset(m_stmt_read);
- return "";
+ return;
}
+
const char *data = (const char *) sqlite3_column_blob(m_stmt_read, 0);
size_t len = sqlite3_column_bytes(m_stmt_read, 0);
- std::string s;
- if (data)
- s = std::string(data, len);
+ *block = (data) ? std::string(data, len) : "";
sqlite3_step(m_stmt_read);
// We should never get more than 1 row, so ok to reset
sqlite3_reset(m_stmt_read);
-
- return s;
}
void Database_SQLite3::createDatabase()
@@ -292,6 +295,6 @@ Database_SQLite3::~Database_SQLite3()
FINALIZE_STATEMENT(m_stmt_end)
FINALIZE_STATEMENT(m_stmt_delete)
- SQLOK(sqlite3_close(m_database), "Failed to close database");
+ SQLOK_ERRSTREAM(sqlite3_close(m_database), "Failed to close database");
}
diff --git a/src/database-sqlite3.h b/src/database-sqlite3.h
index 04a1825d9..debbc9d8b 100644
--- a/src/database-sqlite3.h
+++ b/src/database-sqlite3.h
@@ -31,16 +31,16 @@ class Database_SQLite3 : public Database
{
public:
Database_SQLite3(const std::string &savedir);
+ ~Database_SQLite3();
- virtual void beginSave();
- virtual void endSave();
+ void beginSave();
+ void endSave();
- virtual bool saveBlock(const v3s16 &pos, const std::string &data);
- virtual std::string loadBlock(const v3s16 &pos);
- virtual bool deleteBlock(const v3s16 &pos);
- virtual void listAllLoadableBlocks(std::vector<v3s16> &dst);
- virtual bool initialized() const { return m_initialized; }
- ~Database_SQLite3();
+ bool saveBlock(const v3s16 &pos, const std::string &data);
+ void loadBlock(const v3s16 &pos, std::string *block);
+ bool deleteBlock(const v3s16 &pos);
+ void listAllLoadableBlocks(std::vector<v3s16> &dst);
+ bool initialized() const { return m_initialized; }
private:
// Open the database
diff --git a/src/database.h b/src/database.h
index cee7b6fd9..0cf75232f 100644
--- a/src/database.h
+++ b/src/database.h
@@ -38,7 +38,7 @@ public:
virtual void endSave() {}
virtual bool saveBlock(const v3s16 &pos, const std::string &data) = 0;
- virtual std::string loadBlock(const v3s16 &pos) = 0;
+ virtual void loadBlock(const v3s16 &pos, std::string *block) = 0;
virtual bool deleteBlock(const v3s16 &pos) = 0;
static s64 getBlockAsInteger(const v3s16 &pos);
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index e8b652c17..0b4be6322 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -40,6 +40,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("keymap_jump", "KEY_SPACE");
settings->setDefault("keymap_sneak", "KEY_LSHIFT");
settings->setDefault("keymap_drop", "KEY_KEY_Q");
+ settings->setDefault("keymap_zoom", "KEY_KEY_Z");
settings->setDefault("keymap_inventory", "KEY_KEY_I");
settings->setDefault("keymap_special1", "KEY_KEY_E");
settings->setDefault("keymap_chat", "KEY_KEY_T");
@@ -50,7 +51,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("keymap_freemove", "KEY_KEY_K");
settings->setDefault("keymap_fastmove", "KEY_KEY_J");
settings->setDefault("keymap_noclip", "KEY_KEY_H");
- settings->setDefault("keymap_cinematic", "KEY_F8");
+ settings->setDefault("keymap_cinematic", "");
settings->setDefault("keymap_screenshot", "KEY_F12");
settings->setDefault("keymap_toggle_hud", "KEY_F1");
settings->setDefault("keymap_toggle_chat", "KEY_F2");
@@ -74,6 +75,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("always_fly_fast", "true");
settings->setDefault("directional_colored_fog", "true");
settings->setDefault("tooltip_show_delay", "400");
+ settings->setDefault("zoom_fov", "15");
// Some (temporary) keys for debugging
settings->setDefault("keymap_print_debug_stacks", "KEY_KEY_P");
@@ -104,6 +106,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("client_unload_unused_data_timeout", "600");
settings->setDefault("client_mapblock_limit", "5000");
settings->setDefault("enable_fog", "true");
+ settings->setDefault("fog_start", "0.4");
settings->setDefault("fov", "72");
settings->setDefault("view_bobbing", "true");
settings->setDefault("leaves_style", "fancy");
@@ -116,6 +119,9 @@ void set_default_settings(Settings *settings)
settings->setDefault("free_move", "false");
settings->setDefault("noclip", "false");
settings->setDefault("continuous_forward", "false");
+ settings->setDefault("enable_joysticks", "false");
+ settings->setDefault("repeat_joystick_button_time", "0.17");
+ settings->setDefault("joystick_frustum_sensitivity", "170");
settings->setDefault("cinematic", "false");
settings->setDefault("camera_smoothing", "0");
settings->setDefault("cinematic_camera_smoothing", "0.7");
@@ -185,7 +191,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("minimap_shape_round", "true");
settings->setDefault("minimap_double_scan_height", "true");
- settings->setDefault("send_pre_v25_init", "true");
+ settings->setDefault("send_pre_v25_init", "false");
settings->setDefault("curl_timeout", "5000");
settings->setDefault("curl_parallel_limit", "8");
@@ -202,11 +208,13 @@ void set_default_settings(Settings *settings)
settings->setDefault("server_name", "");
settings->setDefault("server_description", "");
+ settings->setDefault("disable_escape_sequences", "false");
+
#if USE_FREETYPE
settings->setDefault("freetype", "true");
settings->setDefault("font_path", porting::getDataPath("fonts" DIR_DELIM "liberationsans.ttf"));
settings->setDefault("font_shadow", "1");
- settings->setDefault("font_shadow_alpha", "128");
+ settings->setDefault("font_shadow_alpha", "127");
settings->setDefault("mono_font_path", porting::getDataPath("fonts" DIR_DELIM "liberationmono.ttf"));
settings->setDefault("fallback_font_path", porting::getDataPath("fonts" DIR_DELIM "DroidSansFallbackFull.ttf"));
@@ -272,12 +280,16 @@ void set_default_settings(Settings *settings)
settings->setDefault("max_simultaneous_block_sends_server_total", "40");
settings->setDefault("max_block_send_distance", "9");
settings->setDefault("max_block_generate_distance", "7");
+ settings->setDefault("block_send_optimize_distance", "4");
settings->setDefault("max_clearobjects_extra_loaded_blocks", "4096");
settings->setDefault("time_send_interval", "5");
settings->setDefault("time_speed", "72");
settings->setDefault("server_unload_unused_data_timeout", "29");
- settings->setDefault("max_objects_per_block", "49");
+ settings->setDefault("max_objects_per_block", "64");
settings->setDefault("server_map_save_interval", "5.3");
+ settings->setDefault("chat_message_max_size", "500");
+ settings->setDefault("chat_message_limit_per_10sec", "8.0");
+ settings->setDefault("chat_message_limit_trigger_kick", "50");
settings->setDefault("sqlite_synchronous", "2");
settings->setDefault("full_block_send_enable_min_time_from_building", "2.0");
settings->setDefault("dedicated_server_step", "0.1");
@@ -315,7 +327,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("liquid_update", "1.0");
//mapgen stuff
- settings->setDefault("mg_name", "v6");
+ settings->setDefault("mg_name", "v7");
settings->setDefault("water_level", "1");
settings->setDefault("chunksize", "5");
settings->setDefault("mg_flags", "dungeons");
diff --git a/src/dungeongen.cpp b/src/dungeongen.cpp
index 5bfc320c9..78573da04 100644
--- a/src/dungeongen.cpp
+++ b/src/dungeongen.cpp
@@ -30,55 +30,67 @@ with this program; if not, write to the Free Software Foundation, Inc.,
//#define DGEN_USE_TORCHES
-NoiseParams nparams_dungeon_rarity(0.0, 1.0, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
-NoiseParams nparams_dungeon_wetness(0.0, 1.0, v3f(40.0, 40.0, 40.0), 32474, 4, 1.1, 2.0);
-NoiseParams nparams_dungeon_density(0.0, 1.0, v3f(2.5, 2.5, 2.5), 0, 2, 1.4, 2.0);
+NoiseParams nparams_dungeon_density(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
+NoiseParams nparams_dungeon_alt_wall(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
///////////////////////////////////////////////////////////////////////////////
-DungeonGen::DungeonGen(Mapgen *mapgen, DungeonParams *dparams)
+DungeonGen::DungeonGen(INodeDefManager *ndef,
+ GenerateNotifier *gennotify, DungeonParams *dparams)
{
- this->mg = mapgen;
- this->vm = mapgen->vm;
+ assert(ndef);
+
+ this->ndef = ndef;
+ this->gennotify = gennotify;
#ifdef DGEN_USE_TORCHES
- c_torch = mg->ndef->getId("default:torch");
+ c_torch = ndef->getId("default:torch");
#endif
if (dparams) {
memcpy(&dp, dparams, sizeof(dp));
} else {
- dp.c_water = mg->ndef->getId("mapgen_water_source");
- dp.c_cobble = mg->ndef->getId("mapgen_cobble");
- dp.c_moss = mg->ndef->getId("mapgen_mossycobble");
- dp.c_stair = mg->ndef->getId("mapgen_stair_cobble");
+ dp.seed = 0;
+
+ dp.c_water = ndef->getId("mapgen_water_source");
+ dp.c_river_water = ndef->getId("mapgen_river_water_source");
+ dp.c_wall = ndef->getId("mapgen_cobble");
+ dp.c_alt_wall = ndef->getId("mapgen_mossycobble");
+ dp.c_stair = ndef->getId("mapgen_stair_cobble");
+
+ if (dp.c_river_water == CONTENT_IGNORE)
+ dp.c_river_water = ndef->getId("mapgen_water_source");
dp.diagonal_dirs = false;
- dp.mossratio = 3.0;
dp.holesize = v3s16(1, 2, 1);
dp.roomsize = v3s16(0, 0, 0);
+ dp.rooms_min = 2;
+ dp.rooms_max = 16;
+ dp.y_min = -MAX_MAP_GENERATION_LIMIT;
+ dp.y_max = MAX_MAP_GENERATION_LIMIT;
dp.notifytype = GENNOTIFY_DUNGEON;
- dp.np_rarity = nparams_dungeon_rarity;
- dp.np_wetness = nparams_dungeon_wetness;
- dp.np_density = nparams_dungeon_density;
+ dp.np_density = nparams_dungeon_density;
+ dp.np_alt_wall = nparams_dungeon_alt_wall;
}
-
- // For mapgens using river water
- dp.c_river_water = mg->ndef->getId("mapgen_river_water_source");
- if (dp.c_river_water == CONTENT_IGNORE)
- dp.c_river_water = mg->ndef->getId("mapgen_water_source");
}
-void DungeonGen::generate(u32 bseed, v3s16 nmin, v3s16 nmax)
+void DungeonGen::generate(MMVManip *vm, u32 bseed, v3s16 nmin, v3s16 nmax)
{
+ assert(vm);
+
//TimeTaker t("gen dungeons");
- if (NoisePerlin3D(&dp.np_rarity, nmin.X, nmin.Y, nmin.Z, mg->seed) < 0.2)
+ if (nmin.Y < dp.y_min || nmax.Y > dp.y_max)
return;
+ float nval_density = NoisePerlin3D(&dp.np_density, nmin.X, nmin.Y, nmin.Z, dp.seed);
+ if (nval_density < 1.0f)
+ return;
+
+ this->vm = vm;
this->blockseed = bseed;
random.seed(bseed + 2);
@@ -99,23 +111,23 @@ void DungeonGen::generate(u32 bseed, v3s16 nmin, v3s16 nmax)
}
}
- // Add it
- makeDungeon(v3s16(1, 1, 1) * MAP_BLOCKSIZE);
+ // Add them
+ for (u32 i = 0; i < floor(nval_density); i++)
+ makeDungeon(v3s16(1, 1, 1) * MAP_BLOCKSIZE);
- // Convert some cobble to mossy cobble
- if (dp.mossratio != 0.0) {
- for (s16 z = nmin.Z; z <= nmax.Z; z++)
- for (s16 y = nmin.Y; y <= nmax.Y; y++) {
- u32 i = vm->m_area.index(nmin.X, y, z);
- for (s16 x = nmin.X; x <= nmax.X; x++) {
- if (vm->m_data[i].getContent() == dp.c_cobble) {
- float wetness = NoisePerlin3D(&dp.np_wetness, x, y, z, mg->seed);
- float density = NoisePerlin3D(&dp.np_density, x, y, z, blockseed);
- if (density < wetness / dp.mossratio)
- vm->m_data[i].setContent(dp.c_moss);
- }
- i++;
+ // Optionally convert some structure to alternative structure
+ if (dp.c_alt_wall == CONTENT_IGNORE)
+ return;
+
+ for (s16 z = nmin.Z; z <= nmax.Z; z++)
+ for (s16 y = nmin.Y; y <= nmax.Y; y++) {
+ u32 i = vm->m_area.index(nmin.X, y, z);
+ for (s16 x = nmin.X; x <= nmax.X; x++) {
+ if (vm->m_data[i].getContent() == dp.c_wall) {
+ if (NoisePerlin3D(&dp.np_alt_wall, x, y, z, blockseed) > 0.0f)
+ vm->m_data[i].setContent(dp.c_alt_wall);
}
+ i++;
}
}
@@ -135,17 +147,23 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
bool fits = false;
for (u32 i = 0; i < 100 && !fits; i++) {
bool is_large_room = ((random.next() & 3) == 1);
- roomsize = is_large_room ?
- v3s16(random.range(8, 16), random.range(8, 16), random.range(8, 16)) :
- v3s16(random.range(4, 8), random.range(4, 6), random.range(4, 8));
+ if (is_large_room) {
+ roomsize.Z = random.range(8, 16);
+ roomsize.Y = random.range(8, 16);
+ roomsize.X = random.range(8, 16);
+ } else {
+ roomsize.Z = random.range(4, 8);
+ roomsize.Y = random.range(4, 6);
+ roomsize.X = random.range(4, 8);
+ }
roomsize += dp.roomsize;
// start_padding is used to disallow starting the generation of
// a dungeon in a neighboring generation chunk
- roomplace = vm->m_area.MinEdge + start_padding + v3s16(
- random.range(0, areasize.X - roomsize.X - start_padding.X),
- random.range(0, areasize.Y - roomsize.Y - start_padding.Y),
- random.range(0, areasize.Z - roomsize.Z - start_padding.Z));
+ roomplace = vm->m_area.MinEdge + start_padding;
+ roomplace.Z += random.range(0, areasize.Z - roomsize.Z - start_padding.Z);
+ roomplace.Y += random.range(0, areasize.Y - roomsize.Y - start_padding.Y);
+ roomplace.X += random.range(0, areasize.X - roomsize.X - start_padding.X);
/*
Check that we're not putting the room to an unknown place,
@@ -175,13 +193,14 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
*/
v3s16 last_room_center = roomplace + v3s16(roomsize.X / 2, 1, roomsize.Z / 2);
- u32 room_count = random.range(2, 16);
+ u32 room_count = random.range(dp.rooms_min, dp.rooms_max);
for (u32 i = 0; i < room_count; i++) {
// Make a room to the determined place
makeRoom(roomsize, roomplace);
v3s16 room_center = roomplace + v3s16(roomsize.X / 2, 1, roomsize.Z / 2);
- mg->gennotify.addEvent(dp.notifytype, room_center);
+ if (gennotify)
+ gennotify->addEvent(dp.notifytype, room_center);
#ifdef DGEN_USE_TORCHES
// Place torch at room center (for testing)
@@ -227,7 +246,9 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
makeCorridor(doorplace, doordir, corridor_end, corridor_end_dir);
// Find a place for a random sized room
- roomsize = v3s16(random.range(4, 8), random.range(4, 6), random.range(4, 8));
+ roomsize.Z = random.range(4, 8);
+ roomsize.Y = random.range(4, 6);
+ roomsize.X = random.range(4, 8);
roomsize += dp.roomsize;
m_pos = corridor_end;
@@ -248,7 +269,7 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
{
- MapNode n_cobble(dp.c_cobble);
+ MapNode n_wall(dp.c_wall);
MapNode n_air(CONTENT_AIR);
// Make +-X walls
@@ -261,7 +282,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
u32 vi = vm->m_area.index(p);
if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
continue;
- vm->m_data[vi] = n_cobble;
+ vm->m_data[vi] = n_wall;
}
{
v3s16 p = roomplace + v3s16(roomsize.X - 1, y, z);
@@ -270,7 +291,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
u32 vi = vm->m_area.index(p);
if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
continue;
- vm->m_data[vi] = n_cobble;
+ vm->m_data[vi] = n_wall;
}
}
@@ -284,7 +305,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
u32 vi = vm->m_area.index(p);
if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
continue;
- vm->m_data[vi] = n_cobble;
+ vm->m_data[vi] = n_wall;
}
{
v3s16 p = roomplace + v3s16(x, y, roomsize.Z - 1);
@@ -293,7 +314,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
u32 vi = vm->m_area.index(p);
if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
continue;
- vm->m_data[vi] = n_cobble;
+ vm->m_data[vi] = n_wall;
}
}
@@ -307,7 +328,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
u32 vi = vm->m_area.index(p);
if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
continue;
- vm->m_data[vi] = n_cobble;
+ vm->m_data[vi] = n_wall;
}
{
v3s16 p = roomplace + v3s16(x,roomsize. Y - 1, z);
@@ -316,7 +337,7 @@ void DungeonGen::makeRoom(v3s16 roomsize, v3s16 roomplace)
u32 vi = vm->m_area.index(p);
if (vm->m_flags[vi] & VMANIP_FLAG_DUNGEON_UNTOUCHABLE)
continue;
- vm->m_data[vi] = n_cobble;
+ vm->m_data[vi] = n_wall;
}
}
@@ -400,7 +421,7 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
makeFill(p + v3s16(-1, -1, -1),
dp.holesize + v3s16(2, 3, 2),
VMANIP_FLAG_DUNGEON_UNTOUCHABLE,
- MapNode(dp.c_cobble),
+ MapNode(dp.c_wall),
0);
makeHole(p);
makeHole(p - dir);
@@ -418,18 +439,18 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
int facedir = dir_to_facedir(dir * make_stairs);
u32 vi = vm->m_area.index(p.X - dir.X, p.Y - 1, p.Z - dir.Z);
- if (vm->m_data[vi].getContent() == dp.c_cobble)
+ if (vm->m_data[vi].getContent() == dp.c_wall)
vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
vi = vm->m_area.index(p.X, p.Y, p.Z);
- if (vm->m_data[vi].getContent() == dp.c_cobble)
+ if (vm->m_data[vi].getContent() == dp.c_wall)
vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
}
} else {
makeFill(p + v3s16(-1, -1, -1),
dp.holesize + v3s16(2, 2, 2),
VMANIP_FLAG_DUNGEON_UNTOUCHABLE,
- MapNode(dp.c_cobble),
+ MapNode(dp.c_wall),
0);
makeHole(p);
}
@@ -471,8 +492,8 @@ bool DungeonGen::findPlaceForDoor(v3s16 &result_place, v3s16 &result_dir)
randomizeDir();
continue;
}
- if (vm->getNodeNoExNoEmerge(p).getContent() == dp.c_cobble &&
- vm->getNodeNoExNoEmerge(p1).getContent() == dp.c_cobble) {
+ if (vm->getNodeNoExNoEmerge(p).getContent() == dp.c_wall &&
+ vm->getNodeNoExNoEmerge(p1).getContent() == dp.c_wall) {
// Found wall, this is a good place!
result_place = p;
result_dir = m_dir;
@@ -485,7 +506,7 @@ bool DungeonGen::findPlaceForDoor(v3s16 &result_place, v3s16 &result_dir)
*/
// Jump one up if the actual space is there
if (vm->getNodeNoExNoEmerge(p +
- v3s16(0, 0, 0)).getContent() == dp.c_cobble &&
+ v3s16(0, 0, 0)).getContent() == dp.c_wall &&
vm->getNodeNoExNoEmerge(p +
v3s16(0, 1, 0)).getContent() == CONTENT_AIR &&
vm->getNodeNoExNoEmerge(p +
@@ -493,7 +514,7 @@ bool DungeonGen::findPlaceForDoor(v3s16 &result_place, v3s16 &result_dir)
p += v3s16(0,1,0);
// Jump one down if the actual space is there
if (vm->getNodeNoExNoEmerge(p +
- v3s16(0, 1, 0)).getContent() == dp.c_cobble &&
+ v3s16(0, 1, 0)).getContent() == dp.c_wall &&
vm->getNodeNoExNoEmerge(p +
v3s16(0, 0, 0)).getContent() == CONTENT_AIR &&
vm->getNodeNoExNoEmerge(p +
@@ -587,7 +608,10 @@ v3s16 rand_ortho_dir(PseudoRandom &random, bool diagonal_dirs)
do {
trycount++;
- dir = v3s16(random.next() % 3 - 1, 0, random.next() % 3 - 1);
+
+ dir.Z = random.next() % 3 - 1;
+ dir.Y = 0;
+ dir.X = random.next() % 3 - 1;
} while ((dir.X == 0 && dir.Z == 0) && trycount < 10);
return dir;
diff --git a/src/dungeongen.h b/src/dungeongen.h
index d209dd4bf..30786b9f3 100644
--- a/src/dungeongen.h
+++ b/src/dungeongen.h
@@ -39,27 +39,33 @@ int dir_to_facedir(v3s16 d);
struct DungeonParams {
+ s32 seed;
+
content_t c_water;
content_t c_river_water;
- content_t c_cobble;
- content_t c_moss;
+ content_t c_wall;
+ content_t c_alt_wall;
content_t c_stair;
- GenNotifyType notifytype;
bool diagonal_dirs;
- float mossratio;
v3s16 holesize;
v3s16 roomsize;
+ u16 rooms_min;
+ u16 rooms_max;
+ s16 y_min;
+ s16 y_max;
+ GenNotifyType notifytype;
- NoiseParams np_rarity;
- NoiseParams np_wetness;
NoiseParams np_density;
+ NoiseParams np_alt_wall;
};
class DungeonGen {
public:
MMVManip *vm;
- Mapgen *mg;
+ INodeDefManager *ndef;
+ GenerateNotifier *gennotify;
+
u32 blockseed;
PseudoRandom random;
v3s16 csize;
@@ -67,17 +73,20 @@ public:
content_t c_torch;
DungeonParams dp;
- //RoomWalker
+ // RoomWalker
v3s16 m_pos;
v3s16 m_dir;
- DungeonGen(Mapgen *mg, DungeonParams *dparams);
- void generate(u32 bseed, v3s16 full_node_min, v3s16 full_node_max);
+ DungeonGen(INodeDefManager *ndef,
+ GenerateNotifier *gennotify, DungeonParams *dparams);
+
+ void generate(MMVManip *vm, u32 bseed,
+ v3s16 full_node_min, v3s16 full_node_max);
void makeDungeon(v3s16 start_padding);
void makeRoom(v3s16 roomsize, v3s16 roomplace);
void makeCorridor(v3s16 doorplace, v3s16 doordir,
- v3s16 &result_place, v3s16 &result_dir);
+ v3s16 &result_place, v3s16 &result_dir);
void makeDoor(v3s16 doorplace, v3s16 doordir);
void makeFill(v3s16 place, v3s16 size, u8 avoid_flags, MapNode n, u8 or_flags);
void makeHole(v3s16 place);
@@ -86,14 +95,13 @@ public:
bool findPlaceForRoomDoor(v3s16 roomsize, v3s16 &result_doorplace,
v3s16 &result_doordir, v3s16 &result_roomplace);
- void randomizeDir()
+ inline void randomizeDir()
{
m_dir = rand_ortho_dir(random, dp.diagonal_dirs);
}
};
-extern NoiseParams nparams_dungeon_rarity;
-extern NoiseParams nparams_dungeon_wetness;
extern NoiseParams nparams_dungeon_density;
+extern NoiseParams nparams_dungeon_alt_wall;
#endif
diff --git a/src/emerge.cpp b/src/emerge.cpp
index 93e8f2b30..25b2e924b 100644
--- a/src/emerge.cpp
+++ b/src/emerge.cpp
@@ -34,13 +34,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "map.h"
#include "mapblock.h"
-#include "mapgen_flat.h"
-#include "mapgen_fractal.h"
-#include "mapgen_v5.h"
-#include "mapgen_v6.h"
-#include "mapgen_v7.h"
-#include "mapgen_valleys.h"
-#include "mapgen_singlenode.h"
#include "mg_biome.h"
#include "mg_ore.h"
#include "mg_decoration.h"
@@ -53,13 +46,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "settings.h"
#include "voxel.h"
-
-struct MapgenDesc {
- const char *name;
- MapgenFactory *factory;
- bool is_user_visible;
-};
-
class EmergeThread : public Thread {
public:
bool enable_mapgen_debug_info;
@@ -100,20 +86,6 @@ private:
};
////
-//// Built-in mapgens
-////
-
-MapgenDesc g_reg_mapgens[] = {
- {"v5", new MapgenFactoryV5, true},
- {"v6", new MapgenFactoryV6, true},
- {"v7", new MapgenFactoryV7, true},
- {"flat", new MapgenFactoryFlat, true},
- {"fractal", new MapgenFactoryFractal, true},
- {"valleys", new MapgenFactoryValleys, true},
- {"singlenode", new MapgenFactorySinglenode, false},
-};
-
-////
//// EmergeManager
////
@@ -181,42 +153,22 @@ EmergeManager::~EmergeManager()
delete oremgr;
delete decomgr;
delete schemmgr;
-
- delete params.sparams;
}
-void EmergeManager::loadMapgenParams()
-{
- params.load(*g_settings);
-}
-
-
-void EmergeManager::initMapgens()
+bool EmergeManager::initMapgens(MapgenParams *params)
{
if (m_mapgens.size())
- return;
-
- MapgenFactory *mgfactory = getMapgenFactory(params.mg_name);
- if (!mgfactory) {
- errorstream << "EmergeManager: mapgen " << params.mg_name <<
- " not registered; falling back to " << DEFAULT_MAPGEN << std::endl;
-
- params.mg_name = DEFAULT_MAPGEN;
+ return false;
- mgfactory = getMapgenFactory(params.mg_name);
- FATAL_ERROR_IF(mgfactory == NULL, "Couldn't use any mapgen!");
- }
-
- if (!params.sparams) {
- params.sparams = mgfactory->createMapgenParams();
- params.sparams->readParams(g_settings);
- }
+ this->mgparams = params;
for (u32 i = 0; i != m_threads.size(); i++) {
- Mapgen *mg = mgfactory->createMapgen(i, &params, this);
+ Mapgen *mg = Mapgen::createMapgen(params->mgtype, i, params, this);
m_mapgens.push_back(mg);
}
+
+ return true;
}
@@ -318,12 +270,14 @@ bool EmergeManager::enqueueBlockEmergeEx(
// Mapgen-related helper functions
//
+
+// TODO(hmmmm): Move this to ServerMap
v3s16 EmergeManager::getContainingChunk(v3s16 blockpos)
{
- return getContainingChunk(blockpos, params.chunksize);
+ return getContainingChunk(blockpos, mgparams->chunksize);
}
-
+// TODO(hmmmm): Move this to ServerMap
v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize)
{
s16 coff = -chunksize / 2;
@@ -357,7 +311,7 @@ int EmergeManager::getGroundLevelAtPoint(v2s16 p)
return m_mapgens[0]->getGroundLevelAtPoint(p);
}
-
+// TODO(hmmmm): Move this to ServerMap
bool EmergeManager::isBlockUnderground(v3s16 blockpos)
{
#if 0
@@ -368,31 +322,9 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos)
#endif
// Use a simple heuristic; the above method is wildly inaccurate anyway.
- return blockpos.Y * (MAP_BLOCKSIZE + 1) <= params.water_level;
+ return blockpos.Y * (MAP_BLOCKSIZE + 1) <= mgparams->water_level;
}
-
-void EmergeManager::getMapgenNames(
- std::vector<const char *> *mgnames, bool include_hidden)
-{
- for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
- if (include_hidden || g_reg_mapgens[i].is_user_visible)
- mgnames->push_back(g_reg_mapgens[i].name);
- }
-}
-
-
-MapgenFactory *EmergeManager::getMapgenFactory(const std::string &mgname)
-{
- for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
- if (mgname == g_reg_mapgens[i].name)
- return g_reg_mapgens[i].factory;
- }
-
- return NULL;
-}
-
-
bool EmergeManager::pushBlockEmergeData(
v3s16 pos,
u16 peer_requested,
@@ -437,12 +369,10 @@ bool EmergeManager::pushBlockEmergeData(
}
-bool EmergeManager::popBlockEmergeData(
- v3s16 pos,
- BlockEmergeData *bedata)
+bool EmergeManager::popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata)
{
std::map<v3s16, BlockEmergeData>::iterator it;
- std::map<u16, u16>::iterator it2;
+ UNORDERED_MAP<u16, u16>::iterator it2;
it = m_blocks_enqueued.find(pos);
if (it == m_blocks_enqueued.end())
@@ -578,13 +508,15 @@ EmergeAction EmergeThread::getBlockOrStartGen(
// 1). Attempt to fetch block from memory
*block = m_map->getBlockNoCreateNoEx(pos);
- if (*block && !(*block)->isDummy() && (*block)->isGenerated())
- return EMERGE_FROM_MEMORY;
-
- // 2). Attempt to load block from disk
- *block = m_map->loadBlock(pos);
- if (*block && (*block)->isGenerated())
- return EMERGE_FROM_DISK;
+ if (*block && !(*block)->isDummy()) {
+ if ((*block)->isGenerated())
+ return EMERGE_FROM_MEMORY;
+ } else {
+ // 2). Attempt to load block from disk if it was not in the memory
+ *block = m_map->loadBlock(pos);
+ if (*block && (*block)->isGenerated())
+ return EMERGE_FROM_DISK;
+ }
// 3). Attempt to start generation
if (allow_gen && m_map->initBlockMake(pos, bmdata))
diff --git a/src/emerge.h b/src/emerge.h
index 825ac1c0f..71ad97da3 100644
--- a/src/emerge.h
+++ b/src/emerge.h
@@ -97,8 +97,16 @@ public:
u32 gen_notify_on;
std::set<u32> gen_notify_on_deco_ids;
- // Map generation parameters
- MapgenParams params;
+ // Parameters passed to mapgens owned by ServerMap
+ // TODO(hmmmm): Remove this after mapgen helper methods using them
+ // are moved to ServerMap
+ MapgenParams *mgparams;
+
+ // Hackish workaround:
+ // For now, EmergeManager must hold onto a ptr to the Map's setting manager
+ // since the Map can only be accessed through the Environment, and the
+ // Environment is not created until after script initialization.
+ MapSettingsManager *map_settings_mgr;
// Managers of various map generation-related components
BiomeManager *biomemgr;
@@ -110,8 +118,7 @@ public:
EmergeManager(IGameDef *gamedef);
~EmergeManager();
- void loadMapgenParams();
- void initMapgens();
+ bool initMapgens(MapgenParams *mgparams);
void startThreads();
void stopThreads();
@@ -140,9 +147,6 @@ public:
int getGroundLevelAtPoint(v2s16 p);
bool isBlockUnderground(v3s16 blockpos);
- static MapgenFactory *getMapgenFactory(const std::string &mgname);
- static void getMapgenNames(
- std::vector<const char *> *mgnames, bool include_hidden);
static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize);
private:
@@ -152,7 +156,7 @@ private:
Mutex m_queue_mutex;
std::map<v3s16, BlockEmergeData> m_blocks_enqueued;
- std::map<u16, u16> m_peer_queue_count;
+ UNORDERED_MAP<u16, u16> m_peer_queue_count;
u16 m_qlimit_total;
u16 m_qlimit_diskonly;
diff --git a/src/environment.cpp b/src/environment.cpp
index 413bc7ff1..13c64b37c 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -69,121 +69,6 @@ Environment::Environment():
Environment::~Environment()
{
- // Deallocate players
- for(std::vector<Player*>::iterator i = m_players.begin();
- i != m_players.end(); ++i) {
- delete (*i);
- }
-}
-
-void Environment::addPlayer(Player *player)
-{
- DSTACK(FUNCTION_NAME);
- /*
- Check that peer_ids are unique.
- Also check that names are unique.
- Exception: there can be multiple players with peer_id=0
- */
- // If peer id is non-zero, it has to be unique.
- if(player->peer_id != 0)
- FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique");
- // Name has to be unique.
- FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique");
- // Add.
- m_players.push_back(player);
-}
-
-void Environment::removePlayer(Player* player)
-{
- for (std::vector<Player*>::iterator it = m_players.begin();
- it != m_players.end(); ++it) {
- if ((*it) == player) {
- delete *it;
- m_players.erase(it);
- return;
- }
- }
-}
-
-Player * Environment::getPlayer(u16 peer_id)
-{
- for(std::vector<Player*>::iterator i = m_players.begin();
- i != m_players.end(); ++i) {
- Player *player = *i;
- if(player->peer_id == peer_id)
- return player;
- }
- return NULL;
-}
-
-Player * Environment::getPlayer(const char *name)
-{
- for(std::vector<Player*>::iterator i = m_players.begin();
- i != m_players.end(); ++i) {
- Player *player = *i;
- if(strcmp(player->getName(), name) == 0)
- return player;
- }
- return NULL;
-}
-
-Player * Environment::getRandomConnectedPlayer()
-{
- std::vector<Player*> connected_players = getPlayers(true);
- u32 chosen_one = myrand() % connected_players.size();
- u32 j = 0;
- for(std::vector<Player*>::iterator
- i = connected_players.begin();
- i != connected_players.end(); ++i) {
- if(j == chosen_one) {
- Player *player = *i;
- return player;
- }
- j++;
- }
- return NULL;
-}
-
-Player * Environment::getNearestConnectedPlayer(v3f pos)
-{
- std::vector<Player*> connected_players = getPlayers(true);
- f32 nearest_d = 0;
- Player *nearest_player = NULL;
- for(std::vector<Player*>::iterator
- i = connected_players.begin();
- i != connected_players.end(); ++i) {
- Player *player = *i;
- f32 d = player->getPosition().getDistanceFrom(pos);
- if(d < nearest_d || nearest_player == NULL) {
- nearest_d = d;
- nearest_player = player;
- }
- }
- return nearest_player;
-}
-
-std::vector<Player*> Environment::getPlayers()
-{
- return m_players;
-}
-
-std::vector<Player*> Environment::getPlayers(bool ignore_disconnected)
-{
- std::vector<Player*> newlist;
- for(std::vector<Player*>::iterator
- i = m_players.begin();
- i != m_players.end(); ++i) {
- Player *player = *i;
-
- if(ignore_disconnected) {
- // Ignore disconnected players
- if(player->peer_id == 0)
- continue;
- }
-
- newlist.push_back(player);
- }
- return newlist;
}
u32 Environment::getDayNightRatio()
@@ -199,11 +84,6 @@ void Environment::setTimeOfDaySpeed(float speed)
m_time_of_day_speed = speed;
}
-float Environment::getTimeOfDaySpeed()
-{
- return m_time_of_day_speed;
-}
-
void Environment::setDayNightRatioOverride(bool enable, u32 value)
{
MutexAutoLock lock(this->m_time_lock);
@@ -609,10 +489,16 @@ ServerEnvironment::~ServerEnvironment()
m_map->drop();
// Delete ActiveBlockModifiers
- for(std::vector<ABMWithState>::iterator
+ for (std::vector<ABMWithState>::iterator
i = m_abms.begin(); i != m_abms.end(); ++i){
delete i->abm;
}
+
+ // Deallocate players
+ for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+ i != m_players.end(); ++i) {
+ delete (*i);
+ }
}
Map & ServerEnvironment::getMap()
@@ -625,6 +511,57 @@ ServerMap & ServerEnvironment::getServerMap()
return *m_map;
}
+RemotePlayer *ServerEnvironment::getPlayer(const u16 peer_id)
+{
+ for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+ i != m_players.end(); ++i) {
+ RemotePlayer *player = *i;
+ if (player->peer_id == peer_id)
+ return player;
+ }
+ return NULL;
+}
+
+RemotePlayer *ServerEnvironment::getPlayer(const char* name)
+{
+ for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+ i != m_players.end(); ++i) {
+ RemotePlayer *player = *i;
+ if (strcmp(player->getName(), name) == 0)
+ return player;
+ }
+ return NULL;
+}
+
+void ServerEnvironment::addPlayer(RemotePlayer *player)
+{
+ DSTACK(FUNCTION_NAME);
+ /*
+ Check that peer_ids are unique.
+ Also check that names are unique.
+ Exception: there can be multiple players with peer_id=0
+ */
+ // If peer id is non-zero, it has to be unique.
+ if (player->peer_id != 0)
+ FATAL_ERROR_IF(getPlayer(player->peer_id) != NULL, "Peer id not unique");
+ // Name has to be unique.
+ FATAL_ERROR_IF(getPlayer(player->getName()) != NULL, "Player name not unique");
+ // Add.
+ m_players.push_back(player);
+}
+
+void ServerEnvironment::removePlayer(RemotePlayer *player)
+{
+ for (std::vector<RemotePlayer *>::iterator it = m_players.begin();
+ it != m_players.end(); ++it) {
+ if ((*it) == player) {
+ delete *it;
+ m_players.erase(it);
+ return;
+ }
+ }
+}
+
bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16 *p)
{
float distance = pos1.getDistanceFrom(pos2);
@@ -655,12 +592,11 @@ bool ServerEnvironment::line_of_sight(v3f pos1, v3f pos2, float stepsize, v3s16
void ServerEnvironment::kickAllPlayers(AccessDeniedCode reason,
const std::string &str_reason, bool reconnect)
{
- for (std::vector<Player*>::iterator it = m_players.begin();
- it != m_players.end();
- ++it) {
- ((Server*)m_gamedef)->DenyAccessVerCompliant((*it)->peer_id,
- (*it)->protocol_version, (AccessDeniedCode)reason,
- str_reason, reconnect);
+ for (std::vector<RemotePlayer *>::iterator it = m_players.begin();
+ it != m_players.end(); ++it) {
+ RemotePlayer *player = dynamic_cast<RemotePlayer *>(*it);
+ ((Server*)m_gamedef)->DenyAccessVerCompliant(player->peer_id,
+ player->protocol_version, reason, str_reason, reconnect);
}
}
@@ -669,12 +605,11 @@ void ServerEnvironment::saveLoadedPlayers()
std::string players_path = m_path_world + DIR_DELIM "players";
fs::CreateDir(players_path);
- for (std::vector<Player*>::iterator it = m_players.begin();
+ for (std::vector<RemotePlayer *>::iterator it = m_players.begin();
it != m_players.end();
++it) {
- RemotePlayer *player = static_cast<RemotePlayer*>(*it);
- if (player->checkModified()) {
- player->save(players_path);
+ if ((*it)->checkModified()) {
+ (*it)->save(players_path, m_gamedef);
}
}
}
@@ -684,19 +619,19 @@ void ServerEnvironment::savePlayer(RemotePlayer *player)
std::string players_path = m_path_world + DIR_DELIM "players";
fs::CreateDir(players_path);
- player->save(players_path);
+ player->save(players_path, m_gamedef);
}
-Player *ServerEnvironment::loadPlayer(const std::string &playername)
+RemotePlayer *ServerEnvironment::loadPlayer(const std::string &playername, PlayerSAO *sao)
{
bool newplayer = false;
bool found = false;
std::string players_path = m_path_world + DIR_DELIM "players" DIR_DELIM;
std::string path = players_path + playername;
- RemotePlayer *player = static_cast<RemotePlayer *>(getPlayer(playername.c_str()));
+ RemotePlayer *player = getPlayer(playername.c_str());
if (!player) {
- player = new RemotePlayer(m_gamedef, "");
+ player = new RemotePlayer("", m_gamedef->idef());
newplayer = true;
}
@@ -705,7 +640,8 @@ Player *ServerEnvironment::loadPlayer(const std::string &playername)
std::ifstream is(path.c_str(), std::ios_base::binary);
if (!is.good())
continue;
- player->deSerialize(is, path);
+
+ player->deSerialize(is, path, sao);
is.close();
if (player->getName() == playername) {
@@ -721,11 +657,13 @@ Player *ServerEnvironment::loadPlayer(const std::string &playername)
<< " not found" << std::endl;
if (newplayer)
delete player;
+
return NULL;
}
- if (newplayer)
+ if (newplayer) {
addPlayer(player);
+ }
player->setModified(false);
return player;
}
@@ -1030,17 +968,17 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime)
m_lbm_mgr.applyLBMs(this, block, stamp);
// Run node timers
- std::map<v3s16, NodeTimer> elapsed_timers =
+ std::vector<NodeTimer> elapsed_timers =
block->m_node_timers.step((float)dtime_s);
- if(!elapsed_timers.empty()){
+ if (!elapsed_timers.empty()) {
MapNode n;
- for(std::map<v3s16, NodeTimer>::iterator
+ for (std::vector<NodeTimer>::iterator
i = elapsed_timers.begin();
i != elapsed_timers.end(); ++i){
- n = block->getNodeNoEx(i->first);
- v3s16 p = i->first + block->getPosRelative();
- if(m_script->node_on_timer(p,n,i->second.elapsed))
- block->setNodeTimer(i->first,NodeTimer(i->second.timeout,0));
+ n = block->getNodeNoEx(i->position);
+ v3s16 p = i->position + block->getPosRelative();
+ if (m_script->node_on_timer(p, n, i->elapsed))
+ block->setNodeTimer(NodeTimer(i->timeout, 0, i->position));
}
}
@@ -1124,14 +1062,12 @@ bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n)
void ServerEnvironment::getObjectsInsideRadius(std::vector<u16> &objects, v3f pos, float radius)
{
- for(std::map<u16, ServerActiveObject*>::iterator
- i = m_active_objects.begin();
- i != m_active_objects.end(); ++i)
- {
+ for (ActiveObjectMap::iterator i = m_active_objects.begin();
+ i != m_active_objects.end(); ++i) {
ServerActiveObject* obj = i->second;
u16 id = i->first;
v3f objectpos = obj->getBasePosition();
- if(objectpos.getDistanceFrom(pos) > radius)
+ if (objectpos.getDistanceFrom(pos) > radius)
continue;
objects.push_back(id);
}
@@ -1142,8 +1078,7 @@ void ServerEnvironment::clearObjects(ClearObjectsMode mode)
infostream << "ServerEnvironment::clearObjects(): "
<< "Removing all active objects" << std::endl;
std::vector<u16> objects_to_remove;
- for (std::map<u16, ServerActiveObject*>::iterator
- i = m_active_objects.begin();
+ for (ActiveObjectMap::iterator i = m_active_objects.begin();
i != m_active_objects.end(); ++i) {
ServerActiveObject* obj = i->second;
if (obj->getType() == ACTIVEOBJECT_TYPE_PLAYER)
@@ -1311,10 +1246,10 @@ void ServerEnvironment::step(float dtime)
*/
{
ScopeProfiler sp(g_profiler, "SEnv: handle players avg", SPT_AVG);
- for(std::vector<Player*>::iterator i = m_players.begin();
- i != m_players.end(); ++i)
- {
- Player *player = *i;
+ for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
+ i != m_players.end(); ++i) {
+ RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i);
+ assert(player);
// Ignore disconnected players
if(player->peer_id == 0)
@@ -1334,16 +1269,20 @@ void ServerEnvironment::step(float dtime)
Get player block positions
*/
std::vector<v3s16> players_blockpos;
- for(std::vector<Player*>::iterator
- i = m_players.begin();
+ for (std::vector<RemotePlayer *>::iterator i = m_players.begin();
i != m_players.end(); ++i) {
- Player *player = *i;
+ RemotePlayer *player = dynamic_cast<RemotePlayer *>(*i);
+ assert(player);
+
// Ignore disconnected players
- if(player->peer_id == 0)
+ if (player->peer_id == 0)
continue;
+ PlayerSAO *playersao = player->getPlayerSAO();
+ assert(playersao);
+
v3s16 blockpos = getNodeBlockPos(
- floatToInt(player->getPosition(), BS));
+ floatToInt(playersao->getBasePosition(), BS));
players_blockpos.push_back(blockpos);
}
@@ -1434,17 +1373,18 @@ void ServerEnvironment::step(float dtime)
MOD_REASON_BLOCK_EXPIRED);
// Run node timers
- std::map<v3s16, NodeTimer> elapsed_timers =
+ std::vector<NodeTimer> elapsed_timers =
block->m_node_timers.step((float)dtime);
- if(!elapsed_timers.empty()){
+ if (!elapsed_timers.empty()) {
MapNode n;
- for(std::map<v3s16, NodeTimer>::iterator
- i = elapsed_timers.begin();
- i != elapsed_timers.end(); ++i){
- n = block->getNodeNoEx(i->first);
- p = i->first + block->getPosRelative();
- if(m_script->node_on_timer(p,n,i->second.elapsed))
- block->setNodeTimer(i->first,NodeTimer(i->second.timeout,0));
+ for (std::vector<NodeTimer>::iterator i = elapsed_timers.begin();
+ i != elapsed_timers.end(); ++i) {
+ n = block->getNodeNoEx(i->position);
+ p = i->position + block->getPosRelative();
+ if (m_script->node_on_timer(p, n, i->elapsed)) {
+ block->setNodeTimer(NodeTimer(
+ i->timeout, 0, i->position));
+ }
}
}
}
@@ -1516,10 +1456,8 @@ void ServerEnvironment::step(float dtime)
send_recommended = true;
}
- for(std::map<u16, ServerActiveObject*>::iterator
- i = m_active_objects.begin();
- i != m_active_objects.end(); ++i)
- {
+ for(ActiveObjectMap::iterator i = m_active_objects.begin();
+ i != m_active_objects.end(); ++i) {
ServerActiveObject* obj = i->second;
// Don't step if is to be removed or stored statically
if(obj->m_removed || obj->m_pending_deactivation)
@@ -1552,7 +1490,7 @@ void ServerEnvironment::step(float dtime)
Manage particle spawner expiration
*/
if (m_particle_management_interval.step(dtime, 1.0)) {
- for (std::map<u32, float>::iterator i = m_particle_spawners.begin();
+ for (UNORDERED_MAP<u32, float>::iterator i = m_particle_spawners.begin();
i != m_particle_spawners.end(); ) {
//non expiring spawners
if (i->second == PARTICLE_SPAWNER_NO_EXPIRY) {
@@ -1577,8 +1515,7 @@ u32 ServerEnvironment::addParticleSpawner(float exptime)
u32 id = 0;
for (;;) { // look for unused particlespawner id
id++;
- std::map<u32, float>::iterator f;
- f = m_particle_spawners.find(id);
+ UNORDERED_MAP<u32, float>::iterator f = m_particle_spawners.find(id);
if (f == m_particle_spawners.end()) {
m_particle_spawners[id] = time;
break;
@@ -1587,31 +1524,45 @@ u32 ServerEnvironment::addParticleSpawner(float exptime)
return id;
}
-void ServerEnvironment::deleteParticleSpawner(u32 id)
+u32 ServerEnvironment::addParticleSpawner(float exptime, u16 attached_id)
+{
+ u32 id = addParticleSpawner(exptime);
+ m_particle_spawner_attachments[id] = attached_id;
+ if (ServerActiveObject *obj = getActiveObject(attached_id)) {
+ obj->attachParticleSpawner(id);
+ }
+ return id;
+}
+
+void ServerEnvironment::deleteParticleSpawner(u32 id, bool remove_from_object)
{
m_particle_spawners.erase(id);
+ UNORDERED_MAP<u32, u16>::iterator it = m_particle_spawner_attachments.find(id);
+ if (it != m_particle_spawner_attachments.end()) {
+ u16 obj_id = (*it).second;
+ ServerActiveObject *sao = getActiveObject(obj_id);
+ if (sao != NULL && remove_from_object) {
+ sao->detachParticleSpawner(id);
+ }
+ m_particle_spawner_attachments.erase(id);
+ }
}
ServerActiveObject* ServerEnvironment::getActiveObject(u16 id)
{
- std::map<u16, ServerActiveObject*>::iterator n;
- n = m_active_objects.find(id);
- if(n == m_active_objects.end())
- return NULL;
- return n->second;
+ ActiveObjectMap::iterator n = m_active_objects.find(id);
+ return (n != m_active_objects.end() ? n->second : NULL);
}
-bool isFreeServerActiveObjectId(u16 id,
- std::map<u16, ServerActiveObject*> &objects)
+bool isFreeServerActiveObjectId(u16 id, ActiveObjectMap &objects)
{
- if(id == 0)
+ if (id == 0)
return false;
return objects.find(id) == objects.end();
}
-u16 getFreeServerActiveObjectId(
- std::map<u16, ServerActiveObject*> &objects)
+u16 getFreeServerActiveObjectId(ActiveObjectMap &objects)
{
//try to reuse id's as late as possible
static u16 last_used_id = 0;
@@ -1639,7 +1590,7 @@ u16 ServerEnvironment::addActiveObject(ServerActiveObject *object)
Finds out what new objects have been added to
inside a radius around a position
*/
-void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
+void ServerEnvironment::getAddedActiveObjects(PlayerSAO *playersao, s16 radius,
s16 player_radius,
std::set<u16> &current_objects,
std::queue<u16> &added_objects)
@@ -1649,7 +1600,6 @@ void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
if (player_radius_f < 0)
player_radius_f = 0;
-
/*
Go through the object list,
- discard m_removed objects,
@@ -1657,21 +1607,21 @@ void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
- discard objects that are found in current_objects.
- add remaining objects to added_objects
*/
- for(std::map<u16, ServerActiveObject*>::iterator
- i = m_active_objects.begin();
+ for (ActiveObjectMap::iterator i = m_active_objects.begin();
i != m_active_objects.end(); ++i) {
u16 id = i->first;
// Get object
ServerActiveObject *object = i->second;
- if(object == NULL)
+ if (object == NULL)
continue;
// Discard if removed or deactivating
if(object->m_removed || object->m_pending_deactivation)
continue;
- f32 distance_f = object->getBasePosition().getDistanceFrom(player->getPosition());
+ f32 distance_f = object->getBasePosition().
+ getDistanceFrom(playersao->getBasePosition());
if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
// Discard if too far
if (distance_f > player_radius_f && player_radius_f != 0)
@@ -1693,7 +1643,7 @@ void ServerEnvironment::getAddedActiveObjects(Player *player, s16 radius,
Finds out what objects have been removed from
inside a radius around a position
*/
-void ServerEnvironment::getRemovedActiveObjects(Player *player, s16 radius,
+void ServerEnvironment::getRemovedActiveObjects(PlayerSAO *playersao, s16 radius,
s16 player_radius,
std::set<u16> &current_objects,
std::queue<u16> &removed_objects)
@@ -1703,7 +1653,6 @@ void ServerEnvironment::getRemovedActiveObjects(Player *player, s16 radius,
if (player_radius_f < 0)
player_radius_f = 0;
-
/*
Go through current_objects; object is removed if:
- object is not found in m_active_objects (this is actually an
@@ -1731,7 +1680,7 @@ void ServerEnvironment::getRemovedActiveObjects(Player *player, s16 radius,
continue;
}
- f32 distance_f = object->getBasePosition().getDistanceFrom(player->getPosition());
+ f32 distance_f = object->getBasePosition().getDistanceFrom(playersao->getBasePosition());
if (object->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
if (distance_f <= player_radius_f || player_radius_f == 0)
continue;
@@ -1754,8 +1703,7 @@ void ServerEnvironment::setStaticForActiveObjectsInBlock(
so_it = block->m_static_objects.m_active.begin();
so_it != block->m_static_objects.m_active.end(); ++so_it) {
// Get the ServerActiveObject counterpart to this StaticObject
- std::map<u16, ServerActiveObject *>::iterator ao_it;
- ao_it = m_active_objects.find(so_it->first);
+ ActiveObjectMap::iterator ao_it = m_active_objects.find(so_it->first);
if (ao_it == m_active_objects.end()) {
// If this ever happens, there must be some kind of nasty bug.
errorstream << "ServerEnvironment::setStaticForObjectsInBlock(): "
@@ -1804,8 +1752,8 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
verbosestream<<"ServerEnvironment::addActiveObjectRaw(): "
<<"supplied with id "<<object->getId()<<std::endl;
}
- if(isFreeServerActiveObjectId(object->getId(), m_active_objects) == false)
- {
+
+ if(!isFreeServerActiveObjectId(object->getId(), m_active_objects)) {
errorstream<<"ServerEnvironment::addActiveObjectRaw(): "
<<"id is not free ("<<object->getId()<<")"<<std::endl;
if(object->environmentDeletes())
@@ -1873,8 +1821,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
void ServerEnvironment::removeRemovedObjects()
{
std::vector<u16> objects_to_remove;
- for(std::map<u16, ServerActiveObject*>::iterator
- i = m_active_objects.begin();
+ for(ActiveObjectMap::iterator i = m_active_objects.begin();
i != m_active_objects.end(); ++i) {
u16 id = i->first;
ServerActiveObject* obj = i->second;
@@ -1892,7 +1839,7 @@ void ServerEnvironment::removeRemovedObjects()
We will delete objects that are marked as removed or thatare
waiting for deletion after deactivation
*/
- if(obj->m_removed == false && obj->m_pending_deactivation == false)
+ if (!obj->m_removed && !obj->m_pending_deactivation)
continue;
/*
@@ -2092,8 +2039,7 @@ void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s)
void ServerEnvironment::deactivateFarObjects(bool force_delete)
{
std::vector<u16> objects_to_remove;
- for(std::map<u16, ServerActiveObject*>::iterator
- i = m_active_objects.begin();
+ for(ActiveObjectMap::iterator i = m_active_objects.begin();
i != m_active_objects.end(); ++i) {
ServerActiveObject* obj = i->second;
assert(obj);
@@ -2234,13 +2180,13 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
if(block)
{
- if(block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")){
- errorstream<<"ServerEnv: Trying to store id="<<obj->getId()
- <<" statically but block "<<PP(blockpos)
- <<" already contains "
- <<block->m_static_objects.m_stored.size()
- <<" objects."
- <<" Forcing delete."<<std::endl;
+ if (block->m_static_objects.m_stored.size() >= g_settings->getU16("max_objects_per_block")) {
+ warningstream << "ServerEnv: Trying to store id = " << obj->getId()
+ << " statically but block " << PP(blockpos)
+ << " already contains "
+ << block->m_static_objects.m_stored.size()
+ << " objects."
+ << " Forcing delete." << std::endl;
force_delete = true;
} else {
// If static counterpart already exists in target block,
@@ -2329,6 +2275,7 @@ ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr,
ITextureSource *texturesource, IGameDef *gamedef,
IrrlichtDevice *irr):
m_map(map),
+ m_local_player(NULL),
m_smgr(smgr),
m_texturesource(texturesource),
m_gamedef(gamedef),
@@ -2341,10 +2288,8 @@ ClientEnvironment::ClientEnvironment(ClientMap *map, scene::ISceneManager *smgr,
ClientEnvironment::~ClientEnvironment()
{
// delete active objects
- for(std::map<u16, ClientActiveObject*>::iterator
- i = m_active_objects.begin();
- i != m_active_objects.end(); ++i)
- {
+ for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin();
+ i != m_active_objects.end(); ++i) {
delete i->second;
}
@@ -2367,28 +2312,16 @@ ClientMap & ClientEnvironment::getClientMap()
return *m_map;
}
-void ClientEnvironment::addPlayer(Player *player)
+void ClientEnvironment::setLocalPlayer(LocalPlayer *player)
{
DSTACK(FUNCTION_NAME);
/*
- It is a failure if player is local and there already is a local
- player
+ It is a failure if already is a local player
*/
- FATAL_ERROR_IF(player->isLocal() == true && getLocalPlayer() != NULL,
- "Player is local but there is already a local player");
+ FATAL_ERROR_IF(m_local_player != NULL,
+ "Local player already allocated");
- Environment::addPlayer(player);
-}
-
-LocalPlayer * ClientEnvironment::getLocalPlayer()
-{
- for(std::vector<Player*>::iterator i = m_players.begin();
- i != m_players.end(); ++i) {
- Player *player = *i;
- if(player->isLocal())
- return (LocalPlayer*)player;
- }
- return NULL;
+ m_local_player = player;
}
void ClientEnvironment::step(float dtime)
@@ -2469,11 +2402,11 @@ void ClientEnvironment::step(float dtime)
{
// Apply physics
- if(free_move == false && is_climbing == false)
+ if(!free_move && !is_climbing)
{
// Gravity
v3f speed = lplayer->getSpeed();
- if(lplayer->in_liquid == false)
+ if(!lplayer->in_liquid)
speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2;
// Liquid floating / sinking
@@ -2625,23 +2558,6 @@ void ClientEnvironment::step(float dtime)
}
}
- /*
- Stuff that can be done in an arbitarily large dtime
- */
- for(std::vector<Player*>::iterator i = m_players.begin();
- i != m_players.end(); ++i) {
- Player *player = *i;
-
- /*
- Handle non-local players
- */
- if(player->isLocal() == false) {
- // Move
- player->move(dtime, this, 100*BS);
-
- }
- }
-
// Update lighting on local player (used for wield item)
u32 day_night_ratio = getDayNightRatio();
{
@@ -2666,10 +2582,8 @@ void ClientEnvironment::step(float dtime)
g_profiler->avg("CEnv: num of objects", m_active_objects.size());
bool update_lighting = m_active_object_light_update_interval.step(dtime, 0.21);
- for(std::map<u16, ClientActiveObject*>::iterator
- i = m_active_objects.begin();
- i != m_active_objects.end(); ++i)
- {
+ for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin();
+ i != m_active_objects.end(); ++i) {
ClientActiveObject* obj = i->second;
// Step object
obj->step(dtime, this);
@@ -2728,15 +2642,14 @@ GenericCAO* ClientEnvironment::getGenericCAO(u16 id)
ClientActiveObject* ClientEnvironment::getActiveObject(u16 id)
{
- std::map<u16, ClientActiveObject*>::iterator n;
- n = m_active_objects.find(id);
- if(n == m_active_objects.end())
+ UNORDERED_MAP<u16, ClientActiveObject*>::iterator n = m_active_objects.find(id);
+ if (n == m_active_objects.end())
return NULL;
return n->second;
}
-bool isFreeClientActiveObjectId(u16 id,
- std::map<u16, ClientActiveObject*> &objects)
+bool isFreeClientActiveObjectId(const u16 id,
+ UNORDERED_MAP<u16, ClientActiveObject*> &objects)
{
if(id == 0)
return false;
@@ -2744,19 +2657,17 @@ bool isFreeClientActiveObjectId(u16 id,
return objects.find(id) == objects.end();
}
-u16 getFreeClientActiveObjectId(
- std::map<u16, ClientActiveObject*> &objects)
+u16 getFreeClientActiveObjectId(UNORDERED_MAP<u16, ClientActiveObject*> &objects)
{
//try to reuse id's as late as possible
static u16 last_used_id = 0;
u16 startid = last_used_id;
- for(;;)
- {
+ for(;;) {
last_used_id ++;
- if(isFreeClientActiveObjectId(last_used_id, objects))
+ if (isFreeClientActiveObjectId(last_used_id, objects))
return last_used_id;
- if(last_used_id == startid)
+ if (last_used_id == startid)
return 0;
}
}
@@ -2776,8 +2687,7 @@ u16 ClientEnvironment::addActiveObject(ClientActiveObject *object)
}
object->setId(new_id);
}
- if(isFreeClientActiveObjectId(object->getId(), m_active_objects) == false)
- {
+ if (!isFreeClientActiveObjectId(object->getId(), m_active_objects)) {
infostream<<"ClientEnvironment::addActiveObject(): "
<<"id is not free ("<<object->getId()<<")"<<std::endl;
delete object;
@@ -2841,8 +2751,7 @@ void ClientEnvironment::removeActiveObject(u16 id)
verbosestream<<"ClientEnvironment::removeActiveObject(): "
<<"id="<<id<<std::endl;
ClientActiveObject* obj = getActiveObject(id);
- if(obj == NULL)
- {
+ if (obj == NULL) {
infostream<<"ClientEnvironment::removeActiveObject(): "
<<"id="<<id<<" not found"<<std::endl;
return;
@@ -2910,10 +2819,8 @@ void ClientEnvironment::updateLocalPlayerBreath(u16 breath)
void ClientEnvironment::getActiveObjects(v3f origin, f32 max_d,
std::vector<DistanceSortedActiveObject> &dest)
{
- for(std::map<u16, ClientActiveObject*>::iterator
- i = m_active_objects.begin();
- i != m_active_objects.end(); ++i)
- {
+ for (UNORDERED_MAP<u16, ClientActiveObject*>::iterator i = m_active_objects.begin();
+ i != m_active_objects.end(); ++i) {
ClientActiveObject* obj = i->second;
f32 d = (obj->getPosition() - origin).getLength();
diff --git a/src/environment.h b/src/environment.h
index c6786faed..4bee40e57 100644
--- a/src/environment.h
+++ b/src/environment.h
@@ -54,6 +54,7 @@ class ClientMap;
class GameScripting;
class Player;
class RemotePlayer;
+class PlayerSAO;
class Environment
{
@@ -72,15 +73,6 @@ public:
virtual Map & getMap() = 0;
- virtual void addPlayer(Player *player);
- void removePlayer(Player *player);
- Player * getPlayer(u16 peer_id);
- Player * getPlayer(const char *name);
- Player * getRandomConnectedPlayer();
- Player * getNearestConnectedPlayer(v3f pos);
- std::vector<Player*> getPlayers();
- std::vector<Player*> getPlayers(bool ignore_disconnected);
-
u32 getDayNightRatio();
// 0-23999
@@ -91,7 +83,6 @@ public:
void stepTimeOfDay(float dtime);
void setTimeOfDaySpeed(float speed);
- float getTimeOfDaySpeed();
void setDayNightRatioOverride(bool enable, u32 value);
@@ -101,9 +92,6 @@ public:
u32 m_added_objects;
protected:
- // peer_ids in here should be unique, except that there may be many 0s
- std::vector<Player*> m_players;
-
GenericAtomic<float> m_time_of_day_speed;
/*
@@ -300,6 +288,8 @@ enum ClearObjectsMode {
This is not thread-safe. Server uses an environment mutex.
*/
+typedef UNORDERED_MAP<u16, ServerActiveObject *> ActiveObjectMap;
+
class ServerEnvironment : public Environment
{
public:
@@ -326,7 +316,9 @@ public:
// Save players
void saveLoadedPlayers();
void savePlayer(RemotePlayer *player);
- Player *loadPlayer(const std::string &playername);
+ RemotePlayer *loadPlayer(const std::string &playername, PlayerSAO *sao);
+ void addPlayer(RemotePlayer *player);
+ void removePlayer(RemotePlayer *player);
/*
Save and load time of day and game timer
@@ -338,7 +330,8 @@ public:
void loadDefaultMeta();
u32 addParticleSpawner(float exptime);
- void deleteParticleSpawner(u32 id);
+ u32 addParticleSpawner(float exptime, u16 attached_id);
+ void deleteParticleSpawner(u32 id, bool remove_from_object = true);
/*
External ActiveObject interface
@@ -370,7 +363,7 @@ public:
Find out what new objects have been added to
inside a radius around a position
*/
- void getAddedActiveObjects(Player *player, s16 radius,
+ void getAddedActiveObjects(PlayerSAO *playersao, s16 radius,
s16 player_radius,
std::set<u16> &current_objects,
std::queue<u16> &added_objects);
@@ -379,7 +372,7 @@ public:
Find out what new objects have been removed from
inside a radius around a position
*/
- void getRemovedActiveObjects(Player* player, s16 radius,
+ void getRemovedActiveObjects(PlayerSAO *playersao, s16 radius,
s16 player_radius,
std::set<u16> &current_objects,
std::queue<u16> &removed_objects);
@@ -438,6 +431,8 @@ public:
void setStaticForActiveObjectsInBlock(v3s16 blockpos,
bool static_exists, v3s16 static_block=v3s16(0,0,0));
+ RemotePlayer *getPlayer(const u16 peer_id);
+ RemotePlayer *getPlayer(const char* name);
private:
/*
@@ -491,7 +486,7 @@ private:
// World path
const std::string m_path_world;
// Active object list
- std::map<u16, ServerActiveObject*> m_active_objects;
+ ActiveObjectMap m_active_objects;
// Outgoing network message buffer for active objects
std::queue<ActiveObjectMessage> m_active_object_messages;
// Some timers
@@ -520,9 +515,13 @@ private:
// Can raise to high values like 15s with eg. map generation mods.
float m_max_lag_estimate;
+ // peer_ids in here should be unique, except that there may be many 0s
+ std::vector<RemotePlayer*> m_players;
+
// Particles
IntervalLimiter m_particle_management_interval;
- std::map<u32, float> m_particle_spawners;
+ UNORDERED_MAP<u32, float> m_particle_spawners;
+ UNORDERED_MAP<u32, u16> m_particle_spawner_attachments;
};
#ifndef SERVER
@@ -579,8 +578,8 @@ public:
void step(f32 dtime);
- virtual void addPlayer(Player *player);
- LocalPlayer * getLocalPlayer();
+ virtual void setLocalPlayer(LocalPlayer *player);
+ LocalPlayer *getLocalPlayer() { return m_local_player; }
/*
ClientSimpleObjects
@@ -630,24 +629,20 @@ public:
u16 attachement_parent_ids[USHRT_MAX + 1];
- std::list<std::string> getPlayerNames()
- { return m_player_names; }
- void addPlayerName(std::string name)
- { m_player_names.push_back(name); }
- void removePlayerName(std::string name)
- { m_player_names.remove(name); }
+ const std::list<std::string> &getPlayerNames() { return m_player_names; }
+ void addPlayerName(const std::string &name) { m_player_names.push_back(name); }
+ void removePlayerName(const std::string &name) { m_player_names.remove(name); }
void updateCameraOffset(v3s16 camera_offset)
{ m_camera_offset = camera_offset; }
- v3s16 getCameraOffset()
- { return m_camera_offset; }
-
+ v3s16 getCameraOffset() const { return m_camera_offset; }
private:
ClientMap *m_map;
+ LocalPlayer *m_local_player;
scene::ISceneManager *m_smgr;
ITextureSource *m_texturesource;
IGameDef *m_gamedef;
IrrlichtDevice *m_irr;
- std::map<u16, ClientActiveObject*> m_active_objects;
+ UNORDERED_MAP<u16, ClientActiveObject*> m_active_objects;
std::vector<ClientSimpleObject*> m_simple_objects;
std::queue<ClientEnvEvent> m_client_event_queue;
IntervalLimiter m_active_object_light_update_interval;
diff --git a/src/exceptions.h b/src/exceptions.h
index 4f18f70d9..67a2d0df6 100644
--- a/src/exceptions.h
+++ b/src/exceptions.h
@@ -65,6 +65,11 @@ public:
FileNotGoodException(const std::string &s): BaseException(s) {}
};
+class DatabaseException : public BaseException {
+public:
+ DatabaseException(const std::string &s): BaseException(s) {}
+};
+
class SerializationError : public BaseException {
public:
SerializationError(const std::string &s): BaseException(s) {}
diff --git a/src/filesys.cpp b/src/filesys.cpp
index b4c52ab79..bd8b94aff 100644
--- a/src/filesys.cpp
+++ b/src/filesys.cpp
@@ -617,48 +617,51 @@ std::string RemoveRelativePathComponents(std::string path)
{
size_t pos = path.size();
size_t dotdot_count = 0;
- while(pos != 0){
+ while (pos != 0) {
size_t component_with_delim_end = pos;
// skip a dir delimiter
- while(pos != 0 && IsDirDelimiter(path[pos-1]))
+ while (pos != 0 && IsDirDelimiter(path[pos-1]))
pos--;
// strip a path component
size_t component_end = pos;
- while(pos != 0 && !IsDirDelimiter(path[pos-1]))
+ while (pos != 0 && !IsDirDelimiter(path[pos-1]))
pos--;
size_t component_start = pos;
std::string component = path.substr(component_start,
component_end - component_start);
bool remove_this_component = false;
- if(component == "."){
+ if (component == ".") {
remove_this_component = true;
- }
- else if(component == ".."){
+ } else if (component == "..") {
remove_this_component = true;
dotdot_count += 1;
- }
- else if(dotdot_count != 0){
+ } else if (dotdot_count != 0) {
remove_this_component = true;
dotdot_count -= 1;
}
- if(remove_this_component){
- while(pos != 0 && IsDirDelimiter(path[pos-1]))
+ if (remove_this_component) {
+ while (pos != 0 && IsDirDelimiter(path[pos-1]))
pos--;
- path = path.substr(0, pos) + DIR_DELIM +
- path.substr(component_with_delim_end,
- std::string::npos);
- pos++;
+ if (component_start == 0) {
+ // We need to remove the delemiter too
+ path = path.substr(component_with_delim_end, std::string::npos);
+ } else {
+ path = path.substr(0, pos) + DIR_DELIM +
+ path.substr(component_with_delim_end, std::string::npos);
+ }
+ if (pos > 0)
+ pos++;
}
}
- if(dotdot_count > 0)
+ if (dotdot_count > 0)
return "";
// remove trailing dir delimiters
pos = path.size();
- while(pos != 0 && IsDirDelimiter(path[pos-1]))
+ while (pos != 0 && IsDirDelimiter(path[pos-1]))
pos--;
return path.substr(0, pos);
}
diff --git a/src/game.cpp b/src/game.cpp
index 23f261cfd..966c23073 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -23,6 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "camera.h"
#include "client.h"
#include "client/tile.h" // For TextureSource
+#include "client/keys.h"
+#include "client/joystick_controller.h"
#include "clientmap.h"
#include "clouds.h"
#include "config.h"
@@ -55,6 +57,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "tool.h"
#include "util/directiontables.h"
#include "util/pointedthing.h"
+#include "irrlicht_changes/static_text.h"
#include "version.h"
#include "minimap.h"
#include "mapblock_mesh.h"
@@ -359,6 +362,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
min_distance = (selected_object->getPosition() - camera_position).getLength();
+ hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0));
result.type = POINTEDTHING_OBJECT;
result.object_id = selected_object->getId();
}
@@ -470,6 +474,7 @@ PointedThing getPointedThing(Client *client, Hud *hud, const v3f &player_positio
if (!facebox.intersectsWithLine(shootline))
continue;
result.node_abovesurface = pointed_pos + facedir;
+ hud->setSelectedFaceNormal(v3f(facedir.X, facedir.Y, facedir.Z));
face_min_distance = distance;
}
}
@@ -537,7 +542,7 @@ void update_profiler_gui(gui::IGUIStaticText *guitext_profiler, FontEngine *fe,
std::ostringstream os(std::ios_base::binary);
g_profiler->printPage(os, show_profiler, show_profiler_max);
std::wstring text = utf8_to_wide(os.str());
- guitext_profiler->setText(text.c_str());
+ setStaticText(guitext_profiler, text.c_str());
guitext_profiler->setVisible(true);
s32 w = fe->getTextWidth(text.c_str());
@@ -602,6 +607,8 @@ public:
void draw(s32 x_left, s32 y_bottom, video::IVideoDriver *driver,
gui::IGUIFont *font) const
{
+ // Do *not* use UNORDERED_MAP here as the order needs
+ // to be the same for each call to prevent flickering
std::map<std::string, Meta> m_meta;
for (std::deque<Piece>::const_iterator k = m_log.begin();
@@ -612,8 +619,7 @@ public:
i != piece.values.end(); ++i) {
const std::string &id = i->first;
const float &value = i->second;
- std::map<std::string, Meta>::iterator j =
- m_meta.find(id);
+ std::map<std::string, Meta>::iterator j = m_meta.find(id);
if (j == m_meta.end()) {
m_meta[id] = Meta(value);
@@ -867,7 +873,7 @@ public:
return;
m_fetched.insert(name);
- std::string base = porting::path_share + DIR_DELIM + "testsounds";
+ std::string base = porting::path_share + DIR_DELIM + "sounds";
dst_paths.insert(base + DIR_DELIM + name + ".ogg");
dst_paths.insert(base + DIR_DELIM + name + ".0.ogg");
dst_paths.insert(base + DIR_DELIM + name + ".1.ogg");
@@ -882,40 +888,73 @@ public:
}
};
+
+// before 1.8 there isn't a "integer interface", only float
+#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
+typedef f32 SamplerLayer_t;
+#else
+typedef s32 SamplerLayer_t;
+#endif
+
+
class GameGlobalShaderConstantSetter : public IShaderConstantSetter
{
Sky *m_sky;
bool *m_force_fog_off;
f32 *m_fog_range;
+ bool m_fog_enabled;
+ CachedPixelShaderSetting<float, 4> m_sky_bg_color;
+ CachedPixelShaderSetting<float> m_fog_distance;
+ CachedVertexShaderSetting<float> m_animation_timer_vertex;
+ CachedPixelShaderSetting<float> m_animation_timer_pixel;
+ CachedPixelShaderSetting<float> m_day_night_ratio;
+ CachedPixelShaderSetting<float, 3> m_eye_position_pixel;
+ CachedVertexShaderSetting<float, 3> m_eye_position_vertex;
+ CachedPixelShaderSetting<float, 3> m_minimap_yaw;
+ CachedPixelShaderSetting<SamplerLayer_t> m_base_texture;
+ CachedPixelShaderSetting<SamplerLayer_t> m_normal_texture;
+ CachedPixelShaderSetting<SamplerLayer_t> m_texture_flags;
Client *m_client;
- bool m_fogEnabled;
public:
void onSettingsChange(const std::string &name)
{
if (name == "enable_fog")
- m_fogEnabled = g_settings->getBool("enable_fog");
+ m_fog_enabled = g_settings->getBool("enable_fog");
}
- static void SettingsCallback(const std::string &name, void *userdata)
+ static void settingsCallback(const std::string &name, void *userdata)
{
reinterpret_cast<GameGlobalShaderConstantSetter*>(userdata)->onSettingsChange(name);
}
+ void setSky(Sky *sky) { m_sky = sky; }
+
GameGlobalShaderConstantSetter(Sky *sky, bool *force_fog_off,
f32 *fog_range, Client *client) :
m_sky(sky),
m_force_fog_off(force_fog_off),
m_fog_range(fog_range),
+ m_sky_bg_color("skyBgColor"),
+ m_fog_distance("fogDistance"),
+ m_animation_timer_vertex("animationTimer"),
+ m_animation_timer_pixel("animationTimer"),
+ m_day_night_ratio("dayNightRatio"),
+ m_eye_position_pixel("eyePosition"),
+ m_eye_position_vertex("eyePosition"),
+ m_minimap_yaw("yawVec"),
+ m_base_texture("baseTexture"),
+ m_normal_texture("normalTexture"),
+ m_texture_flags("textureFlags"),
m_client(client)
{
- g_settings->registerChangedCallback("enable_fog", SettingsCallback, this);
- m_fogEnabled = g_settings->getBool("enable_fog");
+ g_settings->registerChangedCallback("enable_fog", settingsCallback, this);
+ m_fog_enabled = g_settings->getBool("enable_fog");
}
~GameGlobalShaderConstantSetter()
{
- g_settings->deregisterChangedCallback("enable_fog", SettingsCallback, this);
+ g_settings->deregisterChangedCallback("enable_fog", settingsCallback, this);
}
virtual void onSetConstants(video::IMaterialRendererServices *services,
@@ -933,54 +972,92 @@ public:
bgcolorf.b,
bgcolorf.a,
};
- services->setPixelShaderConstant("skyBgColor", bgcolorfa, 4);
+ m_sky_bg_color.set(bgcolorfa, services);
// Fog distance
float fog_distance = 10000 * BS;
- if (m_fogEnabled && !*m_force_fog_off)
+ if (m_fog_enabled && !*m_force_fog_off)
fog_distance = *m_fog_range;
- services->setPixelShaderConstant("fogDistance", &fog_distance, 1);
+ m_fog_distance.set(&fog_distance, services);
- // Day-night ratio
- u32 daynight_ratio = m_client->getEnv().getDayNightRatio();
- float daynight_ratio_f = (float)daynight_ratio / 1000.0;
- services->setPixelShaderConstant("dayNightRatio", &daynight_ratio_f, 1);
+ float daynight_ratio = (float)m_client->getEnv().getDayNightRatio() / 1000.f;
+ m_day_night_ratio.set(&daynight_ratio, services);
u32 animation_timer = porting::getTimeMs() % 100000;
- float animation_timer_f = (float)animation_timer / 100000.0;
- services->setPixelShaderConstant("animationTimer", &animation_timer_f, 1);
- services->setVertexShaderConstant("animationTimer", &animation_timer_f, 1);
+ float animation_timer_f = (float)animation_timer / 100000.f;
+ m_animation_timer_vertex.set(&animation_timer_f, services);
+ m_animation_timer_pixel.set(&animation_timer_f, services);
- LocalPlayer *player = m_client->getEnv().getLocalPlayer();
- v3f eye_position = player->getEyePosition();
- services->setPixelShaderConstant("eyePosition", (irr::f32 *)&eye_position, 3);
- services->setVertexShaderConstant("eyePosition", (irr::f32 *)&eye_position, 3);
-
- v3f minimap_yaw_vec = m_client->getMapper()->getYawVec();
- services->setPixelShaderConstant("yawVec", (irr::f32 *)&minimap_yaw_vec, 3);
+ float eye_position_array[3];
+ v3f epos = m_client->getEnv().getLocalPlayer()->getEyePosition();
+#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
+ eye_position_array[0] = epos.X;
+ eye_position_array[1] = epos.Y;
+ eye_position_array[2] = epos.Z;
+#else
+ epos.getAs3Values(eye_position_array);
+#endif
+ m_eye_position_pixel.set(eye_position_array, services);
+ m_eye_position_vertex.set(eye_position_array, services);
- // Uniform sampler layers
- // before 1.8 there isn't a "integer interface", only float
+ float minimap_yaw_array[3];
+ v3f minimap_yaw = m_client->getMapper()->getYawVec();
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
- f32 layer0 = 0;
- f32 layer1 = 1;
- f32 layer2 = 2;
- services->setPixelShaderConstant("baseTexture" , (irr::f32 *)&layer0, 1);
- services->setPixelShaderConstant("normalTexture" , (irr::f32 *)&layer1, 1);
- services->setPixelShaderConstant("textureFlags" , (irr::f32 *)&layer2, 1);
+ minimap_yaw_array[0] = minimap_yaw.X;
+ minimap_yaw_array[1] = minimap_yaw.Y;
+ minimap_yaw_array[2] = minimap_yaw.Z;
#else
- s32 layer0 = 0;
- s32 layer1 = 1;
- s32 layer2 = 2;
- services->setPixelShaderConstant("baseTexture" , (irr::s32 *)&layer0, 1);
- services->setPixelShaderConstant("normalTexture" , (irr::s32 *)&layer1, 1);
- services->setPixelShaderConstant("textureFlags" , (irr::s32 *)&layer2, 1);
+ minimap_yaw.getAs3Values(minimap_yaw_array);
#endif
+ m_minimap_yaw.set(minimap_yaw_array, services);
+
+ SamplerLayer_t base_tex = 0,
+ normal_tex = 1,
+ flags_tex = 2;
+ m_base_texture.set(&base_tex, services);
+ m_normal_texture.set(&normal_tex, services);
+ m_texture_flags.set(&flags_tex, services);
+ }
+};
+
+
+class GameGlobalShaderConstantSetterFactory : public IShaderConstantSetterFactory
+{
+ Sky *m_sky;
+ bool *m_force_fog_off;
+ f32 *m_fog_range;
+ Client *m_client;
+ std::vector<GameGlobalShaderConstantSetter *> created_nosky;
+public:
+ GameGlobalShaderConstantSetterFactory(bool *force_fog_off,
+ f32 *fog_range, Client *client) :
+ m_sky(NULL),
+ m_force_fog_off(force_fog_off),
+ m_fog_range(fog_range),
+ m_client(client)
+ {}
+
+ void setSky(Sky *sky) {
+ m_sky = sky;
+ for (size_t i = 0; i < created_nosky.size(); ++i) {
+ created_nosky[i]->setSky(m_sky);
+ }
+ created_nosky.clear();
+ }
+
+ virtual IShaderConstantSetter* create()
+ {
+ GameGlobalShaderConstantSetter *scs = new GameGlobalShaderConstantSetter(
+ m_sky, m_force_fog_off, m_fog_range, m_client);
+ if (!m_sky)
+ created_nosky.push_back(scs);
+ return scs;
}
};
+
bool nodePlacementPrediction(Client &client,
const ItemDefinition &playeritem_def, v3s16 nodepos, v3s16 neighbourpos)
{
@@ -1106,12 +1183,14 @@ bool nodePlacementPrediction(Client &client,
static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec,
InventoryManager *invmgr, IGameDef *gamedef,
IWritableTextureSource *tsrc, IrrlichtDevice *device,
+ JoystickController *joystick,
IFormSource *fs_src, TextDest *txt_dest, Client *client)
{
if (*cur_formspec == 0) {
- *cur_formspec = new GUIFormSpecMenu(device, guiroot, -1, &g_menumgr,
- invmgr, gamedef, tsrc, fs_src, txt_dest, client);
+ *cur_formspec = new GUIFormSpecMenu(device, joystick,
+ guiroot, -1, &g_menumgr, invmgr, gamedef, tsrc,
+ fs_src, txt_dest, client);
(*cur_formspec)->doPause = false;
/*
@@ -1126,6 +1205,7 @@ static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec,
(*cur_formspec)->setFormSource(fs_src);
(*cur_formspec)->setTextDest(txt_dest);
}
+
}
#ifdef __ANDROID__
@@ -1136,7 +1216,8 @@ static inline void create_formspec_menu(GUIFormSpecMenu **cur_formspec,
static void show_deathscreen(GUIFormSpecMenu **cur_formspec,
InventoryManager *invmgr, IGameDef *gamedef,
- IWritableTextureSource *tsrc, IrrlichtDevice *device, Client *client)
+ IWritableTextureSource *tsrc, IrrlichtDevice *device,
+ JoystickController *joystick, Client *client)
{
std::string formspec =
std::string(FORMSPEC_VERSION_STRING) +
@@ -1152,14 +1233,15 @@ static void show_deathscreen(GUIFormSpecMenu **cur_formspec,
FormspecFormSource *fs_src = new FormspecFormSource(formspec);
LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_DEATH_SCREEN", client);
- create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst, NULL);
+ create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device,
+ joystick, fs_src, txt_dst, NULL);
}
/******************************************************************************/
static void show_pause_menu(GUIFormSpecMenu **cur_formspec,
InventoryManager *invmgr, IGameDef *gamedef,
IWritableTextureSource *tsrc, IrrlichtDevice *device,
- bool singleplayermode)
+ JoystickController *joystick, bool singleplayermode)
{
#ifdef __ANDROID__
std::string control_text = strgettext("Default Controls:\n"
@@ -1224,7 +1306,8 @@ static void show_pause_menu(GUIFormSpecMenu **cur_formspec,
FormspecFormSource *fs_src = new FormspecFormSource(os.str());
LocalFormspecHandler *txt_dst = new LocalFormspecHandler("MT_PAUSE_MENU");
- create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device, fs_src, txt_dst, NULL);
+ create_formspec_menu(cur_formspec, invmgr, gamedef, tsrc, device,
+ joystick, fs_src, txt_dst, NULL);
std::string con("btn_continue");
(*cur_formspec)->setFocus(con);
(*cur_formspec)->doPause = true;
@@ -1240,7 +1323,11 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
// Get new messages from error log buffer
while (!chat_log_error_buf.empty()) {
- chat_backend.addMessage(L"", utf8_to_wide(chat_log_error_buf.get()));
+ std::wstring error_message = utf8_to_wide(chat_log_error_buf.get());
+ if (!g_settings->getBool("disable_escape_sequences")) {
+ error_message = L"\x1b(c@red)" + error_message + L"\x1b(c@white)";
+ }
+ chat_backend.addMessage(L"", error_message);
}
// Get new messages from client
@@ -1255,19 +1342,19 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
// Display all messages in a static text element
unsigned int recent_chat_count = chat_backend.getRecentBuffer().getLineCount();
- std::wstring recent_chat = chat_backend.getRecentChat();
+ EnrichedString recent_chat = chat_backend.getRecentChat();
unsigned int line_height = g_fontengine->getLineHeight();
- guitext_chat->setText(recent_chat.c_str());
+ setStaticText(guitext_chat, recent_chat);
// Update gui element size and position
- s32 chat_y = 5 + line_height;
+ s32 chat_y = 5;
if (show_debug)
- chat_y += line_height;
+ chat_y += 2 * line_height;
// first pass to calculate height of text to be set
- s32 width = std::min(g_fontengine->getTextWidth(recent_chat) + 10,
+ s32 width = std::min(g_fontengine->getTextWidth(recent_chat.c_str()) + 10,
porting::getWindowSize().X - 20);
core::rect<s32> rect(10, chat_y, width, chat_y + porting::getWindowSize().Y);
guitext_chat->setRelativePosition(rect);
@@ -1297,108 +1384,89 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
*/
struct KeyCache {
- KeyCache() { populate(); }
-
- enum {
- // Player movement
- KEYMAP_ID_FORWARD,
- KEYMAP_ID_BACKWARD,
- KEYMAP_ID_LEFT,
- KEYMAP_ID_RIGHT,
- KEYMAP_ID_JUMP,
- KEYMAP_ID_SPECIAL1,
- KEYMAP_ID_SNEAK,
- KEYMAP_ID_AUTORUN,
-
- // Other
- KEYMAP_ID_DROP,
- KEYMAP_ID_INVENTORY,
- KEYMAP_ID_CHAT,
- KEYMAP_ID_CMD,
- KEYMAP_ID_CONSOLE,
- KEYMAP_ID_MINIMAP,
- KEYMAP_ID_FREEMOVE,
- KEYMAP_ID_FASTMOVE,
- KEYMAP_ID_NOCLIP,
- KEYMAP_ID_CINEMATIC,
- KEYMAP_ID_SCREENSHOT,
- KEYMAP_ID_TOGGLE_HUD,
- KEYMAP_ID_TOGGLE_CHAT,
- KEYMAP_ID_TOGGLE_FORCE_FOG_OFF,
- KEYMAP_ID_TOGGLE_UPDATE_CAMERA,
- KEYMAP_ID_TOGGLE_DEBUG,
- KEYMAP_ID_TOGGLE_PROFILER,
- KEYMAP_ID_CAMERA_MODE,
- KEYMAP_ID_INCREASE_VIEWING_RANGE,
- KEYMAP_ID_DECREASE_VIEWING_RANGE,
- KEYMAP_ID_RANGESELECT,
-
- KEYMAP_ID_QUICKTUNE_NEXT,
- KEYMAP_ID_QUICKTUNE_PREV,
- KEYMAP_ID_QUICKTUNE_INC,
- KEYMAP_ID_QUICKTUNE_DEC,
-
- KEYMAP_ID_DEBUG_STACKS,
-
- // Fake keycode for array size and internal checks
- KEYMAP_INTERNAL_ENUM_COUNT
-
-
- };
+ KeyCache()
+ {
+ handler = NULL;
+ populate();
+ populate_nonchanging();
+ }
void populate();
- KeyPress key[KEYMAP_INTERNAL_ENUM_COUNT];
+ // Keys that are not settings dependent
+ void populate_nonchanging();
+
+ KeyPress key[KeyType::INTERNAL_ENUM_COUNT];
+ InputHandler *handler;
};
+void KeyCache::populate_nonchanging()
+{
+ key[KeyType::ESC] = EscapeKey;
+}
+
void KeyCache::populate()
{
- key[KEYMAP_ID_FORWARD] = getKeySetting("keymap_forward");
- key[KEYMAP_ID_BACKWARD] = getKeySetting("keymap_backward");
- key[KEYMAP_ID_LEFT] = getKeySetting("keymap_left");
- key[KEYMAP_ID_RIGHT] = getKeySetting("keymap_right");
- key[KEYMAP_ID_JUMP] = getKeySetting("keymap_jump");
- key[KEYMAP_ID_SPECIAL1] = getKeySetting("keymap_special1");
- key[KEYMAP_ID_SNEAK] = getKeySetting("keymap_sneak");
-
- key[KEYMAP_ID_AUTORUN] = getKeySetting("keymap_autorun");
-
- key[KEYMAP_ID_DROP] = getKeySetting("keymap_drop");
- key[KEYMAP_ID_INVENTORY] = getKeySetting("keymap_inventory");
- key[KEYMAP_ID_CHAT] = getKeySetting("keymap_chat");
- key[KEYMAP_ID_CMD] = getKeySetting("keymap_cmd");
- key[KEYMAP_ID_CONSOLE] = getKeySetting("keymap_console");
- key[KEYMAP_ID_MINIMAP] = getKeySetting("keymap_minimap");
- key[KEYMAP_ID_FREEMOVE] = getKeySetting("keymap_freemove");
- key[KEYMAP_ID_FASTMOVE] = getKeySetting("keymap_fastmove");
- key[KEYMAP_ID_NOCLIP] = getKeySetting("keymap_noclip");
- key[KEYMAP_ID_CINEMATIC] = getKeySetting("keymap_cinematic");
- key[KEYMAP_ID_SCREENSHOT] = getKeySetting("keymap_screenshot");
- key[KEYMAP_ID_TOGGLE_HUD] = getKeySetting("keymap_toggle_hud");
- key[KEYMAP_ID_TOGGLE_CHAT] = getKeySetting("keymap_toggle_chat");
- key[KEYMAP_ID_TOGGLE_FORCE_FOG_OFF]
+ key[KeyType::FORWARD] = getKeySetting("keymap_forward");
+ key[KeyType::BACKWARD] = getKeySetting("keymap_backward");
+ key[KeyType::LEFT] = getKeySetting("keymap_left");
+ key[KeyType::RIGHT] = getKeySetting("keymap_right");
+ key[KeyType::JUMP] = getKeySetting("keymap_jump");
+ key[KeyType::SPECIAL1] = getKeySetting("keymap_special1");
+ key[KeyType::SNEAK] = getKeySetting("keymap_sneak");
+
+ key[KeyType::AUTORUN] = getKeySetting("keymap_autorun");
+
+ key[KeyType::DROP] = getKeySetting("keymap_drop");
+ key[KeyType::INVENTORY] = getKeySetting("keymap_inventory");
+ key[KeyType::CHAT] = getKeySetting("keymap_chat");
+ key[KeyType::CMD] = getKeySetting("keymap_cmd");
+ key[KeyType::CONSOLE] = getKeySetting("keymap_console");
+ key[KeyType::MINIMAP] = getKeySetting("keymap_minimap");
+ key[KeyType::FREEMOVE] = getKeySetting("keymap_freemove");
+ key[KeyType::FASTMOVE] = getKeySetting("keymap_fastmove");
+ key[KeyType::NOCLIP] = getKeySetting("keymap_noclip");
+ key[KeyType::CINEMATIC] = getKeySetting("keymap_cinematic");
+ key[KeyType::SCREENSHOT] = getKeySetting("keymap_screenshot");
+ key[KeyType::TOGGLE_HUD] = getKeySetting("keymap_toggle_hud");
+ key[KeyType::TOGGLE_CHAT] = getKeySetting("keymap_toggle_chat");
+ key[KeyType::TOGGLE_FORCE_FOG_OFF]
= getKeySetting("keymap_toggle_force_fog_off");
- key[KEYMAP_ID_TOGGLE_UPDATE_CAMERA]
+ key[KeyType::TOGGLE_UPDATE_CAMERA]
= getKeySetting("keymap_toggle_update_camera");
- key[KEYMAP_ID_TOGGLE_DEBUG]
+ key[KeyType::TOGGLE_DEBUG]
= getKeySetting("keymap_toggle_debug");
- key[KEYMAP_ID_TOGGLE_PROFILER]
+ key[KeyType::TOGGLE_PROFILER]
= getKeySetting("keymap_toggle_profiler");
- key[KEYMAP_ID_CAMERA_MODE]
+ key[KeyType::CAMERA_MODE]
= getKeySetting("keymap_camera_mode");
- key[KEYMAP_ID_INCREASE_VIEWING_RANGE]
+ key[KeyType::INCREASE_VIEWING_RANGE]
= getKeySetting("keymap_increase_viewing_range_min");
- key[KEYMAP_ID_DECREASE_VIEWING_RANGE]
+ key[KeyType::DECREASE_VIEWING_RANGE]
= getKeySetting("keymap_decrease_viewing_range_min");
- key[KEYMAP_ID_RANGESELECT]
+ key[KeyType::RANGESELECT]
= getKeySetting("keymap_rangeselect");
+ key[KeyType::ZOOM] = getKeySetting("keymap_zoom");
- key[KEYMAP_ID_QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
- key[KEYMAP_ID_QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
- key[KEYMAP_ID_QUICKTUNE_INC] = getKeySetting("keymap_quicktune_inc");
- key[KEYMAP_ID_QUICKTUNE_DEC] = getKeySetting("keymap_quicktune_dec");
+ key[KeyType::QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
+ key[KeyType::QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
+ key[KeyType::QUICKTUNE_INC] = getKeySetting("keymap_quicktune_inc");
+ key[KeyType::QUICKTUNE_DEC] = getKeySetting("keymap_quicktune_dec");
- key[KEYMAP_ID_DEBUG_STACKS] = getKeySetting("keymap_print_debug_stacks");
+ key[KeyType::DEBUG_STACKS] = getKeySetting("keymap_print_debug_stacks");
+
+ if (handler) {
+ // First clear all keys, then re-add the ones we listen for
+ handler->dontListenForKeys();
+ for (size_t i = 0; i < KeyType::INTERNAL_ENUM_COUNT; i++) {
+ handler->listenForKey(key[i]);
+ }
+ handler->listenForKey(EscapeKey);
+ handler->listenForKey(CancelKey);
+ for (size_t i = 0; i < 10; i++) {
+ handler->listenForKey(NumberKey[i]);
+ }
+ }
}
@@ -1552,9 +1620,10 @@ protected:
f32 dtime);
void updateStats(RunStats *stats, const FpsControl &draw_times, f32 dtime);
+ // Input related
void processUserInput(VolatileRunFlags *flags, GameRunData *runData,
f32 dtime);
- void processKeyboardInput(VolatileRunFlags *flags,
+ void processKeyInput(VolatileRunFlags *flags,
float *statustext_time,
float *jump_timer,
bool *reset_jump_timer,
@@ -1578,7 +1647,7 @@ protected:
bool shift_pressed);
void toggleFog(float *statustext_time, bool *flag);
void toggleDebug(float *statustext_time, bool *show_debug,
- bool *show_profiler_graph);
+ bool *show_profiler_graph, bool *show_wireframe);
void toggleUpdateCamera(float *statustext_time, bool *flag);
void toggleProfiler(float *statustext_time, u32 *profiler_current_page,
u32 profiler_max_page);
@@ -1587,9 +1656,10 @@ protected:
void decreaseViewRange(float *statustext_time);
void toggleFullViewRange(float *statustext_time);
- void updateCameraDirection(CameraOrientation *cam, VolatileRunFlags *flags);
+ void updateCameraDirection(CameraOrientation *cam, VolatileRunFlags *flags,
+ float dtime);
void updateCameraOrientation(CameraOrientation *cam,
- const VolatileRunFlags &flags);
+ const VolatileRunFlags &flags, float dtime);
void updatePlayerControl(const CameraOrientation &cam);
void step(f32 *dtime);
void processClientEvents(CameraOrientation *cam, float *damage_flash);
@@ -1624,6 +1694,41 @@ protected:
static void settingChangedCallback(const std::string &setting_name, void *data);
void readSettings();
+ inline bool getLeftClicked()
+ {
+ return input->getLeftClicked() ||
+ input->joystick.getWasKeyDown(KeyType::MOUSE_L);
+ }
+ inline bool getRightClicked()
+ {
+ return input->getRightClicked() ||
+ input->joystick.getWasKeyDown(KeyType::MOUSE_R);
+ }
+ inline bool isLeftPressed()
+ {
+ return input->getLeftState() ||
+ input->joystick.isKeyDown(KeyType::MOUSE_L);
+ }
+ inline bool isRightPressed()
+ {
+ return input->getRightState() ||
+ input->joystick.isKeyDown(KeyType::MOUSE_R);
+ }
+ inline bool getLeftReleased()
+ {
+ return input->getLeftReleased() ||
+ input->joystick.wasKeyReleased(KeyType::MOUSE_L);
+ }
+
+ inline bool isKeyDown(GameKeyType k)
+ {
+ return input->isKeyDown(keycache.key[k]) || input->joystick.isKeyDown(k);
+ }
+ inline bool wasKeyDown(GameKeyType k)
+ {
+ return input->wasKeyDown(keycache.key[k]) || input->joystick.wasKeyDown(k);
+ }
+
#ifdef __ANDROID__
void handleAndroidChatInput();
#endif
@@ -1649,6 +1754,8 @@ private:
ChatBackend *chat_backend;
GUIFormSpecMenu *current_formspec;
+ //default: "". If other than "", empty show_formspec packets will only close the formspec when the formname matches
+ std::string cur_formname;
EventManager *eventmgr;
QuicktuneShortcutter *quicktune;
@@ -1662,6 +1769,9 @@ private:
Hud *hud;
Mapper *mapper;
+ GameRunData runData;
+ VolatileRunFlags flags;
+
/* 'cache'
This class does take ownership/responsibily for cleaning up etc of any of
these items (e.g. device)
@@ -1707,10 +1817,16 @@ private:
*/
bool m_cache_doubletap_jump;
bool m_cache_enable_clouds;
+ bool m_cache_enable_joysticks;
bool m_cache_enable_particles;
bool m_cache_enable_fog;
+ bool m_cache_enable_noclip;
+ bool m_cache_enable_free_move;
f32 m_cache_mouse_sensitivity;
+ f32 m_cache_joystick_frustum_sensitivity;
f32 m_repeat_right_click_time;
+ f32 m_cache_cam_smoothing;
+ f32 m_cache_fog_start;
#ifdef __ANDROID__
bool m_cache_hold_aux1;
@@ -1730,6 +1846,7 @@ Game::Game() :
soundmaker(NULL),
chat_backend(NULL),
current_formspec(NULL),
+ cur_formname(""),
eventmgr(NULL),
quicktune(NULL),
gui_chat_console(NULL),
@@ -1745,14 +1862,28 @@ Game::Game() :
&settingChangedCallback, this);
g_settings->registerChangedCallback("enable_clouds",
&settingChangedCallback, this);
+ g_settings->registerChangedCallback("doubletap_joysticks",
+ &settingChangedCallback, this);
g_settings->registerChangedCallback("enable_particles",
&settingChangedCallback, this);
g_settings->registerChangedCallback("enable_fog",
&settingChangedCallback, this);
g_settings->registerChangedCallback("mouse_sensitivity",
&settingChangedCallback, this);
+ g_settings->registerChangedCallback("joystick_frustum_sensitivity",
+ &settingChangedCallback, this);
g_settings->registerChangedCallback("repeat_rightclick_time",
&settingChangedCallback, this);
+ g_settings->registerChangedCallback("noclip",
+ &settingChangedCallback, this);
+ g_settings->registerChangedCallback("free_move",
+ &settingChangedCallback, this);
+ g_settings->registerChangedCallback("cinematic",
+ &settingChangedCallback, this);
+ g_settings->registerChangedCallback("cinematic_camera_smoothing",
+ &settingChangedCallback, this);
+ g_settings->registerChangedCallback("camera_smoothing",
+ &settingChangedCallback, this);
readSettings();
@@ -1802,6 +1933,16 @@ Game::~Game()
&settingChangedCallback, this);
g_settings->deregisterChangedCallback("repeat_rightclick_time",
&settingChangedCallback, this);
+ g_settings->deregisterChangedCallback("noclip",
+ &settingChangedCallback, this);
+ g_settings->deregisterChangedCallback("free_move",
+ &settingChangedCallback, this);
+ g_settings->deregisterChangedCallback("cinematic",
+ &settingChangedCallback, this);
+ g_settings->deregisterChangedCallback("cinematic_camera_smoothing",
+ &settingChangedCallback, this);
+ g_settings->deregisterChangedCallback("camera_smoothing",
+ &settingChangedCallback, this);
}
bool Game::startup(bool *kill,
@@ -1829,11 +1970,26 @@ bool Game::startup(bool *kill,
this->chat_backend = chat_backend;
this->simple_singleplayer_mode = simple_singleplayer_mode;
+ keycache.handler = input;
+ keycache.populate();
+
driver = device->getVideoDriver();
smgr = device->getSceneManager();
smgr->getParameters()->setAttribute(scene::OBJ_LOADER_IGNORE_MATERIAL_FILES, true);
+ memset(&runData, 0, sizeof(runData));
+ runData.time_from_last_punch = 10.0;
+ runData.profiler_max_page = 3;
+ runData.update_wielded_item_trigger = true;
+
+ memset(&flags, 0, sizeof(flags));
+ flags.show_chat = true;
+ flags.show_hud = true;
+ flags.show_debug = g_settings->getBool("show_debug");
+ flags.invert_mouse = g_settings->getBool("invert_mouse");
+ flags.first_loop_after_window_activation = true;
+
if (!init(map_dir, address, port, gamespec))
return false;
@@ -1850,34 +2006,15 @@ void Game::run()
RunStats stats = { 0 };
CameraOrientation cam_view_target = { 0 };
CameraOrientation cam_view = { 0 };
- GameRunData runData = { 0 };
FpsControl draw_times = { 0 };
- VolatileRunFlags flags = { 0 };
f32 dtime; // in seconds
- runData.time_from_last_punch = 10.0;
- runData.profiler_max_page = 3;
- runData.update_wielded_item_trigger = true;
-
- flags.show_chat = true;
- flags.show_hud = true;
- flags.show_minimap = g_settings->getBool("enable_minimap");
- flags.show_debug = g_settings->getBool("show_debug");
- flags.invert_mouse = g_settings->getBool("invert_mouse");
- flags.first_loop_after_window_activation = true;
-
/* Clear the profiler */
Profiler::GraphValues dummyvalues;
g_profiler->graphGet(dummyvalues);
draw_times.last_time = device->getTimer()->getTime();
- shader_src->addGlobalConstantSetter(new GameGlobalShaderConstantSetter(
- sky,
- &flags.force_fog_off,
- &runData.fog_range,
- client));
-
set_light_table(g_settings->getFloat("display_gamma"));
#ifdef __ANDROID__
@@ -1910,17 +2047,11 @@ void Game::run()
updateProfilers(runData, stats, draw_times, dtime);
processUserInput(&flags, &runData, dtime);
// Update camera before player movement to avoid camera lag of one frame
- updateCameraDirection(&cam_view_target, &flags);
- float cam_smoothing = 0;
- if (g_settings->getBool("cinematic"))
- cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing");
- else
- cam_smoothing = 1 - g_settings->getFloat("camera_smoothing");
- cam_smoothing = rangelim(cam_smoothing, 0.01f, 1.0f);
+ updateCameraDirection(&cam_view_target, &flags, dtime);
cam_view.camera_yaw += (cam_view_target.camera_yaw -
- cam_view.camera_yaw) * cam_smoothing;
+ cam_view.camera_yaw) * m_cache_cam_smoothing;
cam_view.camera_pitch += (cam_view_target.camera_pitch -
- cam_view.camera_pitch) * cam_smoothing;
+ cam_view.camera_pitch) * m_cache_cam_smoothing;
updatePlayerControl(cam_view);
step(&dtime);
processClientEvents(&cam_view_target, &runData.damage_flash);
@@ -2117,6 +2248,10 @@ bool Game::createClient(const std::string &playername,
return false;
}
+ GameGlobalShaderConstantSetterFactory *scsf = new GameGlobalShaderConstantSetterFactory(
+ &flags.force_fog_off, &runData.fog_range, client);
+ shader_src->addShaderConstantSetterFactory(scsf);
+
// Update cached textures, meshes and materials
client->afterContentReceived(device);
@@ -2141,6 +2276,7 @@ bool Game::createClient(const std::string &playername,
/* Skybox
*/
sky = new Sky(smgr->getRootSceneNode(), smgr, -1, texture_src);
+ scsf->setSky(sky);
skybox = NULL; // This is used/set later on in the main run loop
local_inventory = new Inventory(itemdef_manager);
@@ -2167,6 +2303,8 @@ bool Game::createClient(const std::string &playername,
/* Set window caption
*/
std::wstring str = utf8_to_wide(PROJECT_NAME_C);
+ str += L" ";
+ str += utf8_to_wide(g_version_hash);
str += L" [";
str += driver->getName();
str += L"]";
@@ -2193,37 +2331,39 @@ bool Game::createClient(const std::string &playername,
bool Game::initGui()
{
// First line of debug text
- guitext = guienv->addStaticText(
+ guitext = addStaticText(guienv,
utf8_to_wide(PROJECT_NAME_C).c_str(),
core::rect<s32>(0, 0, 0, 0),
false, false, guiroot);
// Second line of debug text
- guitext2 = guienv->addStaticText(
+ guitext2 = addStaticText(guienv,
L"",
core::rect<s32>(0, 0, 0, 0),
false, false, guiroot);
// At the middle of the screen
// Object infos are shown in this
- guitext_info = guienv->addStaticText(
+ guitext_info = addStaticText(guienv,
L"",
core::rect<s32>(0, 0, 400, g_fontengine->getTextHeight() * 5 + 5) + v2s32(100, 200),
false, true, guiroot);
// Status text (displays info when showing and hiding GUI stuff, etc.)
- guitext_status = guienv->addStaticText(
+ guitext_status = addStaticText(guienv,
L"<Status>",
core::rect<s32>(0, 0, 0, 0),
false, false, guiroot);
guitext_status->setVisible(false);
// Chat text
- guitext_chat = guienv->addStaticText(
+ guitext_chat = addStaticText(
+ guienv,
L"",
core::rect<s32>(0, 0, 0, 0),
//false, false); // Disable word wrap as of now
false, true, guiroot);
+
// Remove stale "recent" chat messages from previous connections
chat_backend->clearRecentChat();
@@ -2237,7 +2377,7 @@ bool Game::initGui()
}
// Profiler text (size is updated when text is updated)
- guitext_profiler = guienv->addStaticText(
+ guitext_profiler = addStaticText(guienv,
L"<Profiler>",
core::rect<s32>(0, 0, 0, 0),
false, false, guiroot);
@@ -2351,7 +2491,7 @@ bool Game::connectToServer(const std::string &playername,
break;
}
- if (input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
+ if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) {
*aborted = true;
infostream << "Connect aborted [Escape]" << std::endl;
break;
@@ -2360,7 +2500,26 @@ bool Game::connectToServer(const std::string &playername,
wait_time += dtime;
// Only time out if we aren't waiting for the server we started
if ((*address != "") && (wait_time > 10)) {
- *error_message = "Connection timed out.";
+ bool sent_old_init = g_settings->getFlag("send_pre_v25_init");
+ // If no pre v25 init was sent, and no answer was received,
+ // but the low level connection could be established
+ // (meaning that we have a peer id), then we probably wanted
+ // to connect to a legacy server. In this case, tell the user
+ // to enable the option to be able to connect.
+ if (!sent_old_init &&
+ (client->getProtoVersion() == 0) &&
+ client->connectedToServer()) {
+ *error_message = "Connection failure: init packet not "
+ "recognized by server.\n"
+ "Most likely the server uses an old protocol version (<v25).\n"
+ "Please ask the server owner to update to 0.4.13 or later.\n"
+ "To still connect to the server in the meantime,\n"
+ "you can enable the 'send_pre_v25_init' setting by editing minetest.conf,\n"
+ "or by enabling the 'Client -> Network -> Support older Servers'\n"
+ "entry in the advanced settings menu.";
+ } else {
+ *error_message = "Connection timed out.";
+ }
errorstream << *error_message << std::endl;
break;
}
@@ -2412,7 +2571,7 @@ bool Game::getServerContent(bool *aborted)
return false;
}
- if (input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
+ if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) {
*aborted = true;
infostream << "Connect aborted [Escape]" << std::endl;
return false;
@@ -2510,7 +2669,7 @@ inline bool Game::handleCallbacks()
if (g_gamecallback->changevolume_requested) {
(new GUIVolumeChange(guienv, guiroot, -1,
- &g_menumgr, client))->drop();
+ &g_menumgr))->drop();
g_gamecallback->changevolume_requested = false;
}
@@ -2674,7 +2833,7 @@ void Game::processUserInput(VolatileRunFlags *flags,
if (m_cache_doubletap_jump && runData->jump_timer <= 0.2)
runData->jump_timer += dtime;
- processKeyboardInput(
+ processKeyInput(
flags,
&runData->statustext_time,
&runData->jump_timer,
@@ -2686,7 +2845,7 @@ void Game::processUserInput(VolatileRunFlags *flags,
}
-void Game::processKeyboardInput(VolatileRunFlags *flags,
+void Game::processKeyInput(VolatileRunFlags *flags,
float *statustext_time,
float *jump_timer,
bool *reset_jump_timer,
@@ -2696,66 +2855,68 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
//TimeTaker tt("process kybd input", NULL, PRECISION_NANO);
- if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_DROP])) {
+ if (wasKeyDown(KeyType::DROP)) {
dropSelectedItem();
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_AUTORUN])) {
+ } else if (wasKeyDown(KeyType::AUTORUN)) {
toggleAutorun(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_INVENTORY])) {
+ } else if (wasKeyDown(KeyType::INVENTORY)) {
openInventory();
- } else if (input->wasKeyDown(EscapeKey) || input->wasKeyDown(CancelKey)) {
+ } else if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) {
if (!gui_chat_console->isOpenInhibited()) {
show_pause_menu(&current_formspec, client, gamedef,
- texture_src, device, simple_singleplayer_mode);
+ texture_src, device, &input->joystick,
+ simple_singleplayer_mode);
}
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CHAT])) {
+ } else if (wasKeyDown(KeyType::CHAT)) {
openConsole(0.2, L"");
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CMD])) {
+ } else if (wasKeyDown(KeyType::CMD)) {
openConsole(0.2, L"/");
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CONSOLE])) {
+ } else if (wasKeyDown(KeyType::CONSOLE)) {
openConsole(1);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_FREEMOVE])) {
+ } else if (wasKeyDown(KeyType::FREEMOVE)) {
toggleFreeMove(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP])) {
+ } else if (wasKeyDown(KeyType::JUMP)) {
toggleFreeMoveAlt(statustext_time, jump_timer);
*reset_jump_timer = true;
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_FASTMOVE])) {
+ } else if (wasKeyDown(KeyType::FASTMOVE)) {
toggleFast(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_NOCLIP])) {
+ } else if (wasKeyDown(KeyType::NOCLIP)) {
toggleNoClip(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CINEMATIC])) {
+ } else if (wasKeyDown(KeyType::CINEMATIC)) {
toggleCinematic(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_SCREENSHOT])) {
+ } else if (wasKeyDown(KeyType::SCREENSHOT)) {
client->makeScreenshot(device);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_HUD])) {
+ } else if (wasKeyDown(KeyType::TOGGLE_HUD)) {
toggleHud(statustext_time, &flags->show_hud);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_MINIMAP])) {
+ } else if (wasKeyDown(KeyType::MINIMAP)) {
toggleMinimap(statustext_time, &flags->show_minimap, flags->show_hud,
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK]));
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_CHAT])) {
+ isKeyDown(KeyType::SNEAK));
+ } else if (wasKeyDown(KeyType::TOGGLE_CHAT)) {
toggleChat(statustext_time, &flags->show_chat);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_FORCE_FOG_OFF])) {
+ } else if (wasKeyDown(KeyType::TOGGLE_FORCE_FOG_OFF)) {
toggleFog(statustext_time, &flags->force_fog_off);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_UPDATE_CAMERA])) {
+ } else if (wasKeyDown(KeyType::TOGGLE_UPDATE_CAMERA)) {
toggleUpdateCamera(statustext_time, &flags->disable_camera_update);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_DEBUG])) {
- toggleDebug(statustext_time, &flags->show_debug, &flags->show_profiler_graph);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_TOGGLE_PROFILER])) {
+ } else if (wasKeyDown(KeyType::TOGGLE_DEBUG)) {
+ toggleDebug(statustext_time, &flags->show_debug, &flags->show_profiler_graph,
+ &draw_control->show_wireframe);
+ } else if (wasKeyDown(KeyType::TOGGLE_PROFILER)) {
toggleProfiler(statustext_time, profiler_current_page, profiler_max_page);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_INCREASE_VIEWING_RANGE])) {
+ } else if (wasKeyDown(KeyType::INCREASE_VIEWING_RANGE)) {
increaseViewRange(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_DECREASE_VIEWING_RANGE])) {
+ } else if (wasKeyDown(KeyType::DECREASE_VIEWING_RANGE)) {
decreaseViewRange(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_RANGESELECT])) {
+ } else if (wasKeyDown(KeyType::RANGESELECT)) {
toggleFullViewRange(statustext_time);
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_NEXT])) {
+ } else if (wasKeyDown(KeyType::QUICKTUNE_NEXT)) {
quicktune->next();
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_PREV])) {
+ } else if (wasKeyDown(KeyType::QUICKTUNE_PREV)) {
quicktune->prev();
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_INC])) {
+ } else if (wasKeyDown(KeyType::QUICKTUNE_INC)) {
quicktune->inc();
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_QUICKTUNE_DEC])) {
+ } else if (wasKeyDown(KeyType::QUICKTUNE_DEC)) {
quicktune->dec();
- } else if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_DEBUG_STACKS])) {
+ } else if (wasKeyDown(KeyType::DEBUG_STACKS)) {
// Print debug stacks
dstream << "-----------------------------------------"
<< std::endl;
@@ -2765,7 +2926,7 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
debug_stacks_print();
}
- if (!input->isKeyDown(getKeySetting("keymap_jump")) && *reset_jump_timer) {
+ if (!isKeyDown(KeyType::JUMP) && *reset_jump_timer) {
*reset_jump_timer = false;
*jump_timer = 0.0;
}
@@ -2779,7 +2940,6 @@ void Game::processKeyboardInput(VolatileRunFlags *flags,
}
}
-
void Game::processItemSelection(u16 *new_playeritem)
{
LocalPlayer *player = client->getEnv().getLocalPlayer();
@@ -2790,14 +2950,23 @@ void Game::processItemSelection(u16 *new_playeritem)
s32 wheel = input->getMouseWheel();
u16 max_item = MYMIN(PLAYER_INVENTORY_SIZE - 1,
- player->hud_hotbar_itemcount - 1);
+ player->hud_hotbar_itemcount - 1);
- if (wheel < 0)
+ s32 dir = wheel;
+
+ if (input->joystick.wasKeyDown(KeyType::SCROLL_DOWN)) {
+ dir = -1;
+ }
+
+ if (input->joystick.wasKeyDown(KeyType::SCROLL_UP)) {
+ dir = 1;
+ }
+
+ if (dir < 0)
*new_playeritem = *new_playeritem < max_item ? *new_playeritem + 1 : 0;
- else if (wheel > 0)
+ else if (dir > 0)
*new_playeritem = *new_playeritem > 0 ? *new_playeritem - 1 : max_item;
- // else wheel == 0
-
+ // else dir == 0
/* Item selection using keyboard
*/
@@ -2847,7 +3016,8 @@ void Game::openInventory()
TextDest *txt_dst = new TextDestPlayerInventory(client);
create_formspec_menu(&current_formspec, client, gamedef, texture_src,
- device, fs_src, txt_dst, client);
+ device, &input->joystick, fs_src, txt_dst, client);
+ cur_formname = "";
InventoryLocation inventoryloc;
inventoryloc.setCurrentPlayer();
@@ -3037,22 +3207,33 @@ void Game::toggleFog(float *statustext_time, bool *flag)
void Game::toggleDebug(float *statustext_time, bool *show_debug,
- bool *show_profiler_graph)
+ bool *show_profiler_graph, bool *show_wireframe)
{
- // Initial / 3x toggle: Chat only
+ // Initial / 4x toggle: Chat only
// 1x toggle: Debug text with chat
// 2x toggle: Debug text with profiler graph
+ // 3x toggle: Debug text and wireframe
if (!*show_debug) {
*show_debug = true;
*show_profiler_graph = false;
+ *show_wireframe = false;
statustext = L"Debug info shown";
- } else if (*show_profiler_graph) {
- *show_debug = false;
- *show_profiler_graph = false;
- statustext = L"Debug info and profiler graph hidden";
- } else {
+ } else if (!*show_profiler_graph && !*show_wireframe) {
*show_profiler_graph = true;
statustext = L"Profiler graph shown";
+ } else if (!*show_wireframe && client->checkPrivilege("debug")) {
+ *show_profiler_graph = false;
+ *show_wireframe = true;
+ statustext = L"Wireframe shown";
+ } else {
+ *show_debug = false;
+ *show_profiler_graph = false;
+ *show_wireframe = false;
+ if (client->checkPrivilege("debug")) {
+ statustext = L"Debug info, profiler graph, and wireframe hidden";
+ } else {
+ statustext = L"Debug info and profiler graph hidden";
+ }
}
*statustext_time = 0;
}
@@ -3096,9 +3277,16 @@ void Game::increaseViewRange(float *statustext_time)
{
s16 range = g_settings->getS16("viewing_range");
s16 range_new = range + 10;
+
+ if (range_new > 4000) {
+ range_new = 4000;
+ statustext = utf8_to_wide("Viewing range is at maximum: "
+ + itos(range_new));
+ } else {
+ statustext = utf8_to_wide("Viewing range changed to "
+ + itos(range_new));
+ }
g_settings->set("viewing_range", itos(range_new));
- statustext = utf8_to_wide("Viewing range changed to "
- + itos(range_new));
*statustext_time = 0;
}
@@ -3108,12 +3296,15 @@ void Game::decreaseViewRange(float *statustext_time)
s16 range = g_settings->getS16("viewing_range");
s16 range_new = range - 10;
- if (range_new < 20)
+ if (range_new < 20) {
range_new = 20;
-
+ statustext = utf8_to_wide("Viewing range is at minimum: "
+ + itos(range_new));
+ } else {
+ statustext = utf8_to_wide("Viewing range changed to "
+ + itos(range_new));
+ }
g_settings->set("viewing_range", itos(range_new));
- statustext = utf8_to_wide("Viewing range changed to "
- + itos(range_new));
*statustext_time = 0;
}
@@ -3133,7 +3324,7 @@ void Game::toggleFullViewRange(float *statustext_time)
void Game::updateCameraDirection(CameraOrientation *cam,
- VolatileRunFlags *flags)
+ VolatileRunFlags *flags, float dtime)
{
if ((device->isWindowActive() && noMenuActive()) || random_input) {
@@ -3148,7 +3339,7 @@ void Game::updateCameraDirection(CameraOrientation *cam,
if (flags->first_loop_after_window_activation)
flags->first_loop_after_window_activation = false;
else
- updateCameraOrientation(cam, *flags);
+ updateCameraOrientation(cam, *flags, dtime);
input->setMousePos((driver->getScreenSize().Width / 2),
(driver->getScreenSize().Height / 2));
@@ -3166,16 +3357,16 @@ void Game::updateCameraDirection(CameraOrientation *cam,
}
}
-
void Game::updateCameraOrientation(CameraOrientation *cam,
- const VolatileRunFlags &flags)
+ const VolatileRunFlags &flags, float dtime)
{
#ifdef HAVE_TOUCHSCREENGUI
if (g_touchscreengui) {
- cam->camera_yaw = g_touchscreengui->getYaw();
- cam->camera_pitch = g_touchscreengui->getPitch();
+ cam->camera_yaw += g_touchscreengui->getYawChange();
+ cam->camera_pitch = g_touchscreengui->getPitch();
} else {
#endif
+
s32 dx = input->getMousePos().X - (driver->getScreenSize().Width / 2);
s32 dy = input->getMousePos().Y - (driver->getScreenSize().Height / 2);
@@ -3191,6 +3382,14 @@ void Game::updateCameraOrientation(CameraOrientation *cam,
}
#endif
+ if (m_cache_enable_joysticks) {
+ f32 c = m_cache_joystick_frustum_sensitivity * (1.f / 32767.f) * dtime;
+ cam->camera_yaw -= input->joystick.getAxisWithoutDead(JA_FRUSTUM_HORIZONTAL) *
+ c;
+ cam->camera_pitch += input->joystick.getAxisWithoutDead(JA_FRUSTUM_VERTICAL) *
+ c;
+ }
+
cam->camera_pitch = rangelim(cam->camera_pitch, -89.5, 89.5);
}
@@ -3199,30 +3398,37 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
{
//TimeTaker tt("update player control", NULL, PRECISION_NANO);
+ // DO NOT use the isKeyDown method for the forward, backward, left, right
+ // buttons, as the code that uses the controls needs to be able to
+ // distinguish between the two in order to know when to use joysticks.
+
PlayerControl control(
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_FORWARD]),
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_BACKWARD]),
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_LEFT]),
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_RIGHT]),
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP]),
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SPECIAL1]),
- input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK]),
- input->getLeftState(),
- input->getRightState(),
+ input->isKeyDown(keycache.key[KeyType::FORWARD]),
+ input->isKeyDown(keycache.key[KeyType::BACKWARD]),
+ input->isKeyDown(keycache.key[KeyType::LEFT]),
+ input->isKeyDown(keycache.key[KeyType::RIGHT]),
+ isKeyDown(KeyType::JUMP),
+ isKeyDown(KeyType::SPECIAL1),
+ isKeyDown(KeyType::SNEAK),
+ isKeyDown(KeyType::ZOOM),
+ isLeftPressed(),
+ isRightPressed(),
cam.camera_pitch,
- cam.camera_yaw
+ cam.camera_yaw,
+ input->joystick.getAxisWithoutDead(JA_SIDEWARD_MOVE),
+ input->joystick.getAxisWithoutDead(JA_FORWARD_MOVE)
);
u32 keypress_bits =
- ( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_FORWARD]) & 0x1) << 0) |
- ( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_BACKWARD]) & 0x1) << 1) |
- ( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_LEFT]) & 0x1) << 2) |
- ( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_RIGHT]) & 0x1) << 3) |
- ( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP]) & 0x1) << 4) |
- ( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SPECIAL1]) & 0x1) << 5) |
- ( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK]) & 0x1) << 6) |
- ( (u32)(input->getLeftState() & 0x1) << 7) |
- ( (u32)(input->getRightState() & 0x1) << 8
+ ( (u32)(isKeyDown(KeyType::FORWARD) & 0x1) << 0) |
+ ( (u32)(isKeyDown(KeyType::BACKWARD) & 0x1) << 1) |
+ ( (u32)(isKeyDown(KeyType::LEFT) & 0x1) << 2) |
+ ( (u32)(isKeyDown(KeyType::RIGHT) & 0x1) << 3) |
+ ( (u32)(isKeyDown(KeyType::JUMP) & 0x1) << 4) |
+ ( (u32)(isKeyDown(KeyType::SPECIAL1) & 0x1) << 5) |
+ ( (u32)(isKeyDown(KeyType::SNEAK) & 0x1) << 6) |
+ ( (u32)(isLeftPressed() & 0x1) << 7) |
+ ( (u32)(isRightPressed() & 0x1) << 8
);
#ifdef ANDROID
@@ -3277,12 +3483,12 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash)
//u16 damage = event.player_damage.amount;
//infostream<<"Player damage: "<<damage<<std::endl;
- *damage_flash += 100.0;
- *damage_flash += 8.0 * event.player_damage.amount;
+ *damage_flash += 95.0 + 3.2 * event.player_damage.amount;
+ *damage_flash = MYMIN(*damage_flash, 127.0);
player->hurt_tilt_timer = 1.5;
- player->hurt_tilt_strength = event.player_damage.amount / 4;
- player->hurt_tilt_strength = rangelim(player->hurt_tilt_strength, 1.0, 4.0);
+ player->hurt_tilt_strength =
+ rangelim(event.player_damage.amount / 4, 1.0, 4.0);
MtEvent *e = new SimpleTriggerEvent("PlayerDamage");
gamedef->event()->put(e);
@@ -3291,7 +3497,7 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash)
cam->camera_pitch = event.player_force_move.pitch;
} else if (event.type == CE_DEATHSCREEN) {
show_deathscreen(&current_formspec, client, gamedef, texture_src,
- device, client);
+ device, &input->joystick, client);
chat_backend->addMessage(L"", L"You died.");
@@ -3301,13 +3507,21 @@ void Game::processClientEvents(CameraOrientation *cam, float *damage_flash)
player->hurt_tilt_strength = 0;
} else if (event.type == CE_SHOW_FORMSPEC) {
- FormspecFormSource *fs_src =
- new FormspecFormSource(*(event.show_formspec.formspec));
- TextDestPlayerInventory *txt_dst =
- new TextDestPlayerInventory(client, *(event.show_formspec.formname));
-
- create_formspec_menu(&current_formspec, client, gamedef,
- texture_src, device, fs_src, txt_dst, client);
+ if (*(event.show_formspec.formspec) == "") {
+ if (current_formspec && ( *(event.show_formspec.formname) == "" || *(event.show_formspec.formname) == cur_formname) ){
+ current_formspec->quitMenu();
+ }
+ } else {
+ FormspecFormSource *fs_src =
+ new FormspecFormSource(*(event.show_formspec.formspec));
+ TextDestPlayerInventory *txt_dst =
+ new TextDestPlayerInventory(client, *(event.show_formspec.formname));
+
+ create_formspec_menu(&current_formspec, client, gamedef,
+ texture_src, device, &input->joystick,
+ fs_src, txt_dst, client);
+ cur_formname = *(event.show_formspec.formname);
+ }
delete(event.show_formspec.formspec);
delete(event.show_formspec.formname);
@@ -3488,13 +3702,19 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time,
if (mlist && client->getPlayerItem() < mlist->getSize())
playeritem = mlist->getItem(client->getPlayerItem());
}
+ if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
+ InventoryList *hlist = local_inventory->getList("hand");
+ if (hlist)
+ playeritem = hlist->getItem(0);
+ }
+
ToolCapabilities playeritem_toolcap =
playeritem.getToolCapabilities(itemdef_manager);
v3s16 old_camera_offset = camera->getOffset();
- if (input->wasKeyDown(keycache.key[KeyCache::KEYMAP_ID_CAMERA_MODE])) {
+ if (wasKeyDown(KeyType::CAMERA_MODE)) {
GenericCAO *playercao = player->getCAO();
// If playercao not loaded, don't change camera
@@ -3572,6 +3792,11 @@ void Game::processPlayerInteraction(GameRunData *runData,
playeritem = mlist->getItem(client->getPlayerItem());
}
+ if (playeritem.getDefinition(itemdef_manager).name.empty()) { // override the hand
+ InventoryList *hlist = local_inventory->getList("hand");
+ if (hlist)
+ playeritem = hlist->getItem(0);
+ }
const ItemDefinition &playeritem_def =
playeritem.getDefinition(itemdef_manager);
@@ -3637,7 +3862,7 @@ void Game::processPlayerInteraction(GameRunData *runData,
- pointing away from node
*/
if (runData->digging) {
- if (input->getLeftReleased()) {
+ if (getLeftReleased()) {
infostream << "Left button released"
<< " (stopped digging)" << std::endl;
runData->digging = false;
@@ -3663,7 +3888,7 @@ void Game::processPlayerInteraction(GameRunData *runData,
}
}
- if (!runData->digging && runData->ldown_for_dig && !input->getLeftState()) {
+ if (!runData->digging && runData->ldown_for_dig && !isLeftPressed()) {
runData->ldown_for_dig = false;
}
@@ -3671,13 +3896,13 @@ void Game::processPlayerInteraction(GameRunData *runData,
soundmaker->m_player_leftpunch_sound.name = "";
- if (input->getRightState())
+ if (isRightPressed())
runData->repeat_rightclick_timer += dtime;
else
runData->repeat_rightclick_timer = 0;
- if (playeritem_def.usable && input->getLeftState()) {
- if (input->getLeftClicked())
+ if (playeritem_def.usable && isLeftPressed()) {
+ if (getLeftClicked())
client->interact(4, pointed);
} else if (pointed.type == POINTEDTHING_NODE) {
ToolCapabilities playeritem_toolcap =
@@ -3687,23 +3912,29 @@ void Game::processPlayerInteraction(GameRunData *runData,
} else if (pointed.type == POINTEDTHING_OBJECT) {
handlePointingAtObject(runData, pointed, playeritem,
player_position, show_debug);
- } else if (input->getLeftState()) {
+ } else if (isLeftPressed()) {
// When button is held down in air, show continuous animation
runData->left_punch = true;
- } else if (input->getRightClicked()) {
+ } else if (getRightClicked()) {
handlePointingAtNothing(runData, playeritem);
}
runData->pointed_old = pointed;
- if (runData->left_punch || input->getLeftClicked())
+ if (runData->left_punch || getLeftClicked())
camera->setDigging(0); // left click animation
input->resetLeftClicked();
input->resetRightClicked();
+ input->joystick.clearWasKeyDown(KeyType::MOUSE_L);
+ input->joystick.clearWasKeyDown(KeyType::MOUSE_R);
+
input->resetLeftReleased();
input->resetRightReleased();
+
+ input->joystick.clearWasKeyReleased(KeyType::MOUSE_L);
+ input->joystick.clearWasKeyReleased(KeyType::MOUSE_R);
}
@@ -3741,19 +3972,19 @@ void Game::handlePointingAtNode(GameRunData *runData,
}
}
- if (runData->nodig_delay_timer <= 0.0 && input->getLeftState()
+ if (runData->nodig_delay_timer <= 0.0 && isLeftPressed()
&& client->checkPrivilege("interact")) {
handleDigging(runData, pointed, nodepos, playeritem_toolcap, dtime);
}
- if ((input->getRightClicked() ||
+ if ((getRightClicked() ||
runData->repeat_rightclick_timer >= m_repeat_right_click_time) &&
client->checkPrivilege("interact")) {
runData->repeat_rightclick_timer = 0;
infostream << "Ground right-clicked" << std::endl;
if (meta && meta->getString("formspec") != "" && !random_input
- && !input->isKeyDown(getKeySetting("keymap_sneak"))) {
+ && !isKeyDown(KeyType::SNEAK)) {
infostream << "Launching custom inventory view" << std::endl;
InventoryLocation inventoryloc;
@@ -3764,7 +3995,8 @@ void Game::handlePointingAtNode(GameRunData *runData,
TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client);
create_formspec_menu(&current_formspec, client, gamedef,
- texture_src, device, fs_src, txt_dst, client);
+ texture_src, device, &input->joystick, fs_src, txt_dst, client);
+ cur_formname = "";
current_formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
} else {
@@ -3818,7 +4050,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
runData->selected_object->debugInfoText()));
}
- if (input->getLeftState()) {
+ if (isLeftPressed()) {
bool do_punch = false;
bool do_punch_damage = false;
@@ -3828,7 +4060,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
runData->object_hit_delay_timer = object_hit_delay;
}
- if (input->getLeftClicked())
+ if (getLeftClicked())
do_punch = true;
if (do_punch) {
@@ -3848,7 +4080,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
if (!disable_send)
client->interact(0, pointed);
}
- } else if (input->getRightClicked()) {
+ } else if (getRightClicked()) {
infostream << "Right-clicked object" << std::endl;
client->interact(3, pointed); // place
}
@@ -3992,7 +4224,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
if (draw_control->range_all) {
runData->fog_range = 100000 * BS;
} else {
- runData->fog_range = 0.9 * draw_control->wanted_range * BS;
+ runData->fog_range = draw_control->wanted_range * BS;
}
/*
@@ -4003,7 +4235,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
float direct_brightness;
bool sunlight_seen;
- if (g_settings->getBool("free_move")) {
+ if (m_cache_enable_noclip && m_cache_enable_free_move) {
direct_brightness = time_brightness;
sunlight_seen = true;
} else {
@@ -4070,11 +4302,11 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
driver->setFog(
sky->getBgColor(),
video::EFT_FOG_LINEAR,
- runData->fog_range * 0.4,
+ runData->fog_range * m_cache_fog_start,
runData->fog_range * 1.0,
0.01,
false, // pixel fog
- false // range fog
+ true // range fog
);
} else {
driver->setFog(
@@ -4118,8 +4350,14 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
if (mlist && (client->getPlayerItem() < mlist->getSize())) {
ItemStack item = mlist->getItem(client->getPlayerItem());
+ if (item.getDefinition(itemdef_manager).name.empty()) { // override the hand
+ InventoryList *hlist = local_inventory->getList("hand");
+ if (hlist)
+ item = hlist->getItem(0);
+ }
camera->wield(item);
}
+
runData->update_wielded_item_trigger = false;
}
@@ -4181,10 +4419,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
Damage flash
*/
if (runData->damage_flash > 0.0) {
- video::SColor color(std::min(runData->damage_flash, 180.0f),
- 180,
- 0,
- 0);
+ video::SColor color(runData->damage_flash, 180, 0, 0);
driver->draw2DRectangle(color,
core::rect<s32>(0, 0, screensize.X, screensize.Y),
NULL);
@@ -4226,23 +4461,12 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats,
inline static const char *yawToDirectionString(int yaw)
{
- // NOTE: TODO: This can be done mathematically without the else/else-if
- // cascade.
-
- const char *player_direction;
+ static const char *direction[4] = {"North [+Z]", "West [-X]", "South [-Z]", "East [+X]"};
yaw = wrapDegrees_0_360(yaw);
+ yaw = (yaw + 45) % 360 / 90;
- if (yaw >= 45 && yaw < 135)
- player_direction = "West [-X]";
- else if (yaw >= 135 && yaw < 225)
- player_direction = "South [-Z]";
- else if (yaw >= 225 && yaw < 315)
- player_direction = "East [+X]";
- else
- player_direction = "North [+Z]";
-
- return player_direction;
+ return direction[yaw];
}
@@ -4275,12 +4499,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
<< ", v_range = " << draw_control->wanted_range
<< std::setprecision(3)
<< ", RTT = " << client->getRTT();
- guitext->setText(utf8_to_wide(os.str()).c_str());
- guitext->setVisible(true);
- } else if (flags.show_hud || flags.show_chat) {
- std::ostringstream os(std::ios_base::binary);
- os << PROJECT_NAME_C " " << g_version_hash;
- guitext->setText(utf8_to_wide(os.str()).c_str());
+ setStaticText(guitext, utf8_to_wide(os.str()).c_str());
guitext->setVisible(true);
} else {
guitext->setVisible(false);
@@ -4317,7 +4536,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
}
}
- guitext2->setText(utf8_to_wide(os.str()).c_str());
+ setStaticText(guitext2, utf8_to_wide(os.str()).c_str());
guitext2->setVisible(true);
core::rect<s32> rect(
@@ -4329,7 +4548,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
guitext2->setVisible(false);
}
- guitext_info->setText(infotext.c_str());
+ setStaticText(guitext_info, infotext.c_str());
guitext_info->setVisible(flags.show_hud && g_menumgr.menuCount() == 0);
float statustext_time_max = 1.5;
@@ -4343,7 +4562,7 @@ void Game::updateGui(float *statustext_time, const RunStats &stats,
}
}
- guitext_status->setText(statustext.c_str());
+ setStaticText(guitext_status, statustext.c_str());
guitext_status->setVisible(!statustext.empty());
if (!statustext.empty()) {
@@ -4447,14 +4666,30 @@ void Game::settingChangedCallback(const std::string &setting_name, void *data)
void Game::readSettings()
{
- m_cache_doubletap_jump = g_settings->getBool("doubletap_jump");
- m_cache_enable_clouds = g_settings->getBool("enable_clouds");
- m_cache_enable_particles = g_settings->getBool("enable_particles");
- m_cache_enable_fog = g_settings->getBool("enable_fog");
- m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity");
- m_repeat_right_click_time = g_settings->getFloat("repeat_rightclick_time");
+ m_cache_doubletap_jump = g_settings->getBool("doubletap_jump");
+ m_cache_enable_clouds = g_settings->getBool("enable_clouds");
+ m_cache_enable_joysticks = g_settings->getBool("enable_joysticks");
+ m_cache_enable_particles = g_settings->getBool("enable_particles");
+ m_cache_enable_fog = g_settings->getBool("enable_fog");
+ m_cache_mouse_sensitivity = g_settings->getFloat("mouse_sensitivity");
+ m_cache_joystick_frustum_sensitivity = g_settings->getFloat("joystick_frustum_sensitivity");
+ m_repeat_right_click_time = g_settings->getFloat("repeat_rightclick_time");
+
+ m_cache_enable_noclip = g_settings->getBool("noclip");
+ m_cache_enable_free_move = g_settings->getBool("free_move");
+
+ m_cache_fog_start = g_settings->getFloat("fog_start");
+
+ m_cache_cam_smoothing = 0;
+ if (g_settings->getBool("cinematic"))
+ m_cache_cam_smoothing = 1 - g_settings->getFloat("cinematic_camera_smoothing");
+ else
+ m_cache_cam_smoothing = 1 - g_settings->getFloat("camera_smoothing");
+ m_cache_fog_start = rangelim(m_cache_fog_start, 0.0f, 0.99f);
+ m_cache_cam_smoothing = rangelim(m_cache_cam_smoothing, 0.01f, 1.0f);
m_cache_mouse_sensitivity = rangelim(m_cache_mouse_sensitivity, 0.001, 100.0);
+
}
/****************************************************************************/
diff --git a/src/game.h b/src/game.h
index e1f4e9346..df32e3397 100644
--- a/src/game.h
+++ b/src/game.h
@@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_extrabloated.h"
#include <string>
+#include "client/keys.h"
+#include "client/joystick_controller.h"
#include "keycode.h"
#include <list>
@@ -110,6 +112,9 @@ public:
virtual bool isKeyDown(const KeyPress &keyCode) = 0;
virtual bool wasKeyDown(const KeyPress &keyCode) = 0;
+ virtual void listenForKey(const KeyPress &keyCode) {}
+ virtual void dontListenForKeys() {}
+
virtual v2s32 getMousePos() = 0;
virtual void setMousePos(s32 x, s32 y) = 0;
@@ -131,6 +136,8 @@ public:
virtual void step(float dtime) {}
virtual void clear() {}
+
+ JoystickController joystick;
};
class ChatBackend; /* to avoid having to include chat.h */
diff --git a/src/genericobject.cpp b/src/genericobject.cpp
index 368cae1ff..c4660cf44 100644
--- a/src/genericobject.cpp
+++ b/src/genericobject.cpp
@@ -182,3 +182,15 @@ std::string gob_cmd_update_nametag_attributes(video::SColor color)
writeARGB8(os, color);
return os.str();
}
+
+std::string gob_cmd_update_infant(u16 id, u8 type, std::string client_initialization_data)
+{
+ std::ostringstream os(std::ios::binary);
+ // command
+ writeU8(os, GENERIC_CMD_SPAWN_INFANT);
+ // parameters
+ writeU16(os, id);
+ writeU8(os, type);
+ os<<serializeLongString(client_initialization_data);
+ return os.str();
+}
diff --git a/src/genericobject.h b/src/genericobject.h
index b92570831..48e71db75 100644
--- a/src/genericobject.h
+++ b/src/genericobject.h
@@ -35,7 +35,8 @@ enum GenericCMD {
GENERIC_CMD_SET_BONE_POSITION,
GENERIC_CMD_ATTACH_TO,
GENERIC_CMD_SET_PHYSICS_OVERRIDE,
- GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES
+ GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES,
+ GENERIC_CMD_SPAWN_INFANT
};
#include "object_properties.h"
@@ -77,5 +78,7 @@ std::string gob_cmd_update_attachment(int parent_id, std::string bone, v3f posit
std::string gob_cmd_update_nametag_attributes(video::SColor color);
+std::string gob_cmd_update_infant(u16 id, u8 type, std::string client_initialization_data);
+
#endif
diff --git a/src/gettext.h b/src/gettext.h
index b8d27f77c..885d7ca2d 100644
--- a/src/gettext.h
+++ b/src/gettext.h
@@ -25,6 +25,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#if USE_GETTEXT
#include <libintl.h>
#else
+ // In certain environments, some standard headers like <iomanip>
+ // and <locale> include libintl.h. If libintl.h is included after
+ // we define our gettext macro below, this causes a syntax error
+ // at the declaration of the gettext function in libintl.h.
+ // Fix this by including such a header before defining the macro.
+ // See issue #4446.
+ // Note that we can't include libintl.h directly since we're in
+ // the USE_GETTEXT=0 case and can't assume that gettext is installed.
+ #include <locale>
+
#define gettext(String) String
#endif
diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp
index 17a1689c7..8dd5ab032 100644
--- a/src/guiChatConsole.cpp
+++ b/src/guiChatConsole.cpp
@@ -32,7 +32,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <string>
#if USE_FREETYPE
-#include "xCGUITTFont.h"
+ #include "xCGUITTFont.h"
#endif
inline u32 clamp_u8(s32 value)
@@ -340,13 +340,28 @@ void GUIChatConsole::drawText()
s32 x = (fragment.column + 1) * m_fontsize.X;
core::rect<s32> destrect(
x, y, x + m_fontsize.X * fragment.text.size(), y + m_fontsize.Y);
- m_font->draw(
- fragment.text.c_str(),
- destrect,
- video::SColor(255, 255, 255, 255),
- false,
- false,
- &AbsoluteClippingRect);
+
+
+ #if USE_FREETYPE
+ // Draw colored text if FreeType is enabled
+ irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(m_font);
+ tmp->draw(
+ fragment.text,
+ destrect,
+ video::SColor(255, 255, 255, 255),
+ false,
+ false,
+ &AbsoluteClippingRect);
+ #else
+ // Otherwise use standard text
+ m_font->draw(
+ fragment.text.c_str(),
+ destrect,
+ video::SColor(255, 255, 255, 255),
+ false,
+ false,
+ &AbsoluteClippingRect);
+ #endif
}
}
}
@@ -615,7 +630,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
}
else if(event.KeyInput.Char != 0 && !event.KeyInput.Control)
{
- #if (defined(linux) || defined(__linux))
+ #if (defined(__linux__))
wchar_t wc = L'_';
mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) );
prompt.input(wc);
diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp
index ba286a91c..a3c35f68d 100644
--- a/src/guiEngine.cpp
+++ b/src/guiEngine.cpp
@@ -37,6 +37,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "fontengine.h"
#include "guiscalingfilter.h"
+#include "irrlicht_changes/static_text.h"
#ifdef __ANDROID__
#include "client/tile.h"
@@ -130,6 +131,7 @@ void MenuMusicFetcher::fetchSounds(const std::string &name,
/** GUIEngine */
/******************************************************************************/
GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
+ JoystickController *joystick,
gui::IGUIElement* parent,
IMenuManager *menumgr,
scene::ISceneManager* smgr,
@@ -172,21 +174,22 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
m_sound_manager = &dummySoundManager;
//create topleft header
- std::wstring t = utf8_to_wide(std::string(PROJECT_NAME_C " ") +
- g_version_hash);
+ m_toplefttext = L"";
- core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(t), g_fontengine->getTextHeight());
+ core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(m_toplefttext.c_str()),
+ g_fontengine->getTextHeight());
rect += v2s32(4, 0);
m_irr_toplefttext =
- m_device->getGUIEnvironment()->addStaticText(t.c_str(),
- rect,false,true,0,-1);
+ addStaticText(m_device->getGUIEnvironment(), m_toplefttext,
+ rect, false, true, 0, -1);
//create formspecsource
m_formspecgui = new FormspecFormSource("");
/* Create menu */
m_menu = new GUIFormSpecMenu(m_device,
+ joystick,
m_parent,
-1,
m_menumanager,
@@ -430,7 +433,7 @@ void GUIEngine::drawOverlay(video::IVideoDriver* driver)
video::ITexture* texture = m_textures[TEX_LAYER_OVERLAY].texture;
- /* If no texture, draw background of solid color */
+ /* If no texture, draw nothing */
if(!texture)
return;
@@ -459,7 +462,7 @@ void GUIEngine::drawHeader(video::IVideoDriver* driver)
v2s32 splashsize(((f32)texture->getOriginalSize().Width) * mult,
((f32)texture->getOriginalSize().Height) * mult);
- // Don't draw the header is there isn't enough room
+ // Don't draw the header if there isn't enough room
s32 free_space = (((s32)screensize.Height)-320)/2;
if (free_space > splashsize.Y) {
@@ -567,18 +570,9 @@ bool GUIEngine::downloadFile(std::string url, std::string target)
}
/******************************************************************************/
-void GUIEngine::setTopleftText(std::string append)
+void GUIEngine::setTopleftText(const std::string &text)
{
- std::wstring toset = utf8_to_wide(std::string(PROJECT_NAME_C " ") +
- g_version_hash);
-
- if (append != "")
- {
- toset += L" / ";
- toset += utf8_to_wide(append);
- }
-
- m_irr_toplefttext->setText(toset.c_str());
+ m_toplefttext = utf8_to_wide(text);
updateTopLeftTextSize();
}
@@ -586,15 +580,14 @@ void GUIEngine::setTopleftText(std::string append)
/******************************************************************************/
void GUIEngine::updateTopLeftTextSize()
{
- std::wstring text = m_irr_toplefttext->getText();
-
- core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(text), g_fontengine->getTextHeight());
- rect += v2s32(4, 0);
+ core::rect<s32> rect(0, 0, g_fontengine->getTextWidth(m_toplefttext.c_str()),
+ g_fontengine->getTextHeight());
+ rect += v2s32(4, 0);
m_irr_toplefttext->remove();
m_irr_toplefttext =
- m_device->getGUIEnvironment()->addStaticText(text.c_str(),
- rect,false,true,0,-1);
+ addStaticText(m_device->getGUIEnvironment(), m_toplefttext,
+ rect, false, true, 0, -1);
}
/******************************************************************************/
diff --git a/src/guiEngine.h b/src/guiEngine.h
index d527f7222..897244808 100644
--- a/src/guiEngine.h
+++ b/src/guiEngine.h
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "guiFormSpecMenu.h"
#include "sound.h"
#include "client/tile.h"
+#include "util/enriched_string.h"
/******************************************************************************/
/* Typedefs and macros */
@@ -148,7 +149,8 @@ public:
* @param smgr scene manager to add scene elements to
* @param data struct to transfer data to main game handling
*/
- GUIEngine( irr::IrrlichtDevice* dev,
+ GUIEngine(irr::IrrlichtDevice* dev,
+ JoystickController *joystick,
gui::IGUIElement* parent,
IMenuManager *menumgr,
scene::ISceneManager* smgr,
@@ -268,13 +270,15 @@ private:
void drawVersion();
/**
- * specify text to be appended to version string
+ * specify text to appear as top left string
* @param text to set
*/
- void setTopleftText(std::string append);
+ void setTopleftText(const std::string &text);
/** pointer to gui element shown at topleft corner */
irr::gui::IGUIStaticText* m_irr_toplefttext;
+ /** and text that is in it */
+ EnrichedString m_toplefttext;
/** initialize cloud subsystem */
void cloudInit();
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp
index 2bf06c1d6..bfc7a9b79 100644
--- a/src/guiFormSpecMenu.cpp
+++ b/src/guiFormSpecMenu.cpp
@@ -50,6 +50,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/hex.h"
#include "util/numeric.h"
#include "util/string.h" // for parseColorString()
+#include "irrlicht_changes/static_text.h"
#include "guiscalingfilter.h"
#if USE_FREETYPE && IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9
@@ -78,6 +79,7 @@ static unsigned int font_line_height(gui::IGUIFont *font)
}
GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
+ JoystickController *joystick,
gui::IGUIElement* parent, s32 id, IMenuManager *menumgr,
InventoryManager *invmgr, IGameDef *gamedef,
ISimpleTextureSource *tsrc, IFormSource* fsrc, TextDest* tdst,
@@ -101,6 +103,8 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
m_text_dst(tdst),
m_formspec_version(0),
m_focused_element(""),
+ m_joystick(joystick),
+ current_field_enter_pending(""),
m_font(NULL),
m_remap_dbl_click(remap_dbl_click)
#ifdef __ANDROID__
@@ -249,37 +253,6 @@ std::vector<std::string>* GUIFormSpecMenu::getDropDownValues(const std::string &
return NULL;
}
-static std::vector<std::string> split(const std::string &s, char delim)
-{
- std::vector<std::string> tokens;
-
- std::string current = "";
- bool last_was_escape = false;
- for (unsigned int i = 0; i < s.size(); i++) {
- char si = s.c_str()[i];
- if (last_was_escape) {
- current += '\\';
- current += si;
- last_was_escape = false;
- } else {
- if (si == delim) {
- tokens.push_back(current);
- current = "";
- last_was_escape = false;
- } else if (si == '\\') {
- last_was_escape = true;
- } else {
- current += si;
- last_was_escape = false;
- }
- }
- }
- //push last element
- tokens.push_back(current);
-
- return tokens;
-}
-
void GUIFormSpecMenu::parseSize(parserData* data,std::string element)
{
std::vector<std::string> parts = split(element,',');
@@ -306,6 +279,32 @@ void GUIFormSpecMenu::parseSize(parserData* data,std::string element)
errorstream<< "Invalid size element (" << parts.size() << "): '" << element << "'" << std::endl;
}
+void GUIFormSpecMenu::parseContainer(parserData* data, std::string element)
+{
+ std::vector<std::string> parts = split(element, ',');
+
+ if (parts.size() >= 2) {
+ if (parts[1].find(';') != std::string::npos)
+ parts[1] = parts[1].substr(0, parts[1].find(';'));
+
+ container_stack.push(pos_offset);
+ pos_offset.X += MYMAX(0, stof(parts[0]));
+ pos_offset.Y += MYMAX(0, stof(parts[1]));
+ return;
+ }
+ errorstream<< "Invalid container start element (" << parts.size() << "): '" << element << "'" << std::endl;
+}
+
+void GUIFormSpecMenu::parseContainerEnd(parserData* data)
+{
+ if (container_stack.empty()) {
+ errorstream<< "Invalid container end element, no matching container start element" << std::endl;
+ } else {
+ pos_offset = container_stack.top();
+ container_stack.pop();
+ }
+}
+
void GUIFormSpecMenu::parseList(parserData* data,std::string element)
{
if (m_gamedef == 0) {
@@ -336,7 +335,7 @@ void GUIFormSpecMenu::parseList(parserData* data,std::string element)
else
loc.deSerialize(location);
- v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+ v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
@@ -413,7 +412,7 @@ void GUIFormSpecMenu::parseCheckbox(parserData* data,std::string element)
MY_CHECKPOS("checkbox",0);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float) spacing.X;
pos.Y += stof(v_pos[1]) * (float) spacing.Y;
@@ -464,7 +463,7 @@ void GUIFormSpecMenu::parseScrollBar(parserData* data, std::string element)
MY_CHECKPOS("scrollbar",0);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float) spacing.X;
pos.Y += stof(v_pos[1]) * (float) spacing.Y;
@@ -522,10 +521,10 @@ void GUIFormSpecMenu::parseImage(parserData* data,std::string element)
std::vector<std::string> v_geom = split(parts[1],',');
std::string name = unescape_string(parts[2]);
- MY_CHECKPOS("image",0);
- MY_CHECKGEOM("image",1);
+ MY_CHECKPOS("image", 0);
+ MY_CHECKGEOM("image", 1);
- v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+ v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float) spacing.X;
pos.Y += stof(v_pos[1]) * (float) spacing.Y;
@@ -533,23 +532,21 @@ void GUIFormSpecMenu::parseImage(parserData* data,std::string element)
geom.X = stof(v_geom[0]) * (float)imgsize.X;
geom.Y = stof(v_geom[1]) * (float)imgsize.Y;
- if(!data->explicit_size)
+ if (!data->explicit_size)
warningstream<<"invalid use of image without a size[] element"<<std::endl;
m_images.push_back(ImageDrawSpec(name, pos, geom));
return;
- }
-
- if (parts.size() == 2) {
+ } else if (parts.size() == 2) {
std::vector<std::string> v_pos = split(parts[0],',');
std::string name = unescape_string(parts[1]);
- MY_CHECKPOS("image",0);
+ MY_CHECKPOS("image", 0);
- v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+ v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float) spacing.X;
pos.Y += stof(v_pos[1]) * (float) spacing.Y;
- if(!data->explicit_size)
+ if (!data->explicit_size)
warningstream<<"invalid use of image without a size[] element"<<std::endl;
m_images.push_back(ImageDrawSpec(name, pos));
return;
@@ -571,7 +568,7 @@ void GUIFormSpecMenu::parseItemImage(parserData* data,std::string element)
MY_CHECKPOS("itemimage",0);
MY_CHECKGEOM("itemimage",1);
- v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+ v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float) spacing.X;
pos.Y += stof(v_pos[1]) * (float) spacing.Y;
@@ -603,7 +600,7 @@ void GUIFormSpecMenu::parseButton(parserData* data,std::string element,
MY_CHECKPOS("button",0);
MY_CHECKGEOM("button",1);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
@@ -656,25 +653,25 @@ void GUIFormSpecMenu::parseBackground(parserData* data,std::string element)
MY_CHECKPOS("background",0);
MY_CHECKGEOM("background",1);
- v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
- pos.X += stof(v_pos[0]) * (float)spacing.X - ((float)spacing.X-(float)imgsize.X)/2;
- pos.Y += stof(v_pos[1]) * (float)spacing.Y - ((float)spacing.Y-(float)imgsize.Y)/2;
+ v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
+ pos.X += stof(v_pos[0]) * (float)spacing.X - ((float)spacing.X - (float)imgsize.X)/2;
+ pos.Y += stof(v_pos[1]) * (float)spacing.Y - ((float)spacing.Y - (float)imgsize.Y)/2;
v2s32 geom;
geom.X = stof(v_geom[0]) * (float)spacing.X;
geom.Y = stof(v_geom[1]) * (float)spacing.Y;
- if (parts.size() == 4) {
- m_clipbackground = is_yes(parts[3]);
- if (m_clipbackground) {
- pos.X = stoi(v_pos[0]); //acts as offset
- pos.Y = stoi(v_pos[1]); //acts as offset
- }
+ if (!data->explicit_size)
+ warningstream<<"invalid use of background without a size[] element"<<std::endl;
+
+ bool clip = false;
+ if (parts.size() == 4 && is_yes(parts[3])) {
+ pos.X = stoi(v_pos[0]); //acts as offset
+ pos.Y = stoi(v_pos[1]); //acts as offset
+ clip = true;
}
+ m_backgrounds.push_back(ImageDrawSpec(name, pos, geom, clip));
- if(!data->explicit_size)
- warningstream<<"invalid use of background without a size[] element"<<std::endl;
- m_backgrounds.push_back(ImageDrawSpec(name, pos, geom));
return;
}
errorstream<< "Invalid background element(" << parts.size() << "): '" << element << "'" << std::endl;
@@ -732,7 +729,7 @@ void GUIFormSpecMenu::parseTable(parserData* data,std::string element)
MY_CHECKPOS("table",0);
MY_CHECKGEOM("table",1);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
@@ -803,7 +800,7 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element)
MY_CHECKPOS("textlist",0);
MY_CHECKGEOM("textlist",1);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
@@ -868,7 +865,7 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element)
MY_CHECKPOS("dropdown",0);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
@@ -917,12 +914,22 @@ void GUIFormSpecMenu::parseDropDown(parserData* data,std::string element)
<< element << "'" << std::endl;
}
+void GUIFormSpecMenu::parseFieldCloseOnEnter(parserData *data,
+ const std::string &element)
+{
+ std::vector<std::string> parts = split(element,';');
+ if (parts.size() == 2 ||
+ (parts.size() > 2 && m_formspec_version > FORMSPEC_API_VERSION)) {
+ field_close_on_enter[parts[0]] = is_yes(parts[1]);
+ }
+}
+
void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
{
std::vector<std::string> parts = split(element,';');
- if ((parts.size() == 4) ||
- ((parts.size() > 4) && (m_formspec_version > FORMSPEC_API_VERSION)))
+ if ((parts.size() == 4) || (parts.size() == 5) ||
+ ((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION)))
{
std::vector<std::string> v_pos = split(parts[0],',');
std::vector<std::string> v_geom = split(parts[1],',');
@@ -932,7 +939,7 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
MY_CHECKPOS("pwdfield",0);
MY_CHECKGEOM("pwdfield",1);
- v2s32 pos;
+ v2s32 pos = pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
@@ -966,7 +973,7 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
int font_height = g_fontengine->getTextHeight();
rect.UpperLeftCorner.Y -= font_height;
rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
- Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, 0);
+ addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, 0);
}
e->setPasswordBox(true,L'*');
@@ -979,6 +986,14 @@ void GUIFormSpecMenu::parsePwdField(parserData* data,std::string element)
evt.KeyInput.Shift = 0;
evt.KeyInput.PressedDown = true;
e->OnEvent(evt);
+
+ if (parts.size() >= 5) {
+ // TODO: remove after 2016-11-03
+ warningstream << "pwdfield: use field_close_on_enter[name, enabled]" <<
+ " instead of the 5th param" << std::endl;
+ field_close_on_enter[name] = is_yes(parts[4]);
+ }
+
m_fields.push_back(spec);
return;
}
@@ -997,7 +1012,7 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
if(data->explicit_size)
warningstream<<"invalid use of unpositioned \"field\" in inventory"<<std::endl;
- v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+ v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
pos.Y = ((m_fields.size()+2)*60);
v2s32 size = DesiredRect.getSize();
@@ -1021,7 +1036,7 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
if (name == "")
{
// spec field id to 0, this stops submit searching for a value that isn't there
- Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, spec.fid);
+ addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, spec.fid);
}
else
{
@@ -1056,10 +1071,17 @@ void GUIFormSpecMenu::parseSimpleField(parserData* data,
int font_height = g_fontengine->getTextHeight();
rect.UpperLeftCorner.Y -= font_height;
rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
- Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, 0);
+ addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, 0);
}
}
+ if (parts.size() >= 4) {
+ // TODO: remove after 2016-11-03
+ warningstream << "field/simple: use field_close_on_enter[name, enabled]" <<
+ " instead of the 4th param" << std::endl;
+ field_close_on_enter[name] = is_yes(parts[3]);
+ }
+
m_fields.push_back(spec);
}
@@ -1076,9 +1098,9 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,
MY_CHECKPOS(type,0);
MY_CHECKGEOM(type,1);
- v2s32 pos;
- pos.X = stof(v_pos[0]) * (float) spacing.X;
- pos.Y = stof(v_pos[1]) * (float) spacing.Y;
+ v2s32 pos = pos_offset * spacing;
+ pos.X += stof(v_pos[0]) * (float) spacing.X;
+ pos.Y += stof(v_pos[1]) * (float) spacing.Y;
v2s32 geom;
@@ -1117,7 +1139,7 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,
if (name == "")
{
// spec field id to 0, this stops submit searching for a value that isn't there
- Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, spec.fid);
+ addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, spec.fid);
}
else
{
@@ -1161,9 +1183,17 @@ void GUIFormSpecMenu::parseTextArea(parserData* data,
int font_height = g_fontengine->getTextHeight();
rect.UpperLeftCorner.Y -= font_height;
rect.LowerRightCorner.Y = rect.UpperLeftCorner.Y + font_height;
- Environment->addStaticText(spec.flabel.c_str(), rect, false, true, this, 0);
+ addStaticText(Environment, spec.flabel.c_str(), rect, false, true, this, 0);
}
}
+
+ if (parts.size() >= 6) {
+ // TODO: remove after 2016-11-03
+ warningstream << "field/textarea: use field_close_on_enter[name, enabled]" <<
+ " instead of the 6th param" << std::endl;
+ field_close_on_enter[name] = is_yes(parts[5]);
+ }
+
m_fields.push_back(spec);
}
@@ -1177,8 +1207,8 @@ void GUIFormSpecMenu::parseField(parserData* data,std::string element,
return;
}
- if ((parts.size() == 5) ||
- ((parts.size() > 5) && (m_formspec_version > FORMSPEC_API_VERSION)))
+ if ((parts.size() == 5) || (parts.size() == 6) ||
+ ((parts.size() > 6) && (m_formspec_version > FORMSPEC_API_VERSION)))
{
parseTextArea(data,parts,type);
return;
@@ -1198,7 +1228,7 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element)
MY_CHECKPOS("label",0);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += (stof(v_pos[1]) + 7.0/30.0) * (float)spacing.Y;
@@ -1230,7 +1260,7 @@ void GUIFormSpecMenu::parseLabel(parserData* data,std::string element)
258+m_fields.size()
);
gui::IGUIStaticText *e =
- Environment->addStaticText(spec.flabel.c_str(),
+ addStaticText(Environment, spec.flabel.c_str(),
rect, false, false, this, spec.fid);
e->setTextAlignment(gui::EGUIA_UPPERLEFT,
gui::EGUIA_CENTER);
@@ -1255,7 +1285,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element)
MY_CHECKPOS("vertlabel",1);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
@@ -1284,7 +1314,7 @@ void GUIFormSpecMenu::parseVertLabel(parserData* data,std::string element)
258+m_fields.size()
);
gui::IGUIStaticText *t =
- Environment->addStaticText(spec.flabel.c_str(), rect, false, false, this, spec.fid);
+ addStaticText(Environment, spec.flabel.c_str(), rect, false, false, this, spec.fid);
t->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER);
m_fields.push_back(spec);
return;
@@ -1309,7 +1339,7 @@ void GUIFormSpecMenu::parseImageButton(parserData* data,std::string element,
MY_CHECKPOS("imagebutton",0);
MY_CHECKGEOM("imagebutton",1);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
v2s32 geom;
@@ -1414,7 +1444,7 @@ void GUIFormSpecMenu::parseTabHeader(parserData* data,std::string element)
spec.ftype = f_TabHeader;
- v2s32 pos(0,0);
+ v2s32 pos = pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y - m_btn_height * 2;
v2s32 geom;
@@ -1479,7 +1509,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
MY_CHECKPOS("itemimagebutton",0);
MY_CHECKGEOM("itemimagebutton",1);
- v2s32 pos = padding;
+ v2s32 pos = padding + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float)spacing.X;
pos.Y += stof(v_pos[1]) * (float)spacing.Y;
v2s32 geom;
@@ -1517,7 +1547,7 @@ void GUIFormSpecMenu::parseItemImageButton(parserData* data,std::string element)
rect+=data->basepos-padding;
spec.rect=rect;
m_fields.push_back(spec);
- pos = padding + AbsoluteRect.UpperLeftCorner;
+ pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float) spacing.X;
pos.Y += stof(v_pos[1]) * (float) spacing.Y;
m_itemimages.push_back(ImageDrawSpec("", item_name, e, pos, geom));
@@ -1540,7 +1570,7 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element)
MY_CHECKPOS("box",0);
MY_CHECKGEOM("box",1);
- v2s32 pos = padding + AbsoluteRect.UpperLeftCorner;
+ v2s32 pos = padding + AbsoluteRect.UpperLeftCorner + pos_offset * spacing;
pos.X += stof(v_pos[0]) * (float) spacing.X;
pos.Y += stof(v_pos[1]) * (float) spacing.Y;
@@ -1702,8 +1732,18 @@ void GUIFormSpecMenu::parseElement(parserData* data, std::string element)
std::string type = trim(parts[0]);
std::string description = trim(parts[1]);
+ if (type == "container") {
+ parseContainer(data, description);
+ return;
+ }
+
+ if (type == "container_end") {
+ parseContainerEnd(data);
+ return;
+ }
+
if (type == "list") {
- parseList(data,description);
+ parseList(data, description);
return;
}
@@ -1713,22 +1753,22 @@ void GUIFormSpecMenu::parseElement(parserData* data, std::string element)
}
if (type == "checkbox") {
- parseCheckbox(data,description);
+ parseCheckbox(data, description);
return;
}
if (type == "image") {
- parseImage(data,description);
+ parseImage(data, description);
return;
}
if (type == "item_image") {
- parseItemImage(data,description);
+ parseItemImage(data, description);
return;
}
- if ((type == "button") || (type == "button_exit")) {
- parseButton(data,description,type);
+ if (type == "button" || type == "button_exit") {
+ parseButton(data, description, type);
return;
}
@@ -1762,6 +1802,11 @@ void GUIFormSpecMenu::parseElement(parserData* data, std::string element)
return;
}
+ if (type == "field_close_on_enter") {
+ parseFieldCloseOnEnter(data, description);
+ return;
+ }
+
if (type == "pwdfield") {
parsePwdField(data,description);
return;
@@ -1905,12 +1950,11 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
m_slotbordercolor = video::SColor(200,0,0,0);
m_slotborder = false;
- m_clipbackground = false;
// Add tooltip
{
assert(m_tooltip_element == NULL);
// Note: parent != this so that the tooltip isn't clipped by the menu rectangle
- m_tooltip_element = Environment->addStaticText(L"",core::rect<s32>(0,0,110,18));
+ m_tooltip_element = addStaticText(Environment, L"",core::rect<s32>(0,0,110,18));
m_tooltip_element->enableOverrideColor(true);
m_tooltip_element->setBackgroundColor(m_default_tooltip_bgcolor);
m_tooltip_element->setDrawBackground(true);
@@ -2050,10 +2094,16 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
gui::IGUIFont *old_font = skin->getFont();
skin->setFont(m_font);
+ pos_offset = v2s32();
for (; i< elements.size(); i++) {
parseElement(&mydata, elements[i]);
}
+ if (!container_stack.empty()) {
+ errorstream << "Invalid formspec string: container was never closed!"
+ << std::endl;
+ }
+
// If there are fields without explicit size[], add a "Proceed"
// button and adjust size to fit all the fields.
if (m_fields.size() && !mydata.explicit_size) {
@@ -2255,7 +2305,6 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase,
std::wstring tooltip_text = L"";
if (hovering && !m_selected_item) {
tooltip_text = utf8_to_wide(item.getDefinition(m_gamedef->idef()).description);
- tooltip_text = unescape_enriched(tooltip_text);
}
if (tooltip_text != L"") {
std::vector<std::wstring> tt_rows = str_split(tooltip_text, L'\n');
@@ -2263,9 +2312,13 @@ void GUIFormSpecMenu::drawList(const ListDrawSpec &s, int phase,
m_tooltip_element->setOverrideColor(m_default_tooltip_color);
m_tooltip_element->setVisible(true);
this->bringToFront(m_tooltip_element);
- m_tooltip_element->setText(tooltip_text.c_str());
+ setStaticText(m_tooltip_element, tooltip_text.c_str());
s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height;
+#if (IRRLICHT_VERSION_MAJOR <= 1 && IRRLICHT_VERSION_MINOR <= 8 && IRRLICHT_VERSION_REVISION < 2) || USE_FREETYPE == 1
+ s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5;
+#else
s32 tooltip_height = m_tooltip_element->getTextHeight() + 5;
+#endif
v2u32 screenSize = driver->getScreenSize();
int tooltip_offset_x = m_btn_height;
int tooltip_offset_y = m_btn_height;
@@ -2309,6 +2362,7 @@ void GUIFormSpecMenu::drawSelectedItem()
core::rect<s32> imgrect(0,0,imgsize.X,imgsize.Y);
core::rect<s32> rect = imgrect + (m_pointer - imgrect.getCenter());
+ rect.constrainTo(driver->getViewPort());
drawItemStack(driver, m_font, stack, rect, NULL, m_gamedef, IT_ROT_DRAGGED);
}
@@ -2354,7 +2408,7 @@ void GUIFormSpecMenu::drawMenu()
// Image rectangle on screen
core::rect<s32> rect = imgrect + spec.pos;
- if (m_clipbackground) {
+ if (spec.clip) {
core::dimension2d<s32> absrec_size = AbsoluteRect.getSize();
rect = core::rect<s32>(AbsoluteRect.UpperLeftCorner.X - spec.pos.X,
AbsoluteRect.UpperLeftCorner.Y - spec.pos.Y,
@@ -2368,8 +2422,7 @@ void GUIFormSpecMenu::drawMenu()
core::rect<s32>(core::position2d<s32>(0,0),
core::dimension2di(texture->getOriginalSize())),
NULL/*&AbsoluteClippingRect*/, colors, true);
- }
- else {
+ } else {
errorstream << "GUIFormSpecMenu::drawMenu() Draw backgrounds unable to load texture:" << std::endl;
errorstream << "\t" << spec.name << std::endl;
}
@@ -2486,7 +2539,7 @@ void GUIFormSpecMenu::drawMenu()
Draw static text elements
*/
for (u32 i = 0; i < m_static_texts.size(); i++) {
- const StaticTextSpec &spec = m_static_texts[i];
+ const StaticTextSpec &spec = m_static_texts[i];
core::rect<s32> rect = spec.rect;
if (spec.parent_button && spec.parent_button->isPressed()) {
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
@@ -2531,8 +2584,10 @@ void GUIFormSpecMenu::drawMenu()
iter != m_fields.end(); ++iter) {
if (iter->fid == id && m_tooltips[iter->fname].tooltip != L"") {
if (m_old_tooltip != m_tooltips[iter->fname].tooltip) {
+ m_tooltip_element->setBackgroundColor(m_tooltips[iter->fname].bgcolor);
+ m_tooltip_element->setOverrideColor(m_tooltips[iter->fname].color);
m_old_tooltip = m_tooltips[iter->fname].tooltip;
- m_tooltip_element->setText(m_tooltips[iter->fname].tooltip.c_str());
+ setStaticText(m_tooltip_element, m_tooltips[iter->fname].tooltip.c_str());
std::vector<std::wstring> tt_rows = str_split(m_tooltips[iter->fname].tooltip, L'\n');
s32 tooltip_width = m_tooltip_element->getTextWidth() + m_btn_height;
s32 tooltip_height = m_tooltip_element->getTextHeight() * tt_rows.size() + 5;
@@ -2554,8 +2609,6 @@ void GUIFormSpecMenu::drawMenu()
core::position2d<s32>(tooltip_x, tooltip_y),
core::dimension2d<s32>(tooltip_width, tooltip_height)));
}
- m_tooltip_element->setBackgroundColor(m_tooltips[iter->fname].bgcolor);
- m_tooltip_element->setOverrideColor(m_tooltips[iter->fname].color);
m_tooltip_element->setVisible(true);
this->bringToFront(m_tooltip_element);
break;
@@ -2564,6 +2617,8 @@ void GUIFormSpecMenu::drawMenu()
}
}
+ m_tooltip_element->draw();
+
/*
Draw dragged item stack
*/
@@ -2718,6 +2773,11 @@ void GUIFormSpecMenu::acceptInput(FormspecQuitMode quitmode=quit_mode_no)
current_keys_pending.key_enter = false;
}
+ if (!current_field_enter_pending.empty()) {
+ fields["key_enter_field"] = current_field_enter_pending;
+ current_field_enter_pending = "";
+ }
+
if (current_keys_pending.key_escape) {
fields["key_escape"] = "true";
current_keys_pending.key_escape = false;
@@ -3049,6 +3109,25 @@ bool GUIFormSpecMenu::preprocessEvent(const SEvent& event)
}
#endif
+ if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) {
+ /* TODO add a check like:
+ if (event.JoystickEvent != joystick_we_listen_for)
+ return false;
+ */
+ bool handled = m_joystick->handleEvent(event.JoystickEvent);
+ if (handled) {
+ if (m_joystick->wasKeyDown(KeyType::ESC)) {
+ tryClose();
+ } else if (m_joystick->wasKeyDown(KeyType::JUMP)) {
+ if (m_allowclose) {
+ acceptInput(quit_mode_accept);
+ quitMenu();
+ }
+ }
+ }
+ return handled;
+ }
+
return false;
}
@@ -3110,19 +3189,24 @@ bool GUIFormSpecMenu::DoubleClickDetection(const SEvent event)
return false;
}
+void GUIFormSpecMenu::tryClose()
+{
+ if (m_allowclose) {
+ doPause = false;
+ acceptInput(quit_mode_cancel);
+ quitMenu();
+ } else {
+ m_text_dst->gotText(L"MenuQuit");
+ }
+}
+
bool GUIFormSpecMenu::OnEvent(const SEvent& event)
{
if (event.EventType==EET_KEY_INPUT_EVENT) {
KeyPress kp(event.KeyInput);
if (event.KeyInput.PressedDown && ( (kp == EscapeKey) ||
(kp == getKeySetting("keymap_inventory")) || (kp == CancelKey))) {
- if (m_allowclose) {
- doPause = false;
- acceptInput(quit_mode_cancel);
- quitMenu();
- } else {
- m_text_dst->gotText(L"MenuQuit");
- }
+ tryClose();
return true;
} else if (m_client != NULL && event.KeyInput.PressedDown &&
(kp == getKeySetting("keymap_screenshot"))) {
@@ -3624,8 +3708,23 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) {
if (event.GUIEvent.Caller->getID() > 257) {
+ bool close_on_enter = true;
+ for (u32 i = 0; i < m_fields.size(); i++) {
+ FieldSpec &s = m_fields[i];
+ if (s.ftype == f_Unknown &&
+ s.fid == event.GUIEvent.Caller->getID()) {
+ current_field_enter_pending = s.fname;
+ UNORDERED_MAP<std::string, bool>::const_iterator it =
+ field_close_on_enter.find(s.fname);
+ if (it != field_close_on_enter.end())
+ close_on_enter = (*it).second;
+
+ break;
+ }
+ }
- if (m_allowclose) {
+ if (m_allowclose && close_on_enter) {
+ current_keys_pending.key_enter = true;
acceptInput(quit_mode_accept);
quitMenu();
} else {
diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h
index ef230c81c..95df11e6a 100644
--- a/src/guiFormSpecMenu.h
+++ b/src/guiFormSpecMenu.h
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define GUIINVENTORYMENU_HEADER
#include <utility>
+#include <stack>
#include "irrlichttypes_extrabloated.h"
#include "inventory.h"
@@ -29,7 +30,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "modalMenu.h"
#include "guiTable.h"
#include "network/networkprotocol.h"
+#include "client/joystick_controller.h"
#include "util/string.h"
+#include "util/enriched_string.h"
class IGameDef;
class InventoryManager;
@@ -141,9 +144,10 @@ class GUIFormSpecMenu : public GUIModalMenu
struct ImageDrawSpec
{
ImageDrawSpec():
- parent_button(NULL)
- {
- }
+ parent_button(NULL),
+ clip(false)
+ {}
+
ImageDrawSpec(const std::string &a_name,
const std::string &a_item_name,
gui::IGUIButton *a_parent_button,
@@ -153,9 +157,10 @@ class GUIFormSpecMenu : public GUIModalMenu
parent_button(a_parent_button),
pos(a_pos),
geom(a_geom),
- scale(true)
- {
- }
+ scale(true),
+ clip(false)
+ {}
+
ImageDrawSpec(const std::string &a_name,
const std::string &a_item_name,
const v2s32 &a_pos, const v2s32 &a_geom):
@@ -164,32 +169,36 @@ class GUIFormSpecMenu : public GUIModalMenu
parent_button(NULL),
pos(a_pos),
geom(a_geom),
- scale(true)
- {
- }
+ scale(true),
+ clip(false)
+ {}
+
ImageDrawSpec(const std::string &a_name,
- const v2s32 &a_pos, const v2s32 &a_geom):
+ const v2s32 &a_pos, const v2s32 &a_geom, bool clip=false):
name(a_name),
parent_button(NULL),
pos(a_pos),
geom(a_geom),
- scale(true)
- {
- }
+ scale(true),
+ clip(clip)
+ {}
+
ImageDrawSpec(const std::string &a_name,
const v2s32 &a_pos):
name(a_name),
parent_button(NULL),
pos(a_pos),
- scale(false)
- {
- }
+ scale(false),
+ clip(false)
+ {}
+
std::string name;
std::string item_name;
gui::IGUIButton *parent_button;
v2s32 pos;
v2s32 geom;
bool scale;
+ bool clip;
};
struct FieldSpec
@@ -200,13 +209,14 @@ class GUIFormSpecMenu : public GUIModalMenu
FieldSpec(const std::string &name, const std::wstring &label,
const std::wstring &default_text, int id) :
fname(name),
- fid(id)
+ flabel(label),
+ fid(id),
+ send(false),
+ ftype(f_Unknown),
+ is_exit(false)
{
- flabel = unescape_enriched(label);
+ //flabel = unescape_enriched(label);
fdefault = unescape_enriched(default_text);
- send = false;
- ftype = f_Unknown;
- is_exit = false;
}
std::string fname;
std::wstring flabel;
@@ -239,7 +249,8 @@ class GUIFormSpecMenu : public GUIModalMenu
bgcolor(a_bgcolor),
color(a_color)
{
- tooltip = unescape_enriched(utf8_to_wide(a_tooltip));
+ //tooltip = unescape_enriched(utf8_to_wide(a_tooltip));
+ tooltip = utf8_to_wide(a_tooltip);
}
std::wstring tooltip;
irr::video::SColor bgcolor;
@@ -256,7 +267,8 @@ class GUIFormSpecMenu : public GUIModalMenu
rect(a_rect),
parent_button(NULL)
{
- text = unescape_enriched(a_text);
+ //text = unescape_enriched(a_text);
+ text = a_text;
}
StaticTextSpec(const std::wstring &a_text,
const core::rect<s32> &a_rect,
@@ -264,7 +276,8 @@ class GUIFormSpecMenu : public GUIModalMenu
rect(a_rect),
parent_button(a_parent_button)
{
- text = unescape_enriched(a_text);
+ //text = unescape_enriched(a_text);
+ text = a_text;
}
std::wstring text;
core::rect<s32> rect;
@@ -273,6 +286,7 @@ class GUIFormSpecMenu : public GUIModalMenu
public:
GUIFormSpecMenu(irr::IrrlichtDevice* dev,
+ JoystickController *joystick,
gui::IGUIElement* parent, s32 id,
IMenuManager *menumgr,
InventoryManager *invmgr,
@@ -365,6 +379,8 @@ protected:
v2s32 spacing;
v2s32 imgsize;
v2s32 offset;
+ v2s32 pos_offset;
+ std::stack<v2s32> container_stack;
irr::IrrlichtDevice* m_device;
InventoryManager *m_invmgr;
@@ -382,6 +398,7 @@ protected:
std::vector<ImageDrawSpec> m_images;
std::vector<ImageDrawSpec> m_itemimages;
std::vector<BoxDrawSpec> m_boxes;
+ UNORDERED_MAP<std::string, bool> field_close_on_enter;
std::vector<FieldSpec> m_fields;
std::vector<StaticTextSpec> m_static_texts;
std::vector<std::pair<FieldSpec,GUITable*> > m_tables;
@@ -391,8 +408,6 @@ protected:
std::vector<std::pair<FieldSpec, std::vector<std::string> > > m_dropdowns;
ItemSpec *m_selected_item;
- f32 m_timer1;
- f32 m_timer2;
u32 m_selected_amount;
bool m_selected_dragging;
@@ -419,7 +434,6 @@ protected:
bool m_bgfullscreen;
bool m_slotborder;
- bool m_clipbackground;
video::SColor m_bgcolor;
video::SColor m_slotbg_n;
video::SColor m_slotbg_h;
@@ -428,10 +442,11 @@ protected:
video::SColor m_default_tooltip_color;
private:
- IFormSource *m_form_src;
- TextDest *m_text_dst;
- unsigned int m_formspec_version;
- std::string m_focused_element;
+ IFormSource *m_form_src;
+ TextDest *m_text_dst;
+ unsigned int m_formspec_version;
+ std::string m_focused_element;
+ JoystickController *m_joystick;
typedef struct {
bool explicit_size;
@@ -444,7 +459,7 @@ private:
GUITable::TableOptions table_options;
GUITable::TableColumns table_columns;
// used to restore table selection/scroll/treeview state
- std::map<std::string, GUITable::DynamicData> table_dyndata;
+ UNORDERED_MAP<std::string, GUITable::DynamicData> table_dyndata;
} parserData;
typedef struct {
@@ -455,14 +470,17 @@ private:
} fs_key_pendig;
fs_key_pendig current_keys_pending;
+ std::string current_field_enter_pending;
- void parseElement(parserData* data,std::string element);
+ void parseElement(parserData* data, std::string element);
- void parseSize(parserData* data,std::string element);
- void parseList(parserData* data,std::string element);
- void parseListRing(parserData* data,std::string element);
- void parseCheckbox(parserData* data,std::string element);
- void parseImage(parserData* data,std::string element);
+ void parseSize(parserData* data, std::string element);
+ void parseContainer(parserData* data, std::string element);
+ void parseContainerEnd(parserData* data);
+ void parseList(parserData* data, std::string element);
+ void parseListRing(parserData* data, std::string element);
+ void parseCheckbox(parserData* data, std::string element);
+ void parseImage(parserData* data, std::string element);
void parseItemImage(parserData* data,std::string element);
void parseButton(parserData* data,std::string element,std::string typ);
void parseBackground(parserData* data,std::string element);
@@ -471,6 +489,7 @@ private:
void parseTable(parserData* data,std::string element);
void parseTextList(parserData* data,std::string element);
void parseDropDown(parserData* data,std::string element);
+ void parseFieldCloseOnEnter(parserData *data, const std::string &element);
void parsePwdField(parserData* data,std::string element);
void parseField(parserData* data,std::string element,std::string type);
void parseSimpleField(parserData* data,std::vector<std::string> &parts);
@@ -489,6 +508,8 @@ private:
bool parseSizeDirect(parserData* data, std::string element);
void parseScrollBar(parserData* data, std::string element);
+ void tryClose();
+
/**
* check if event is part of a double click
* @param event event to evaluate
@@ -547,4 +568,3 @@ public:
};
#endif
-
diff --git a/src/guiKeyChangeMenu.cpp b/src/guiKeyChangeMenu.cpp
index b05818256..07137d1bc 100644
--- a/src/guiKeyChangeMenu.cpp
+++ b/src/guiKeyChangeMenu.cpp
@@ -59,6 +59,7 @@ enum
GUI_ID_KEY_INVENTORY_BUTTON,
GUI_ID_KEY_DUMP_BUTTON,
GUI_ID_KEY_RANGE_BUTTON,
+ GUI_ID_KEY_ZOOM_BUTTON,
// other
GUI_ID_CB_AUX1_DESCENDS,
GUI_ID_CB_DOUBLETAP_JUMP,
@@ -137,7 +138,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
{
key_setting *k = key_settings.at(i);
{
- core::rect < s32 > rect(0, 0, 110, 20);
+ core::rect < s32 > rect(0, 0, 150, 20);
rect += topleft + v2s32(offset.X, offset.Y);
Environment->addStaticText(k->button_name, rect, false, true, this, -1);
}
@@ -414,5 +415,6 @@ void GUIKeyChangeMenu::init_keys()
this->add_key(GUI_ID_KEY_NOCLIP_BUTTON, wgettext("Toggle noclip"), "keymap_noclip");
this->add_key(GUI_ID_KEY_RANGE_BUTTON, wgettext("Range select"), "keymap_rangeselect");
this->add_key(GUI_ID_KEY_DUMP_BUTTON, wgettext("Print stacks"), "keymap_print_debug_stacks");
+ this->add_key(GUI_ID_KEY_ZOOM_BUTTON, wgettext("Zoom"), "keymap_zoom");
}
diff --git a/src/guiTable.cpp b/src/guiTable.cpp
index 3cc95ce4f..6b33b8266 100644
--- a/src/guiTable.cpp
+++ b/src/guiTable.cpp
@@ -565,10 +565,8 @@ void GUITable::setSelected(s32 index)
--index; // Switch from 1-based indexing to 0-based indexing
s32 rowcount = m_rows.size();
- if (rowcount == 0) {
+ if (rowcount == 0 || index < 0) {
return;
- } else if (index < 0) {
- index = 0;
} else if (index >= rowcount) {
index = rowcount - 1;
}
diff --git a/src/guiVolumeChange.cpp b/src/guiVolumeChange.cpp
index c8e257f7f..8425bc04f 100644
--- a/src/guiVolumeChange.cpp
+++ b/src/guiVolumeChange.cpp
@@ -37,8 +37,7 @@ const int ID_soundSlider = 266;
GUIVolumeChange::GUIVolumeChange(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id,
- IMenuManager *menumgr,
- Client* client
+ IMenuManager *menumgr
):
GUIModalMenu(env, parent, id, menumgr)
{
@@ -51,26 +50,17 @@ GUIVolumeChange::~GUIVolumeChange()
void GUIVolumeChange::removeChildren()
{
- {
- gui::IGUIElement *e = getElementFromId(ID_soundText1);
- if(e != NULL)
- e->remove();
- }
- {
- gui::IGUIElement *e = getElementFromId(ID_soundText2);
- if(e != NULL)
- e->remove();
- }
- {
- gui::IGUIElement *e = getElementFromId(ID_soundExitButton);
- if(e != NULL)
- e->remove();
- }
- {
- gui::IGUIElement *e = getElementFromId(ID_soundSlider);
- if(e != NULL)
- e->remove();
- }
+ if (gui::IGUIElement *e = getElementFromId(ID_soundText1))
+ e->remove();
+
+ if (gui::IGUIElement *e = getElementFromId(ID_soundText2))
+ e->remove();
+
+ if (gui::IGUIElement *e = getElementFromId(ID_soundExitButton))
+ e->remove();
+
+ if (gui::IGUIElement *e = getElementFromId(ID_soundSlider))
+ e->remove();
}
void GUIVolumeChange::regenerateGui(v2u32 screensize)
@@ -95,7 +85,7 @@ void GUIVolumeChange::regenerateGui(v2u32 screensize)
v2s32 size = rect.getSize();
v2s32 topleft_client(40, 0);
- int volume=(int)(g_settings->getFloat("sound_volume")*100);
+ int volume = (int)(g_settings->getFloat("sound_volume")*100);
/*
Add stuff
*/
@@ -137,45 +127,43 @@ void GUIVolumeChange::drawMenu()
if (!skin)
return;
video::IVideoDriver* driver = Environment->getVideoDriver();
- video::SColor bgcolor(140,0,0,0);
+ video::SColor bgcolor(140, 0, 0, 0);
driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
gui::IGUIElement::draw();
}
bool GUIVolumeChange::OnEvent(const SEvent& event)
{
- if(event.EventType==EET_KEY_INPUT_EVENT)
- {
- if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
- {
+ if (event.EventType == EET_KEY_INPUT_EVENT) {
+ if (event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown) {
quitMenu();
return true;
}
- if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
- {
+
+ if (event.KeyInput.Key == KEY_RETURN && event.KeyInput.PressedDown) {
quitMenu();
return true;
}
}
- if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
- {
- if (event.GUIEvent.Caller->getID() == ID_soundExitButton)
- {
- quitMenu();
- return true;
- }
+
+ if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
+ if (event.GUIEvent.Caller->getID() == ID_soundExitButton) {
+ quitMenu();
+ return true;
}
- if(event.GUIEvent.EventType==gui::EGET_SCROLL_BAR_CHANGED)
- {
- if (event.GUIEvent.Caller->getID() == ID_soundSlider)
- {
- s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
- g_settings->setFloat("sound_volume",(float)pos/100);
- gui::IGUIElement *e = getElementFromId(ID_soundText2);
- e->setText( core::stringw(pos).c_str() );
- return true;
- }
+ }
+
+ if (event.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED) {
+ if (event.GUIEvent.Caller->getID() == ID_soundSlider) {
+ s32 pos = ((gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos();
+ g_settings->setFloat("sound_volume", (float)pos/100);
+
+ gui::IGUIElement *e = getElementFromId(ID_soundText2);
+ e->setText(core::stringw(pos).c_str());
+ return true;
}
+ }
+
return Parent ? Parent->OnEvent(event) : false;
}
diff --git a/src/guiVolumeChange.h b/src/guiVolumeChange.h
index 9f8199fa8..98731c673 100644
--- a/src/guiVolumeChange.h
+++ b/src/guiVolumeChange.h
@@ -30,8 +30,7 @@ class GUIVolumeChange : public GUIModalMenu
public:
GUIVolumeChange(gui::IGUIEnvironment* env,
gui::IGUIElement* parent, s32 id,
- IMenuManager *menumgr,
- Client* client);
+ IMenuManager *menumgr);
~GUIVolumeChange();
void removeChildren();
diff --git a/src/hud.cpp b/src/hud.cpp
index 19feaef7b..43d957380 100644
--- a/src/hud.cpp
+++ b/src/hud.cpp
@@ -544,6 +544,12 @@ void Hud::drawSelectionMesh()
video::SMaterial oldmaterial = driver->getMaterial2D();
driver->setMaterial(m_selection_material);
setMeshColor(m_selection_mesh, m_selection_mesh_color);
+ video::SColor face_color(0,
+ MYMIN(255, m_selection_mesh_color.getRed() * 1.5),
+ MYMIN(255, m_selection_mesh_color.getGreen() * 1.5),
+ MYMIN(255, m_selection_mesh_color.getBlue() * 1.5));
+ setMeshColorByNormal(m_selection_mesh, m_selected_face_normal,
+ face_color);
scene::IMesh* mesh = cloneMesh(m_selection_mesh);
translateMesh(mesh, m_selection_pos_with_offset);
u32 mc = m_selection_mesh->getMeshBufferCount();
diff --git a/src/hud.h b/src/hud.h
index 7f0fbe7b3..a4d7990e9 100644
--- a/src/hud.h
+++ b/src/hud.h
@@ -139,8 +139,11 @@ public:
v3f getSelectionPos() const
{ return m_selection_pos; }
- void setSelectionMeshColor(const video::SColor &c)
- { m_selection_mesh_color = c; }
+ void setSelectionMeshColor(const video::SColor &color)
+ { m_selection_mesh_color = color; }
+
+ void setSelectedFaceNormal(const v3f &face_normal)
+ { m_selected_face_normal = face_normal; }
void drawLuaElements(const v3s16 &camera_offset);
@@ -169,6 +172,8 @@ private:
scene::IMesh* m_selection_mesh;
video::SColor m_selection_mesh_color;
+ v3f m_selected_face_normal;
+
video::SMaterial m_selection_material;
bool m_use_selection_mesh;
};
diff --git a/src/intlGUIEditBox.cpp b/src/intlGUIEditBox.cpp
index 33bf8a13c..29f828076 100644
--- a/src/intlGUIEditBox.cpp
+++ b/src/intlGUIEditBox.cpp
@@ -271,7 +271,7 @@ bool intlGUIEditBox::OnEvent(const SEvent& event)
break;
case EET_KEY_INPUT_EVENT:
{
-#if (defined(linux) || defined(__linux) || defined(__FreeBSD__))
+#if (defined(__linux__) || defined(__FreeBSD__))
// ################################################################
// ValkaTR:
// This part is the difference from the original intlGUIEditBox
diff --git a/src/inventory.h b/src/inventory.h
index a690eb5ae..7d7e58d61 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -80,15 +80,14 @@ struct ItemStack
// Maximum size of a stack
u16 getStackMax(IItemDefManager *itemdef) const
{
- s16 max = itemdef->get(name).stack_max;
- return (max >= 0) ? max : 0;
+ return itemdef->get(name).stack_max;
}
// Number of items that can be added to this stack
u16 freeSpace(IItemDefManager *itemdef) const
{
u16 max = getStackMax(itemdef);
- if(count > max)
+ if (count >= max)
return 0;
return max - count;
}
diff --git a/src/irrlicht_changes/CMakeLists.txt b/src/irrlicht_changes/CMakeLists.txt
new file mode 100644
index 000000000..3a265c99d
--- /dev/null
+++ b/src/irrlicht_changes/CMakeLists.txt
@@ -0,0 +1,7 @@
+if (BUILD_CLIENT)
+ set(client_irrlicht_changes_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/static_text.cpp
+ PARENT_SCOPE
+ )
+endif()
+
diff --git a/src/irrlicht_changes/static_text.cpp b/src/irrlicht_changes/static_text.cpp
new file mode 100644
index 000000000..703287eb3
--- /dev/null
+++ b/src/irrlicht_changes/static_text.cpp
@@ -0,0 +1,679 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// Copyright (C) 2016 Nathanaël Courant:
+// Modified the functions to use EnrichedText instead of string.
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#include "static_text.h"
+#ifdef _IRR_COMPILE_WITH_GUI_
+
+#include <vector>
+#include <string>
+#include <iostream>
+#include <IGUISkin.h>
+#include <IGUIEnvironment.h>
+#include <IGUIFont.h>
+#include <IVideoDriver.h>
+#include <rect.h>
+#include <SColor.h>
+
+#if USE_FREETYPE
+ #include "cguittfont/xCGUITTFont.h"
+#endif
+
+#include "util/string.h"
+
+namespace irr
+{
+
+#if USE_FREETYPE
+
+namespace gui
+{
+//! constructor
+StaticText::StaticText(const EnrichedString &text, bool border,
+ IGUIEnvironment* environment, IGUIElement* parent,
+ s32 id, const core::rect<s32>& rectangle,
+ bool background)
+: IGUIStaticText(environment, parent, id, rectangle),
+ HAlign(EGUIA_UPPERLEFT), VAlign(EGUIA_UPPERLEFT),
+ Border(border), OverrideColorEnabled(false), OverrideBGColorEnabled(false), WordWrap(false), Background(background),
+ RestrainTextInside(true), RightToLeft(false),
+ OverrideColor(video::SColor(101,255,255,255)), BGColor(video::SColor(101,210,210,210)),
+ OverrideFont(0), LastBreakFont(0)
+{
+ #ifdef _DEBUG
+ setDebugName("StaticText");
+ #endif
+
+ Text = text.c_str();
+ cText = text;
+ if (environment && environment->getSkin())
+ {
+ BGColor = environment->getSkin()->getColor(gui::EGDC_3D_FACE);
+ }
+}
+
+
+//! destructor
+StaticText::~StaticText()
+{
+ if (OverrideFont)
+ OverrideFont->drop();
+}
+
+//! draws the element and its children
+void StaticText::draw()
+{
+ if (!IsVisible)
+ return;
+
+ IGUISkin* skin = Environment->getSkin();
+ if (!skin)
+ return;
+ video::IVideoDriver* driver = Environment->getVideoDriver();
+
+ core::rect<s32> frameRect(AbsoluteRect);
+
+ // draw background
+
+ if (Background)
+ {
+ if ( !OverrideBGColorEnabled ) // skin-colors can change
+ BGColor = skin->getColor(gui::EGDC_3D_FACE);
+
+ driver->draw2DRectangle(BGColor, frameRect, &AbsoluteClippingRect);
+ }
+
+ // draw the border
+
+ if (Border)
+ {
+ skin->draw3DSunkenPane(this, 0, true, false, frameRect, &AbsoluteClippingRect);
+ frameRect.UpperLeftCorner.X += skin->getSize(EGDS_TEXT_DISTANCE_X);
+ }
+
+ // draw the text
+ if (cText.size())
+ {
+ IGUIFont* font = getActiveFont();
+
+ if (font)
+ {
+ if (!WordWrap)
+ {
+ // TODO: add colors here
+ if (VAlign == EGUIA_LOWERRIGHT)
+ {
+ frameRect.UpperLeftCorner.Y = frameRect.LowerRightCorner.Y -
+ font->getDimension(L"A").Height - font->getKerningHeight();
+ }
+ if (HAlign == EGUIA_LOWERRIGHT)
+ {
+ frameRect.UpperLeftCorner.X = frameRect.LowerRightCorner.X -
+ font->getDimension(cText.c_str()).Width;
+ }
+
+ irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font);
+ tmp->draw(cText, frameRect,
+ OverrideColorEnabled ? OverrideColor : skin->getColor(isEnabled() ? EGDC_BUTTON_TEXT : EGDC_GRAY_TEXT),
+ HAlign == EGUIA_CENTER, VAlign == EGUIA_CENTER, (RestrainTextInside ? &AbsoluteClippingRect : NULL));
+ }
+ else
+ {
+ if (font != LastBreakFont)
+ breakText();
+
+ core::rect<s32> r = frameRect;
+ s32 height = font->getDimension(L"A").Height + font->getKerningHeight();
+ s32 totalHeight = height * BrokenText.size();
+ if (VAlign == EGUIA_CENTER)
+ {
+ r.UpperLeftCorner.Y = r.getCenter().Y - (totalHeight / 2);
+ }
+ else if (VAlign == EGUIA_LOWERRIGHT)
+ {
+ r.UpperLeftCorner.Y = r.LowerRightCorner.Y - totalHeight;
+ }
+
+ irr::video::SColor previous_color(255, 255, 255, 255);
+ for (u32 i=0; i<BrokenText.size(); ++i)
+ {
+ if (HAlign == EGUIA_LOWERRIGHT)
+ {
+ r.UpperLeftCorner.X = frameRect.LowerRightCorner.X -
+ font->getDimension(BrokenText[i].c_str()).Width;
+ }
+
+ //std::vector<irr::video::SColor> colors;
+ //std::wstring str;
+ EnrichedString str = BrokenText[i];
+
+ //str = colorizeText(BrokenText[i].c_str(), colors, previous_color);
+ //if (!colors.empty())
+ // previous_color = colors[colors.size() - 1];
+
+ irr::gui::CGUITTFont *tmp = static_cast<irr::gui::CGUITTFont*>(font);
+ tmp->draw(str, r,
+ previous_color, // FIXME
+ HAlign == EGUIA_CENTER, false, (RestrainTextInside ? &AbsoluteClippingRect : NULL));
+
+ r.LowerRightCorner.Y += height;
+ r.UpperLeftCorner.Y += height;
+ }
+ }
+ }
+ }
+
+ IGUIElement::draw();
+}
+
+
+//! Sets another skin independent font.
+void StaticText::setOverrideFont(IGUIFont* font)
+{
+ if (OverrideFont == font)
+ return;
+
+ if (OverrideFont)
+ OverrideFont->drop();
+
+ OverrideFont = font;
+
+ if (OverrideFont)
+ OverrideFont->grab();
+
+ breakText();
+}
+
+//! Gets the override font (if any)
+IGUIFont * StaticText::getOverrideFont() const
+{
+ return OverrideFont;
+}
+
+//! Get the font which is used right now for drawing
+IGUIFont* StaticText::getActiveFont() const
+{
+ if ( OverrideFont )
+ return OverrideFont;
+ IGUISkin* skin = Environment->getSkin();
+ if (skin)
+ return skin->getFont();
+ return 0;
+}
+
+//! Sets another color for the text.
+void StaticText::setOverrideColor(video::SColor color)
+{
+ OverrideColor = color;
+ OverrideColorEnabled = true;
+}
+
+
+//! Sets another color for the text.
+void StaticText::setBackgroundColor(video::SColor color)
+{
+ BGColor = color;
+ OverrideBGColorEnabled = true;
+ Background = true;
+}
+
+
+//! Sets whether to draw the background
+void StaticText::setDrawBackground(bool draw)
+{
+ Background = draw;
+}
+
+
+//! Gets the background color
+video::SColor StaticText::getBackgroundColor() const
+{
+ return BGColor;
+}
+
+
+//! Checks if background drawing is enabled
+bool StaticText::isDrawBackgroundEnabled() const
+{
+ _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+ return Background;
+}
+
+
+//! Sets whether to draw the border
+void StaticText::setDrawBorder(bool draw)
+{
+ Border = draw;
+}
+
+
+//! Checks if border drawing is enabled
+bool StaticText::isDrawBorderEnabled() const
+{
+ _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+ return Border;
+}
+
+
+void StaticText::setTextRestrainedInside(bool restrainTextInside)
+{
+ RestrainTextInside = restrainTextInside;
+}
+
+
+bool StaticText::isTextRestrainedInside() const
+{
+ return RestrainTextInside;
+}
+
+
+void StaticText::setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical)
+{
+ HAlign = horizontal;
+ VAlign = vertical;
+}
+
+
+#if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7
+const video::SColor& StaticText::getOverrideColor() const
+#else
+video::SColor StaticText::getOverrideColor() const
+#endif
+{
+ return OverrideColor;
+}
+
+
+//! Sets if the static text should use the overide color or the
+//! color in the gui skin.
+void StaticText::enableOverrideColor(bool enable)
+{
+ OverrideColorEnabled = enable;
+}
+
+
+bool StaticText::isOverrideColorEnabled() const
+{
+ _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+ return OverrideColorEnabled;
+}
+
+
+//! Enables or disables word wrap for using the static text as
+//! multiline text control.
+void StaticText::setWordWrap(bool enable)
+{
+ WordWrap = enable;
+ breakText();
+}
+
+
+bool StaticText::isWordWrapEnabled() const
+{
+ _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
+ return WordWrap;
+}
+
+
+void StaticText::setRightToLeft(bool rtl)
+{
+ if (RightToLeft != rtl)
+ {
+ RightToLeft = rtl;
+ breakText();
+ }
+}
+
+
+bool StaticText::isRightToLeft() const
+{
+ return RightToLeft;
+}
+
+
+//! Breaks the single text line.
+void StaticText::breakText()
+{
+ if (!WordWrap)
+ return;
+
+ BrokenText.clear();
+
+ IGUISkin* skin = Environment->getSkin();
+ IGUIFont* font = getActiveFont();
+ if (!font)
+ return;
+
+ LastBreakFont = font;
+
+ EnrichedString line;
+ EnrichedString word;
+ EnrichedString whitespace;
+ s32 size = cText.size();
+ s32 length = 0;
+ s32 elWidth = RelativeRect.getWidth();
+ if (Border)
+ elWidth -= 2*skin->getSize(EGDS_TEXT_DISTANCE_X);
+ wchar_t c;
+
+ //std::vector<irr::video::SColor> colors;
+
+ // We have to deal with right-to-left and left-to-right differently
+ // However, most parts of the following code is the same, it's just
+ // some order and boundaries which change.
+ if (!RightToLeft)
+ {
+ // regular (left-to-right)
+ for (s32 i=0; i<size; ++i)
+ {
+ c = cText.getString()[i];
+ bool lineBreak = false;
+
+ if (c == L'\r') // Mac or Windows breaks
+ {
+ lineBreak = true;
+ //if (Text[i+1] == L'\n') // Windows breaks
+ //{
+ // Text.erase(i+1);
+ // --size;
+ //}
+ c = '\0';
+ }
+ else if (c == L'\n') // Unix breaks
+ {
+ lineBreak = true;
+ c = '\0';
+ }
+
+ bool isWhitespace = (c == L' ' || c == 0);
+ if ( !isWhitespace )
+ {
+ // part of a word
+ //word += c;
+ word.addChar(cText, i);
+ }
+
+ if ( isWhitespace || i == (size-1))
+ {
+ if (word.size())
+ {
+ // here comes the next whitespace, look if
+ // we must break the last word to the next line.
+ const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
+ //const std::wstring sanitized = removeEscapes(word.c_str());
+ const s32 wordlgth = font->getDimension(word.c_str()).Width;
+
+ if (wordlgth > elWidth)
+ {
+ // This word is too long to fit in the available space, look for
+ // the Unicode Soft HYphen (SHY / 00AD) character for a place to
+ // break the word at
+ int where = core::stringw(word.c_str()).findFirst( wchar_t(0x00AD) );
+ if (where != -1)
+ {
+ EnrichedString first = word.substr(0, where);
+ EnrichedString second = word.substr(where, word.size() - where);
+ first.addCharNoColor(L'-');
+ BrokenText.push_back(line + first);
+ const s32 secondLength = font->getDimension(second.c_str()).Width;
+
+ length = secondLength;
+ line = second;
+ }
+ else
+ {
+ // No soft hyphen found, so there's nothing more we can do
+ // break to next line
+ if (length)
+ BrokenText.push_back(line);
+ length = wordlgth;
+ line = word;
+ }
+ }
+ else if (length && (length + wordlgth + whitelgth > elWidth))
+ {
+ // break to next line
+ BrokenText.push_back(line);
+ length = wordlgth;
+ line = word;
+ }
+ else
+ {
+ // add word to line
+ line += whitespace;
+ line += word;
+ length += whitelgth + wordlgth;
+ }
+
+ word.clear();
+ whitespace.clear();
+ }
+
+ if ( isWhitespace && c != 0)
+ {
+ whitespace.addChar(cText, i);
+ }
+
+ // compute line break
+ if (lineBreak)
+ {
+ line += whitespace;
+ line += word;
+ BrokenText.push_back(line);
+ line.clear();
+ word.clear();
+ whitespace.clear();
+ length = 0;
+ }
+ }
+ }
+
+ line += whitespace;
+ line += word;
+ BrokenText.push_back(line);
+ }
+ else
+ {
+ // right-to-left
+ for (s32 i=size; i>=0; --i)
+ {
+ c = cText.getString()[i];
+ bool lineBreak = false;
+
+ if (c == L'\r') // Mac or Windows breaks
+ {
+ lineBreak = true;
+ //if ((i>0) && Text[i-1] == L'\n') // Windows breaks
+ //{
+ // Text.erase(i-1);
+ // --size;
+ //}
+ c = '\0';
+ }
+ else if (c == L'\n') // Unix breaks
+ {
+ lineBreak = true;
+ c = '\0';
+ }
+
+ if (c==L' ' || c==0 || i==0)
+ {
+ if (word.size())
+ {
+ // here comes the next whitespace, look if
+ // we must break the last word to the next line.
+ const s32 whitelgth = font->getDimension(whitespace.c_str()).Width;
+ const s32 wordlgth = font->getDimension(word.c_str()).Width;
+
+ if (length && (length + wordlgth + whitelgth > elWidth))
+ {
+ // break to next line
+ BrokenText.push_back(line);
+ length = wordlgth;
+ line = word;
+ }
+ else
+ {
+ // add word to line
+ line = whitespace + line;
+ line = word + line;
+ length += whitelgth + wordlgth;
+ }
+
+ word.clear();
+ whitespace.clear();
+ }
+
+ if (c != 0)
+ // whitespace = core::stringw(&c, 1) + whitespace;
+ whitespace = cText.substr(i, 1) + whitespace;
+
+ // compute line break
+ if (lineBreak)
+ {
+ line = whitespace + line;
+ line = word + line;
+ BrokenText.push_back(line);
+ line.clear();
+ word.clear();
+ whitespace.clear();
+ length = 0;
+ }
+ }
+ else
+ {
+ // yippee this is a word..
+ //word = core::stringw(&c, 1) + word;
+ word = cText.substr(i, 1) + word;
+ }
+ }
+
+ line = whitespace + line;
+ line = word + line;
+ BrokenText.push_back(line);
+ }
+}
+
+
+//! Sets the new caption of this element.
+void StaticText::setText(const wchar_t* text)
+{
+ setText(EnrichedString(text));
+}
+
+//! Sets the new caption of this element.
+void StaticText::setText(const EnrichedString &text)
+{
+ IGUIElement::setText(text.c_str());
+ cText = text;
+ if (text.hasBackground()) {
+ setBackgroundColor(text.getBackground());
+ }
+ breakText();
+}
+
+
+void StaticText::updateAbsolutePosition()
+{
+ IGUIElement::updateAbsolutePosition();
+ breakText();
+}
+
+
+//! Returns the height of the text in pixels when it is drawn.
+s32 StaticText::getTextHeight() const
+{
+ IGUIFont* font = getActiveFont();
+ if (!font)
+ return 0;
+
+ s32 height = font->getDimension(L"A").Height + font->getKerningHeight();
+
+ if (WordWrap)
+ height *= BrokenText.size();
+
+ return height;
+}
+
+
+s32 StaticText::getTextWidth() const
+{
+ IGUIFont * font = getActiveFont();
+ if(!font)
+ return 0;
+
+ if(WordWrap)
+ {
+ s32 widest = 0;
+
+ for(u32 line = 0; line < BrokenText.size(); ++line)
+ {
+ s32 width = font->getDimension(BrokenText[line].c_str()).Width;
+
+ if(width > widest)
+ widest = width;
+ }
+
+ return widest;
+ }
+ else
+ {
+ return font->getDimension(cText.c_str()).Width;
+ }
+}
+
+
+//! Writes attributes of the element.
+//! Implement this to expose the attributes of your element for
+//! scripting languages, editors, debuggers or xml serialization purposes.
+void StaticText::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const
+{
+ IGUIStaticText::serializeAttributes(out,options);
+
+ out->addBool ("Border", Border);
+ out->addBool ("OverrideColorEnabled",OverrideColorEnabled);
+ out->addBool ("OverrideBGColorEnabled",OverrideBGColorEnabled);
+ out->addBool ("WordWrap", WordWrap);
+ out->addBool ("Background", Background);
+ out->addBool ("RightToLeft", RightToLeft);
+ out->addBool ("RestrainTextInside", RestrainTextInside);
+ out->addColor ("OverrideColor", OverrideColor);
+ out->addColor ("BGColor", BGColor);
+ out->addEnum ("HTextAlign", HAlign, GUIAlignmentNames);
+ out->addEnum ("VTextAlign", VAlign, GUIAlignmentNames);
+
+ // out->addFont ("OverrideFont", OverrideFont);
+}
+
+
+//! Reads attributes of the element
+void StaticText::deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0)
+{
+ IGUIStaticText::deserializeAttributes(in,options);
+
+ Border = in->getAttributeAsBool("Border");
+ enableOverrideColor(in->getAttributeAsBool("OverrideColorEnabled"));
+ OverrideBGColorEnabled = in->getAttributeAsBool("OverrideBGColorEnabled");
+ setWordWrap(in->getAttributeAsBool("WordWrap"));
+ Background = in->getAttributeAsBool("Background");
+ RightToLeft = in->getAttributeAsBool("RightToLeft");
+ RestrainTextInside = in->getAttributeAsBool("RestrainTextInside");
+ OverrideColor = in->getAttributeAsColor("OverrideColor");
+ BGColor = in->getAttributeAsColor("BGColor");
+
+ setTextAlignment( (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("HTextAlign", GUIAlignmentNames),
+ (EGUI_ALIGNMENT) in->getAttributeAsEnumeration("VTextAlign", GUIAlignmentNames));
+
+ // OverrideFont = in->getAttributeAsFont("OverrideFont");
+}
+
+} // end namespace gui
+
+#endif // USE_FREETYPE
+
+} // end namespace irr
+
+
+#endif // _IRR_COMPILE_WITH_GUI_
diff --git a/src/irrlicht_changes/static_text.h b/src/irrlicht_changes/static_text.h
new file mode 100644
index 000000000..408a12784
--- /dev/null
+++ b/src/irrlicht_changes/static_text.h
@@ -0,0 +1,268 @@
+// Copyright (C) 2002-2012 Nikolaus Gebhardt
+// Copyright (C) 2016 Nathanaël Courant
+// Modified this class to work with EnrichedStrings too
+// This file is part of the "Irrlicht Engine".
+// For conditions of distribution and use, see copyright notice in irrlicht.h
+
+#ifndef __C_GUI_STATIC_TEXT_H_INCLUDED__
+#define __C_GUI_STATIC_TEXT_H_INCLUDED__
+
+#include "IrrCompileConfig.h"
+#ifdef _IRR_COMPILE_WITH_GUI_
+
+#include "IGUIStaticText.h"
+#include "irrArray.h"
+
+#include "log.h"
+
+#include <vector>
+
+#include "util/enriched_string.h"
+#include "config.h"
+#include <IGUIEnvironment.h>
+
+#if USE_FREETYPE
+
+namespace irr
+{
+
+namespace gui
+{
+
+ const EGUI_ELEMENT_TYPE EGUIET_ENRICHED_STATIC_TEXT = (EGUI_ELEMENT_TYPE)(0x1000);
+
+ class StaticText : public IGUIStaticText
+ {
+ public:
+
+ //! constructor
+ StaticText(const EnrichedString &text, bool border, IGUIEnvironment* environment,
+ IGUIElement* parent, s32 id, const core::rect<s32>& rectangle,
+ bool background = false);
+
+ //! destructor
+ virtual ~StaticText();
+
+ //! draws the element and its children
+ virtual void draw();
+
+ //! Sets another skin independent font.
+ virtual void setOverrideFont(IGUIFont* font=0);
+
+ //! Gets the override font (if any)
+ virtual IGUIFont* getOverrideFont() const;
+
+ //! Get the font which is used right now for drawing
+ virtual IGUIFont* getActiveFont() const;
+
+ //! Sets another color for the text.
+ virtual void setOverrideColor(video::SColor color);
+
+ //! Sets another color for the background.
+ virtual void setBackgroundColor(video::SColor color);
+
+ //! Sets whether to draw the background
+ virtual void setDrawBackground(bool draw);
+
+ //! Gets the background color
+ virtual video::SColor getBackgroundColor() const;
+
+ //! Checks if background drawing is enabled
+ virtual bool isDrawBackgroundEnabled() const;
+
+ //! Sets whether to draw the border
+ virtual void setDrawBorder(bool draw);
+
+ //! Checks if border drawing is enabled
+ virtual bool isDrawBorderEnabled() const;
+
+ //! Sets alignment mode for text
+ virtual void setTextAlignment(EGUI_ALIGNMENT horizontal, EGUI_ALIGNMENT vertical);
+
+ //! Gets the override color
+ #if IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR <= 7
+ virtual const video::SColor& getOverrideColor() const;
+ #else
+ virtual video::SColor getOverrideColor() const;
+ #endif
+
+ //! Sets if the static text should use the overide color or the
+ //! color in the gui skin.
+ virtual void enableOverrideColor(bool enable);
+
+ //! Checks if an override color is enabled
+ virtual bool isOverrideColorEnabled() const;
+
+ //! Set whether the text in this label should be clipped if it goes outside bounds
+ virtual void setTextRestrainedInside(bool restrainedInside);
+
+ //! Checks if the text in this label should be clipped if it goes outside bounds
+ virtual bool isTextRestrainedInside() const;
+
+ //! Enables or disables word wrap for using the static text as
+ //! multiline text control.
+ virtual void setWordWrap(bool enable);
+
+ //! Checks if word wrap is enabled
+ virtual bool isWordWrapEnabled() const;
+
+ //! Sets the new caption of this element.
+ virtual void setText(const wchar_t* text);
+
+ //! Returns the height of the text in pixels when it is drawn.
+ virtual s32 getTextHeight() const;
+
+ //! Returns the width of the current text, in the current font
+ virtual s32 getTextWidth() const;
+
+ //! Updates the absolute position, splits text if word wrap is enabled
+ virtual void updateAbsolutePosition();
+
+ //! Set whether the string should be interpreted as right-to-left (RTL) text
+ /** \note This component does not implement the Unicode bidi standard, the
+ text of the component should be already RTL if you call this. The
+ main difference when RTL is enabled is that the linebreaks for multiline
+ elements are performed starting from the end.
+ */
+ virtual void setRightToLeft(bool rtl);
+
+ //! Checks if the text should be interpreted as right-to-left text
+ virtual bool isRightToLeft() const;
+
+ //! Writes attributes of the element.
+ virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const;
+
+ //! Reads attributes of the element
+ virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options);
+
+ virtual bool hasType(EGUI_ELEMENT_TYPE t) const {
+ return (t == EGUIET_ENRICHED_STATIC_TEXT) || (t == EGUIET_STATIC_TEXT);
+ };
+
+ virtual bool hasType(EGUI_ELEMENT_TYPE t) {
+ return (t == EGUIET_ENRICHED_STATIC_TEXT) || (t == EGUIET_STATIC_TEXT);
+ };
+
+ void setText(const EnrichedString &text);
+
+ private:
+
+ //! Breaks the single text line.
+ void breakText();
+
+ EGUI_ALIGNMENT HAlign, VAlign;
+ bool Border;
+ bool OverrideColorEnabled;
+ bool OverrideBGColorEnabled;
+ bool WordWrap;
+ bool Background;
+ bool RestrainTextInside;
+ bool RightToLeft;
+
+ video::SColor OverrideColor, BGColor;
+ gui::IGUIFont* OverrideFont;
+ gui::IGUIFont* LastBreakFont; // stored because: if skin changes, line break must be recalculated.
+
+ EnrichedString cText;
+ core::array< EnrichedString > BrokenText;
+ };
+
+
+} // end namespace gui
+
+} // end namespace irr
+
+inline irr::gui::IGUIStaticText *addStaticText(
+ irr::gui::IGUIEnvironment *guienv,
+ const EnrichedString &text,
+ const core::rect< s32 > &rectangle,
+ bool border = false,
+ bool wordWrap = true,
+ irr::gui::IGUIElement *parent = NULL,
+ s32 id = -1,
+ bool fillBackground = false)
+{
+ if (parent == NULL) {
+ // parent is NULL, so we must find one, or we need not to drop
+ // result, but then there will be a memory leak.
+ //
+ // What Irrlicht does is to use guienv as a parent, but the problem
+ // is that guienv is here only an IGUIEnvironment, while it is a
+ // CGUIEnvironment in Irrlicht, which inherits from both IGUIElement
+ // and IGUIEnvironment.
+ //
+ // A solution would be to dynamic_cast guienv to a
+ // IGUIElement*, but Irrlicht is shipped without rtti support
+ // in some distributions, causing the dymanic_cast to segfault.
+ //
+ // Thus, to find the parent, we create a dummy StaticText and ask
+ // for its parent, and then remove it.
+ irr::gui::IGUIStaticText *dummy_text =
+ guienv->addStaticText(L"", rectangle, border, wordWrap,
+ parent, id, fillBackground);
+ parent = dummy_text->getParent();
+ dummy_text->remove();
+ }
+ irr::gui::IGUIStaticText *result = new irr::gui::StaticText(
+ text, border, guienv, parent,
+ id, rectangle, fillBackground);
+
+ result->setWordWrap(wordWrap);
+ result->drop();
+ return result;
+}
+
+inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text)
+{
+ // dynamic_cast not possible due to some distributions shipped
+ // without rtti support in irrlicht
+ if (static_text->hasType(irr::gui::EGUIET_ENRICHED_STATIC_TEXT)) {
+ irr::gui::StaticText* stext = static_cast<irr::gui::StaticText*>(static_text);
+ stext->setText(text);
+ } else {
+ static_text->setText(text.c_str());
+ }
+}
+
+#else // USE_FREETYPE
+
+inline irr::gui::IGUIStaticText *addStaticText(
+ irr::gui::IGUIEnvironment *guienv,
+ const EnrichedString &text,
+ const core::rect< s32 > &rectangle,
+ bool border = false,
+ bool wordWrap = true,
+ irr::gui::IGUIElement *parent = NULL,
+ s32 id = -1,
+ bool fillBackground = false)
+{
+ return guienv->addStaticText(text.c_str(), rectangle, border, wordWrap, parent, id, fillBackground);
+}
+
+inline void setStaticText(irr::gui::IGUIStaticText *static_text, const EnrichedString &text)
+{
+ static_text->setText(text.c_str());
+}
+
+#endif
+
+inline irr::gui::IGUIStaticText *addStaticText(
+ irr::gui::IGUIEnvironment *guienv,
+ const wchar_t *text,
+ const core::rect< s32 > &rectangle,
+ bool border = false,
+ bool wordWrap = true,
+ irr::gui::IGUIElement *parent = NULL,
+ s32 id = -1,
+ bool fillBackground = false) {
+ return addStaticText(guienv, EnrichedString(text), rectangle, border, wordWrap, parent, id, fillBackground);
+}
+
+inline void setStaticText(irr::gui::IGUIStaticText *static_text, const wchar_t *text)
+{
+ setStaticText(static_text, EnrichedString(text));
+}
+
+#endif // _IRR_COMPILE_WITH_GUI_
+
+#endif // C_GUI_STATIC_TEXT_H_INCLUDED
diff --git a/src/itemdef.cpp b/src/itemdef.cpp
index a618ad631..1aa6331dc 100644
--- a/src/itemdef.cpp
+++ b/src/itemdef.cpp
@@ -146,9 +146,9 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
}
os<<serializeString(tool_capabilities_s);
writeU16(os, groups.size());
- for(std::map<std::string, int>::const_iterator
+ for (ItemGroupList::const_iterator
i = groups.begin(); i != groups.end(); ++i){
- os<<serializeString(i->first);
+ os << serializeString(i->first);
writeS16(os, i->second);
}
os<<serializeString(node_placement_prediction);
@@ -466,11 +466,17 @@ public:
infostream<<"ItemDefManager: erased alias "<<def.name
<<" because item was defined"<<std::endl;
}
+ virtual void unregisterItem(const std::string &name)
+ {
+ verbosestream<<"ItemDefManager: unregistering \""<<name<<"\""<<std::endl;
+
+ delete m_item_definitions[name];
+ m_item_definitions.erase(name);
+ }
virtual void registerAlias(const std::string &name,
const std::string &convert_to)
{
- if(m_item_definitions.find(name) == m_item_definitions.end())
- {
+ if (m_item_definitions.find(name) == m_item_definitions.end()) {
verbosestream<<"ItemDefManager: setting alias "<<name
<<" -> "<<convert_to<<std::endl;
m_aliases[name] = convert_to;
diff --git a/src/itemdef.h b/src/itemdef.h
index 805b4aa5d..dcb98e8a9 100644
--- a/src/itemdef.h
+++ b/src/itemdef.h
@@ -61,7 +61,7 @@ struct ItemDefinition
/*
Item stack and interaction properties
*/
- s16 stack_max;
+ u16 stack_max;
bool usable;
bool liquids_pointable;
// May be NULL. If non-NULL, deleted by destructor
@@ -144,6 +144,7 @@ public:
virtual void clear()=0;
// Register item definition
virtual void registerItem(const ItemDefinition &def)=0;
+ virtual void unregisterItem(const std::string &name)=0;
// Set an alias so that items named <name> will load as <convert_to>.
// Alias is not set if <name> has already been defined.
// Alias will be removed if <name> is defined at a later point of time.
diff --git a/src/itemgroup.h b/src/itemgroup.h
index f6ae86736..f91ccc221 100644
--- a/src/itemgroup.h
+++ b/src/itemgroup.h
@@ -21,14 +21,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define ITEMGROUP_HEADER
#include <string>
-#include <map>
+#include "util/cpp11_container.h"
-typedef std::map<std::string, int> ItemGroupList;
+typedef UNORDERED_MAP<std::string, int> ItemGroupList;
static inline int itemgroup_get(const ItemGroupList &groups,
const std::string &name)
{
- std::map<std::string, int>::const_iterator i = groups.find(name);
+ ItemGroupList::const_iterator i = groups.find(name);
if(i == groups.end())
return 0;
return i->second;
diff --git a/src/json/CMakeLists.txt b/src/jsoncpp/json/CMakeLists.txt
index 9056e4b6d..9056e4b6d 100644
--- a/src/json/CMakeLists.txt
+++ b/src/jsoncpp/json/CMakeLists.txt
diff --git a/src/json/UPDATING b/src/jsoncpp/json/UPDATING
index d00076601..d00076601 100644
--- a/src/json/UPDATING
+++ b/src/jsoncpp/json/UPDATING
diff --git a/src/json/json.h b/src/jsoncpp/json/json.h
index 396aafa82..396aafa82 100644
--- a/src/json/json.h
+++ b/src/jsoncpp/json/json.h
diff --git a/src/json/jsoncpp.cpp b/src/jsoncpp/json/jsoncpp.cpp
index 7a04736de..7a04736de 100644
--- a/src/json/jsoncpp.cpp
+++ b/src/jsoncpp/json/jsoncpp.cpp
diff --git a/src/keycode.cpp b/src/keycode.cpp
index 990dee339..2e211ad59 100644
--- a/src/keycode.cpp
+++ b/src/keycode.cpp
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "debug.h"
#include "util/hex.h"
+#include "util/string.h"
class UnknownKeycode : public BaseException
{
@@ -31,321 +32,335 @@ public:
BaseException(s) {};
};
-#define CHECKKEY(x){if(strcmp(name, #x)==0) return irr::x;}
+struct table_key {
+ const char *Name;
+ irr::EKEY_CODE Key;
+ wchar_t Char; // L'\0' means no character assigned
+ const char *LangName; // NULL means it doesn't have a human description
+};
-irr::EKEY_CODE keyname_to_keycode(const char *name)
+#define DEFINEKEY1(x, lang) /* Irrlicht key without character */ \
+ { #x, irr::x, L'\0', lang },
+#define DEFINEKEY2(x, ch, lang) /* Irrlicht key with character */ \
+ { #x, irr::x, ch, lang },
+#define DEFINEKEY3(ch) /* single Irrlicht key (e.g. KEY_KEY_X) */ \
+ { "KEY_KEY_" TOSTRING(ch), irr::KEY_KEY_ ## ch, (wchar_t) *TOSTRING(ch), TOSTRING(ch) },
+#define DEFINEKEY4(ch) /* single Irrlicht function key (e.g. KEY_F3) */ \
+ { "KEY_F" TOSTRING(ch), irr::KEY_F ## ch, L'\0', "F" TOSTRING(ch) },
+#define DEFINEKEY5(ch) /* key without Irrlicht keycode */ \
+ { ch, irr::KEY_KEY_CODES_COUNT, (wchar_t) *ch, ch },
+
+#define N_(text) text
+
+static const struct table_key table[] = {
+ // Keys that can be reliably mapped between Char and Key
+ DEFINEKEY3(0)
+ DEFINEKEY3(1)
+ DEFINEKEY3(2)
+ DEFINEKEY3(3)
+ DEFINEKEY3(4)
+ DEFINEKEY3(5)
+ DEFINEKEY3(6)
+ DEFINEKEY3(7)
+ DEFINEKEY3(8)
+ DEFINEKEY3(9)
+ DEFINEKEY3(A)
+ DEFINEKEY3(B)
+ DEFINEKEY3(C)
+ DEFINEKEY3(D)
+ DEFINEKEY3(E)
+ DEFINEKEY3(F)
+ DEFINEKEY3(G)
+ DEFINEKEY3(H)
+ DEFINEKEY3(I)
+ DEFINEKEY3(J)
+ DEFINEKEY3(K)
+ DEFINEKEY3(L)
+ DEFINEKEY3(M)
+ DEFINEKEY3(N)
+ DEFINEKEY3(O)
+ DEFINEKEY3(P)
+ DEFINEKEY3(Q)
+ DEFINEKEY3(R)
+ DEFINEKEY3(S)
+ DEFINEKEY3(T)
+ DEFINEKEY3(U)
+ DEFINEKEY3(V)
+ DEFINEKEY3(W)
+ DEFINEKEY3(X)
+ DEFINEKEY3(Y)
+ DEFINEKEY3(Z)
+ DEFINEKEY2(KEY_PLUS, L'+', "+")
+ DEFINEKEY2(KEY_COMMA, L',', ",")
+ DEFINEKEY2(KEY_MINUS, L'-', "-")
+ DEFINEKEY2(KEY_PERIOD, L'.', ".")
+
+ // Keys without a Char
+ DEFINEKEY1(KEY_LBUTTON, N_("Left Button"))
+ DEFINEKEY1(KEY_RBUTTON, N_("Right Button"))
+ DEFINEKEY1(KEY_CANCEL, N_("Cancel"))
+ DEFINEKEY1(KEY_MBUTTON, N_("Middle Button"))
+ DEFINEKEY1(KEY_XBUTTON1, N_("X Button 1"))
+ DEFINEKEY1(KEY_XBUTTON2, N_("X Button 2"))
+ DEFINEKEY1(KEY_BACK, N_("Back"))
+ DEFINEKEY1(KEY_TAB, N_("Tab"))
+ DEFINEKEY1(KEY_CLEAR, N_("Clear"))
+ DEFINEKEY1(KEY_RETURN, N_("Return"))
+ DEFINEKEY1(KEY_SHIFT, N_("Shift"))
+ DEFINEKEY1(KEY_CONTROL, N_("Control"))
+ DEFINEKEY1(KEY_MENU, N_("Menu"))
+ DEFINEKEY1(KEY_PAUSE, N_("Pause"))
+ DEFINEKEY1(KEY_CAPITAL, N_("Caps Lock"))
+ DEFINEKEY1(KEY_SPACE, N_("Space"))
+ DEFINEKEY1(KEY_PRIOR, N_("Prior"))
+ DEFINEKEY1(KEY_NEXT, N_("Next"))
+ DEFINEKEY1(KEY_END, N_("End"))
+ DEFINEKEY1(KEY_HOME, N_("Home"))
+ DEFINEKEY1(KEY_LEFT, N_("Left"))
+ DEFINEKEY1(KEY_UP, N_("Up"))
+ DEFINEKEY1(KEY_RIGHT, N_("Right"))
+ DEFINEKEY1(KEY_DOWN, N_("Down"))
+ DEFINEKEY1(KEY_SELECT, N_("Select"))
+ DEFINEKEY1(KEY_PRINT, N_("Print"))
+ DEFINEKEY1(KEY_EXECUT, N_("Execute"))
+ DEFINEKEY1(KEY_SNAPSHOT, N_("Snapshot"))
+ DEFINEKEY1(KEY_INSERT, N_("Insert"))
+ DEFINEKEY1(KEY_DELETE, N_("Delete"))
+ DEFINEKEY1(KEY_HELP, N_("Help"))
+ DEFINEKEY1(KEY_LWIN, N_("Left Windows"))
+ DEFINEKEY1(KEY_RWIN, N_("Right Windows"))
+ DEFINEKEY1(KEY_NUMPAD0, N_("Numpad 0")) // These are not assigned to a char
+ DEFINEKEY1(KEY_NUMPAD1, N_("Numpad 1")) // to prevent interference with KEY_KEY_[0-9].
+ DEFINEKEY1(KEY_NUMPAD2, N_("Numpad 2"))
+ DEFINEKEY1(KEY_NUMPAD3, N_("Numpad 3"))
+ DEFINEKEY1(KEY_NUMPAD4, N_("Numpad 4"))
+ DEFINEKEY1(KEY_NUMPAD5, N_("Numpad 5"))
+ DEFINEKEY1(KEY_NUMPAD6, N_("Numpad 6"))
+ DEFINEKEY1(KEY_NUMPAD7, N_("Numpad 7"))
+ DEFINEKEY1(KEY_NUMPAD8, N_("Numpad 8"))
+ DEFINEKEY1(KEY_NUMPAD9, N_("Numpad 9"))
+ DEFINEKEY1(KEY_MULTIPLY, N_("Numpad *"))
+ DEFINEKEY1(KEY_ADD, N_("Numpad +"))
+ DEFINEKEY1(KEY_SEPARATOR, N_("Numpad ."))
+ DEFINEKEY1(KEY_SUBTRACT, N_("Numpad -"))
+ DEFINEKEY1(KEY_DECIMAL, NULL)
+ DEFINEKEY1(KEY_DIVIDE, N_("Numpad /"))
+ DEFINEKEY4(1)
+ DEFINEKEY4(2)
+ DEFINEKEY4(3)
+ DEFINEKEY4(4)
+ DEFINEKEY4(5)
+ DEFINEKEY4(6)
+ DEFINEKEY4(7)
+ DEFINEKEY4(8)
+ DEFINEKEY4(9)
+ DEFINEKEY4(10)
+ DEFINEKEY4(11)
+ DEFINEKEY4(12)
+ DEFINEKEY4(13)
+ DEFINEKEY4(14)
+ DEFINEKEY4(15)
+ DEFINEKEY4(16)
+ DEFINEKEY4(17)
+ DEFINEKEY4(18)
+ DEFINEKEY4(19)
+ DEFINEKEY4(20)
+ DEFINEKEY4(21)
+ DEFINEKEY4(22)
+ DEFINEKEY4(23)
+ DEFINEKEY4(24)
+ DEFINEKEY1(KEY_NUMLOCK, N_("Num Lock"))
+ DEFINEKEY1(KEY_SCROLL, N_("Scroll Lock"))
+ DEFINEKEY1(KEY_LSHIFT, N_("Left Shift"))
+ DEFINEKEY1(KEY_RSHIFT, N_("Right Shift"))
+ DEFINEKEY1(KEY_LCONTROL, N_("Left Control"))
+ DEFINEKEY1(KEY_RCONTROL, N_("Right Control"))
+ DEFINEKEY1(KEY_LMENU, N_("Left Menu"))
+ DEFINEKEY1(KEY_RMENU, N_("Right Menu"))
+
+ // Rare/weird keys
+ DEFINEKEY1(KEY_KANA, "Kana")
+ DEFINEKEY1(KEY_HANGUEL, "Hangul")
+ DEFINEKEY1(KEY_HANGUL, "Hangul")
+ DEFINEKEY1(KEY_JUNJA, "Junja")
+ DEFINEKEY1(KEY_FINAL, "Final")
+ DEFINEKEY1(KEY_KANJI, "Kanji")
+ DEFINEKEY1(KEY_HANJA, "Hanja")
+ DEFINEKEY1(KEY_ESCAPE, N_("IME Escape"))
+ DEFINEKEY1(KEY_CONVERT, N_("IME Convert"))
+ DEFINEKEY1(KEY_NONCONVERT, N_("IME Nonconvert"))
+ DEFINEKEY1(KEY_ACCEPT, N_("IME Accept"))
+ DEFINEKEY1(KEY_MODECHANGE, N_("IME Mode Change"))
+ DEFINEKEY1(KEY_APPS, N_("Apps"))
+ DEFINEKEY1(KEY_SLEEP, N_("Sleep"))
+#if !(IRRLICHT_VERSION_MAJOR <= 1 && IRRLICHT_VERSION_MINOR <= 7 && IRRLICHT_VERSION_REVISION < 3)
+ DEFINEKEY1(KEY_OEM_1, "OEM 1") // KEY_OEM_[0-9] and KEY_OEM_102 are assigned to multiple
+ DEFINEKEY1(KEY_OEM_2, "OEM 2") // different chars (on different platforms too) and thus w/o char
+ DEFINEKEY1(KEY_OEM_3, "OEM 3")
+ DEFINEKEY1(KEY_OEM_4, "OEM 4")
+ DEFINEKEY1(KEY_OEM_5, "OEM 5")
+ DEFINEKEY1(KEY_OEM_6, "OEM 6")
+ DEFINEKEY1(KEY_OEM_7, "OEM 7")
+ DEFINEKEY1(KEY_OEM_8, "OEM 8")
+ DEFINEKEY1(KEY_OEM_AX, "OEM AX")
+ DEFINEKEY1(KEY_OEM_102, "OEM 102")
+#endif
+ DEFINEKEY1(KEY_ATTN, "Attn")
+ DEFINEKEY1(KEY_CRSEL, "CrSel")
+ DEFINEKEY1(KEY_EXSEL, "ExSel")
+ DEFINEKEY1(KEY_EREOF, N_("Erase EOF"))
+ DEFINEKEY1(KEY_PLAY, N_("Play"))
+ DEFINEKEY1(KEY_ZOOM, N_("Zoom"))
+ DEFINEKEY1(KEY_PA1, "PA1")
+ DEFINEKEY1(KEY_OEM_CLEAR, N_("OEM Clear"))
+
+ // Keys without Irrlicht keycode
+ DEFINEKEY5("!")
+ DEFINEKEY5("\"")
+ DEFINEKEY5("#")
+ DEFINEKEY5("$")
+ DEFINEKEY5("%")
+ DEFINEKEY5("&")
+ DEFINEKEY5("'")
+ DEFINEKEY5("(")
+ DEFINEKEY5(")")
+ DEFINEKEY5("*")
+ DEFINEKEY5("/")
+ DEFINEKEY5(":")
+ DEFINEKEY5(";")
+ DEFINEKEY5("<")
+ DEFINEKEY5("=")
+ DEFINEKEY5(">")
+ DEFINEKEY5("?")
+ DEFINEKEY5("@")
+ DEFINEKEY5("[")
+ DEFINEKEY5("\\")
+ DEFINEKEY5("]")
+ DEFINEKEY5("^")
+ DEFINEKEY5("_")
+};
+
+#undef N_
+
+#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+struct table_key lookup_keyname(const char *name)
{
- CHECKKEY(KEY_LBUTTON)
- CHECKKEY(KEY_RBUTTON)
- CHECKKEY(KEY_CANCEL)
- CHECKKEY(KEY_MBUTTON)
- CHECKKEY(KEY_XBUTTON1)
- CHECKKEY(KEY_XBUTTON2)
- CHECKKEY(KEY_BACK)
- CHECKKEY(KEY_TAB)
- CHECKKEY(KEY_CLEAR)
- CHECKKEY(KEY_RETURN)
- CHECKKEY(KEY_SHIFT)
- CHECKKEY(KEY_CONTROL)
- CHECKKEY(KEY_MENU)
- CHECKKEY(KEY_PAUSE)
- CHECKKEY(KEY_CAPITAL)
- CHECKKEY(KEY_KANA)
- CHECKKEY(KEY_HANGUEL)
- CHECKKEY(KEY_HANGUL)
- CHECKKEY(KEY_JUNJA)
- CHECKKEY(KEY_FINAL)
- CHECKKEY(KEY_HANJA)
- CHECKKEY(KEY_KANJI)
- CHECKKEY(KEY_ESCAPE)
- CHECKKEY(KEY_CONVERT)
- CHECKKEY(KEY_NONCONVERT)
- CHECKKEY(KEY_ACCEPT)
- CHECKKEY(KEY_MODECHANGE)
- CHECKKEY(KEY_SPACE)
- CHECKKEY(KEY_PRIOR)
- CHECKKEY(KEY_NEXT)
- CHECKKEY(KEY_END)
- CHECKKEY(KEY_HOME)
- CHECKKEY(KEY_LEFT)
- CHECKKEY(KEY_UP)
- CHECKKEY(KEY_RIGHT)
- CHECKKEY(KEY_DOWN)
- CHECKKEY(KEY_SELECT)
- CHECKKEY(KEY_PRINT)
- CHECKKEY(KEY_EXECUT)
- CHECKKEY(KEY_SNAPSHOT)
- CHECKKEY(KEY_INSERT)
- CHECKKEY(KEY_DELETE)
- CHECKKEY(KEY_HELP)
- CHECKKEY(KEY_KEY_0)
- CHECKKEY(KEY_KEY_1)
- CHECKKEY(KEY_KEY_2)
- CHECKKEY(KEY_KEY_3)
- CHECKKEY(KEY_KEY_4)
- CHECKKEY(KEY_KEY_5)
- CHECKKEY(KEY_KEY_6)
- CHECKKEY(KEY_KEY_7)
- CHECKKEY(KEY_KEY_8)
- CHECKKEY(KEY_KEY_9)
- CHECKKEY(KEY_KEY_A)
- CHECKKEY(KEY_KEY_B)
- CHECKKEY(KEY_KEY_C)
- CHECKKEY(KEY_KEY_D)
- CHECKKEY(KEY_KEY_E)
- CHECKKEY(KEY_KEY_F)
- CHECKKEY(KEY_KEY_G)
- CHECKKEY(KEY_KEY_H)
- CHECKKEY(KEY_KEY_I)
- CHECKKEY(KEY_KEY_J)
- CHECKKEY(KEY_KEY_K)
- CHECKKEY(KEY_KEY_L)
- CHECKKEY(KEY_KEY_M)
- CHECKKEY(KEY_KEY_N)
- CHECKKEY(KEY_KEY_O)
- CHECKKEY(KEY_KEY_P)
- CHECKKEY(KEY_KEY_Q)
- CHECKKEY(KEY_KEY_R)
- CHECKKEY(KEY_KEY_S)
- CHECKKEY(KEY_KEY_T)
- CHECKKEY(KEY_KEY_U)
- CHECKKEY(KEY_KEY_V)
- CHECKKEY(KEY_KEY_W)
- CHECKKEY(KEY_KEY_X)
- CHECKKEY(KEY_KEY_Y)
- CHECKKEY(KEY_KEY_Z)
- CHECKKEY(KEY_LWIN)
- CHECKKEY(KEY_RWIN)
- CHECKKEY(KEY_APPS)
- CHECKKEY(KEY_SLEEP)
- CHECKKEY(KEY_NUMPAD0)
- CHECKKEY(KEY_NUMPAD1)
- CHECKKEY(KEY_NUMPAD2)
- CHECKKEY(KEY_NUMPAD3)
- CHECKKEY(KEY_NUMPAD4)
- CHECKKEY(KEY_NUMPAD5)
- CHECKKEY(KEY_NUMPAD6)
- CHECKKEY(KEY_NUMPAD7)
- CHECKKEY(KEY_NUMPAD8)
- CHECKKEY(KEY_NUMPAD9)
- CHECKKEY(KEY_MULTIPLY)
- CHECKKEY(KEY_ADD)
- CHECKKEY(KEY_SEPARATOR)
- CHECKKEY(KEY_SUBTRACT)
- CHECKKEY(KEY_DECIMAL)
- CHECKKEY(KEY_DIVIDE)
- CHECKKEY(KEY_F1)
- CHECKKEY(KEY_F2)
- CHECKKEY(KEY_F3)
- CHECKKEY(KEY_F4)
- CHECKKEY(KEY_F5)
- CHECKKEY(KEY_F6)
- CHECKKEY(KEY_F7)
- CHECKKEY(KEY_F8)
- CHECKKEY(KEY_F9)
- CHECKKEY(KEY_F10)
- CHECKKEY(KEY_F11)
- CHECKKEY(KEY_F12)
- CHECKKEY(KEY_F13)
- CHECKKEY(KEY_F14)
- CHECKKEY(KEY_F15)
- CHECKKEY(KEY_F16)
- CHECKKEY(KEY_F17)
- CHECKKEY(KEY_F18)
- CHECKKEY(KEY_F19)
- CHECKKEY(KEY_F20)
- CHECKKEY(KEY_F21)
- CHECKKEY(KEY_F22)
- CHECKKEY(KEY_F23)
- CHECKKEY(KEY_F24)
- CHECKKEY(KEY_NUMLOCK)
- CHECKKEY(KEY_SCROLL)
- CHECKKEY(KEY_LSHIFT)
- CHECKKEY(KEY_RSHIFT)
- CHECKKEY(KEY_LCONTROL)
- CHECKKEY(KEY_RCONTROL)
- CHECKKEY(KEY_LMENU)
- CHECKKEY(KEY_RMENU)
- CHECKKEY(KEY_PLUS)
- CHECKKEY(KEY_COMMA)
- CHECKKEY(KEY_MINUS)
- CHECKKEY(KEY_PERIOD)
- CHECKKEY(KEY_ATTN)
- CHECKKEY(KEY_CRSEL)
- CHECKKEY(KEY_EXSEL)
- CHECKKEY(KEY_EREOF)
- CHECKKEY(KEY_PLAY)
- CHECKKEY(KEY_ZOOM)
- CHECKKEY(KEY_PA1)
- CHECKKEY(KEY_OEM_CLEAR)
+ for (u16 i = 0; i < ARRAYSIZE(table); i++) {
+ if (strcmp(table[i].Name, name) == 0)
+ return table[i];
+ }
throw UnknownKeycode(name);
}
-static const char *KeyNames[] =
-{ "-", "KEY_LBUTTON", "KEY_RBUTTON", "KEY_CANCEL", "KEY_MBUTTON", "KEY_XBUTTON1",
- "KEY_XBUTTON2", "-", "KEY_BACK", "KEY_TAB", "-", "-", "KEY_CLEAR", "KEY_RETURN", "-",
- "-", "KEY_SHIFT", "KEY_CONTROL", "KEY_MENU", "KEY_PAUSE", "KEY_CAPITAL", "KEY_KANA", "-",
- "KEY_JUNJA", "KEY_FINAL", "KEY_KANJI", "-", "KEY_ESCAPE", "KEY_CONVERT", "KEY_NONCONVERT",
- "KEY_ACCEPT", "KEY_MODECHANGE", "KEY_SPACE", "KEY_PRIOR", "KEY_NEXT", "KEY_END",
- "KEY_HOME", "KEY_LEFT", "KEY_UP", "KEY_RIGHT", "KEY_DOWN", "KEY_SELECT", "KEY_PRINT",
- "KEY_EXECUTE", "KEY_SNAPSHOT", "KEY_INSERT", "KEY_DELETE", "KEY_HELP", "KEY_KEY_0",
- "KEY_KEY_1", "KEY_KEY_2", "KEY_KEY_3", "KEY_KEY_4", "KEY_KEY_5",
- "KEY_KEY_6", "KEY_KEY_7", "KEY_KEY_8", "KEY_KEY_9", "-", "-", "-", "-",
- "-", "-", "-", "KEY_KEY_A", "KEY_KEY_B", "KEY_KEY_C", "KEY_KEY_D",
- "KEY_KEY_E", "KEY_KEY_F", "KEY_KEY_G", "KEY_KEY_H", "KEY_KEY_I",
- "KEY_KEY_J", "KEY_KEY_K", "KEY_KEY_L", "KEY_KEY_M", "KEY_KEY_N",
- "KEY_KEY_O", "KEY_KEY_P", "KEY_KEY_Q", "KEY_KEY_R", "KEY_KEY_S",
- "KEY_KEY_T", "KEY_KEY_U", "KEY_KEY_V", "KEY_KEY_W", "KEY_KEY_X",
- "KEY_KEY_Y", "KEY_KEY_Z", "KEY_LWIN", "KEY_RWIN", "KEY_APPS", "-",
- "KEY_SLEEP", "KEY_NUMPAD0", "KEY_NUMPAD1", "KEY_NUMPAD2", "KEY_NUMPAD3",
- "KEY_NUMPAD4", "KEY_NUMPAD5", "KEY_NUMPAD6", "KEY_NUMPAD7",
- "KEY_NUMPAD8", "KEY_NUMPAD9", "KEY_MULTIPLY", "KEY_ADD", "KEY_SEPERATOR",
- "KEY_SUBTRACT", "KEY_DECIMAL", "KEY_DIVIDE", "KEY_F1", "KEY_F2", "KEY_F3",
- "KEY_F4", "KEY_F5", "KEY_F6", "KEY_F7", "KEY_F8", "KEY_F9", "KEY_F10",
- "KEY_F11", "KEY_F12", "KEY_F13", "KEY_F14", "KEY_F15", "KEY_F16",
- "KEY_F17", "KEY_F18", "KEY_F19", "KEY_F20", "KEY_F21", "KEY_F22",
- "KEY_F23", "KEY_F24", "-", "-", "-", "-", "-", "-", "-", "-",
- "KEY_NUMLOCK", "KEY_SCROLL", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "KEY_LSHIFT", "KEY_RSHIFT", "KEY_LCONTROL",
- "KEY_RCONTROL", "KEY_LMENU", "KEY_RMENU", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "KEY_PLUS", "KEY_COMMA", "KEY_MINUS", "KEY_PERIOD", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "KEY_ATTN", "KEY_CRSEL", "KEY_EXSEL",
- "KEY_EREOF", "KEY_PLAY", "KEY_ZOOM", "KEY_PA1", "KEY_OEM_CLEAR", "-" };
+struct table_key lookup_keykey(irr::EKEY_CODE key)
+{
+ for (u16 i = 0; i < ARRAYSIZE(table); i++) {
+ if (table[i].Key == key)
+ return table[i];
+ }
-#define N_(text) text
+ std::ostringstream os;
+ os << "<Keycode " << (int) key << ">";
+ throw UnknownKeycode(os.str().c_str());
+}
-static const char *KeyNamesLang[] =
- { "-", N_("Left Button"), N_("Right Button"), N_("Cancel"), N_("Middle Button"), N_("X Button 1"),
- N_("X Button 2"), "-", N_("Back"), N_("Tab"), "-", "-", N_("Clear"), N_("Return"), "-",
- "-", N_("Shift"), N_("Control"), N_("Menu"), N_("Pause"), N_("Capital"), N_("Kana"), "-",
- N_("Junja"), N_("Final"), N_("Kanji"), "-", N_("Escape"), N_("Convert"), N_("Nonconvert"),
- N_("Accept"), N_("Mode Change"), N_("Space"), N_("Prior"), N_("Next"), N_("End"), N_("Home"),
- N_("Left"), N_("Up"), N_("Right"), N_("Down"), N_("Select"), N_("Print"), N_("Execute"),
- N_("Snapshot"), N_("Insert"), N_("Delete"), N_("Help"), "0", "1", "2", "3", "4", "5",
- "6", "7", "8", "9", "-", "-", "-", "-", "-", "-", "-", "A", "B", "C",
- "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q",
- "R", "S", "T", "U", "V", "W", "X", "Y", "Z", N_("Left Windows"),
- N_("Right Windows"), N_("Apps"), "-", N_("Sleep"), N_("Numpad 0"), N_("Numpad 1"),
- N_("Numpad 2"), N_("Numpad 3"), N_("Numpad 4"), N_("Numpad 5"), N_("Numpad 6"), N_("Numpad 7"),
- N_("Numpad 8"), N_("Numpad 9"), N_("Numpad *"), N_("Numpad +"), N_("Numpad /"), N_("Numpad -"),
- "Numpad .", "Numpad /", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8",
- "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18",
- "F19", "F20", "F21", "F22", "F23", "F24", "-", "-", "-", "-", "-", "-",
- "-", "-", N_("Num Lock"), N_("Scroll Lock"), "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", N_("Left Shift"), N_("Right Shift"),
- N_("Left Control"), N_("Right Control"), N_("Left Menu"), N_("Right Menu"), "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", N_("Plus"), N_("Comma"), N_("Minus"), N_("Period"), "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-",
- "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", N_("Attn"), N_("CrSel"),
- N_("ExSel"), N_("Erase OEF"), N_("Play"), N_("Zoom"), N_("PA1"), N_("OEM Clear"), "-" };
+struct table_key lookup_keychar(wchar_t Char)
+{
+ for (u16 i = 0; i < ARRAYSIZE(table); i++) {
+ if (table[i].Char == Char)
+ return table[i];
+ }
-#undef N_
+ std::ostringstream os;
+ os << "<Char " << hex_encode((char*) &Char, sizeof(wchar_t)) << ">";
+ throw UnknownKeycode(os.str().c_str());
+}
KeyPress::KeyPress() :
Key(irr::KEY_KEY_CODES_COUNT),
- Char(L'\0')
+ Char(L'\0'),
+ m_name("")
{}
KeyPress::KeyPress(const char *name)
{
- if (name[0] == 0) {
+ if (strlen(name) == 0) {
Key = irr::KEY_KEY_CODES_COUNT;
Char = L'\0';
+ m_name = "";
return;
- } else if (strlen(name) > 4) {
+ } else if (strlen(name) <= 4) {
+ // Lookup by resulting character
+ int chars_read = mbtowc(&Char, name, 1);
+ FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
try {
- Key = keyname_to_keycode(name);
- m_name = name;
- if (strlen(name) > 8 && strncmp(name, "KEY_KEY_", 8) == 0) {
- int chars_read = mbtowc(&Char, name + 8, 1);
-
- FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
- } else
- Char = L'\0';
+ struct table_key k = lookup_keychar(Char);
+ m_name = k.Name;
+ Key = k.Key;
return;
} catch (UnknownKeycode &e) {};
} else {
- // see if we can set it up as a KEY_KEY_something
- m_name = "KEY_KEY_";
- m_name += name;
+ // Lookup by name
+ m_name = name;
try {
- Key = keyname_to_keycode(m_name.c_str());
- int chars_read = mbtowc(&Char, name, 1);
-
- FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
+ struct table_key k = lookup_keyname(name);
+ Key = k.Key;
+ Char = k.Char;
return;
} catch (UnknownKeycode &e) {};
}
- // it's not a (known) key, just take the first char and use that
-
+ // It's not a known key, complain and try to do something
Key = irr::KEY_KEY_CODES_COUNT;
-
- int mbtowc_ret = mbtowc(&Char, name, 1);
- FATAL_ERROR_IF(mbtowc_ret != 1, "Unexpected multibyte character");
- m_name = name[0];
+ int chars_read = mbtowc(&Char, name, 1);
+ FATAL_ERROR_IF(chars_read != 1, "Unexpected multibyte character");
+ m_name = "";
+ warningstream << "KeyPress: Unknown key '" << name << "', falling back to first char.";
}
KeyPress::KeyPress(const irr::SEvent::SKeyInput &in, bool prefer_character)
{
- Key = in.Key;
+ if (prefer_character)
+ Key = irr::KEY_KEY_CODES_COUNT;
+ else
+ Key = in.Key;
Char = in.Char;
- if(prefer_character){
- m_name.resize(MB_CUR_MAX+1, '\0');
- int written = wctomb(&m_name[0], Char);
- if(written > 0){
- infostream<<"KeyPress: Preferring character for "<<m_name<<std::endl;
- Key = irr::KEY_KEY_CODES_COUNT;
- return;
- }
- }
-
- if (valid_kcode(Key)) {
- m_name = KeyNames[Key];
- } else {
- m_name.resize(MB_CUR_MAX+1, '\0');
- int written = wctomb(&m_name[0], Char);
- if(written < 0){
- std::string hexstr = hex_encode((const char*)&Char, sizeof(Char));
- errorstream<<"KeyPress: Unexpected multibyte character "<<hexstr<<std::endl;
- }
- }
+ try {
+ if (valid_kcode(Key))
+ m_name = lookup_keykey(Key).Name;
+ else
+ m_name = lookup_keychar(Char).Name;
+ } catch (UnknownKeycode &e) {
+ m_name = "";
+ };
}
const char *KeyPress::sym() const
{
- if (Key && Key < irr::KEY_KEY_CODES_COUNT)
- return KeyNames[Key];
- else {
- return m_name.c_str();
- }
+ return m_name.c_str();
}
const char *KeyPress::name() const
{
- if (Key && Key < irr::KEY_KEY_CODES_COUNT)
- return KeyNamesLang[Key];
- else {
- return m_name.c_str();
- }
+ if (m_name == "")
+ return "";
+ const char *ret;
+ if (valid_kcode(Key))
+ ret = lookup_keykey(Key).LangName;
+ else
+ ret = lookup_keychar(Char).LangName;
+ return ret ? ret : "<Unnamed key>";
}
const KeyPress EscapeKey("KEY_ESCAPE");
const KeyPress CancelKey("KEY_CANCEL");
const KeyPress NumberKey[] = {
- KeyPress("KEY_KEY_0"), KeyPress("KEY_KEY_1"), KeyPress("KEY_KEY_2"),
- KeyPress("KEY_KEY_3"), KeyPress("KEY_KEY_4"), KeyPress("KEY_KEY_5"),
- KeyPress("KEY_KEY_6"), KeyPress("KEY_KEY_7"), KeyPress("KEY_KEY_8"),
- KeyPress("KEY_KEY_9")};
+ KeyPress("0"), KeyPress("1"), KeyPress("2"), KeyPress("3"), KeyPress("4"),
+ KeyPress("5"), KeyPress("6"), KeyPress("7"), KeyPress("8"), KeyPress("9")
+};
/*
Key config
@@ -360,11 +375,18 @@ KeyPress getKeySetting(const char *settingname)
n = g_key_setting_cache.find(settingname);
if(n != g_key_setting_cache.end())
return n->second;
- g_key_setting_cache[settingname] = g_settings->get(settingname).c_str();
- return g_key_setting_cache.find(settingname)->second;
+
+ KeyPress k(g_settings->get(settingname).c_str());
+ g_key_setting_cache[settingname] = k;
+ return k;
}
void clearKeyCache()
{
g_key_setting_cache.clear();
}
+
+irr::EKEY_CODE keyname_to_keycode(const char *name)
+{
+ return lookup_keyname(name).Key;
+}
diff --git a/src/keycode.h b/src/keycode.h
index 459a85a46..4d66cf7b5 100644
--- a/src/keycode.h
+++ b/src/keycode.h
@@ -44,8 +44,6 @@ public:
const char *sym() const;
const char *name() const;
-
- std::string debug() const;
protected:
static bool valid_kcode(irr::EKEY_CODE k)
{
diff --git a/src/light.h b/src/light.h
index f49be4518..984e6d7c2 100644
--- a/src/light.h
+++ b/src/light.h
@@ -27,8 +27,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
// This directly sets the range of light.
-// Actually this is not the real maximum, and this is not the
-// brightest. The brightest is LIGHT_SUN.
+// Actually this is not the real maximum, and this is not the brightest, the
+// brightest is LIGHT_SUN.
+// If changed, this constant as defined in builtin/game/constants.lua must
+// also be changed.
#define LIGHT_MAX 14
// Light is stored as 4 bits, thus 15 is the maximum.
// This brightness is reserved for sunlight
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 507f31980..4d0ca0600 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -26,27 +26,46 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "settings.h"
#include "environment.h"
#include "map.h"
-#include "util/numeric.h"
+#include "client.h"
/*
LocalPlayer
*/
-LocalPlayer::LocalPlayer(IGameDef *gamedef, const char *name):
- Player(gamedef, name),
+LocalPlayer::LocalPlayer(Client *gamedef, const char *name):
+ Player(name, gamedef->idef()),
parent(0),
+ hp(PLAYER_MAX_HP),
+ got_teleported(false),
isAttached(false),
+ touching_ground(false),
+ in_liquid(false),
+ in_liquid_stable(false),
+ liquid_viscosity(0),
+ is_climbing(false),
+ swimming_vertical(false),
+ // Movement overrides are multipliers and must be 1 by default
+ physics_override_speed(1.0f),
+ physics_override_jump(1.0f),
+ physics_override_gravity(1.0f),
+ physics_override_sneak(true),
+ physics_override_sneak_glitch(true),
overridePosition(v3f(0,0,0)),
last_position(v3f(0,0,0)),
last_speed(v3f(0,0,0)),
last_pitch(0),
last_yaw(0),
last_keyPressed(0),
+ last_camera_fov(0),
+ last_wanted_range(0),
camera_impact(0.f),
last_animation(NO_ANIM),
hotbar_image(""),
hotbar_selected_image(""),
light_color(255,255,255,255),
+ hurt_tilt_timer(0.0f),
+ hurt_tilt_strength(0.0f),
+ m_position(0,0,0),
m_sneak_node(32767,32767,32767),
m_sneak_node_exists(false),
m_need_to_get_new_sneak_node(true),
@@ -54,7 +73,13 @@ LocalPlayer::LocalPlayer(IGameDef *gamedef, const char *name):
m_old_node_below(32767,32767,32767),
m_old_node_below_type("air"),
m_can_jump(false),
- m_cao(NULL)
+ m_breath(PLAYER_MAX_BREATH),
+ m_yaw(0),
+ m_pitch(0),
+ camera_barely_in_ceiling(false),
+ m_collisionbox(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30),
+ m_cao(NULL),
+ m_gamedef(gamedef)
{
// Initialize hp to 0, so that no hearts will be shown if server
// doesn't support health points
@@ -528,18 +553,23 @@ void LocalPlayer::applyControl(float dtime)
speedH += move_direction;
}
}
- if(control.down)
- {
+ if (control.down) {
speedH -= move_direction;
}
- if(control.left)
- {
+ if (!control.up && !control.down) {
+ speedH -= move_direction *
+ (control.forw_move_joystick_axis / 32767.f);
+ }
+ if (control.left) {
speedH += move_direction.crossProduct(v3f(0,1,0));
}
- if(control.right)
- {
+ if (control.right) {
speedH += move_direction.crossProduct(v3f(0,-1,0));
}
+ if (!control.left && !control.right) {
+ speedH -= move_direction.crossProduct(v3f(0,1,0)) *
+ (control.sidew_move_joystick_axis / 32767.f);
+ }
if(control.jump)
{
if (free_move) {
diff --git a/src/localplayer.h b/src/localplayer.h
index 3ae0c4e51..7a1cb7466 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -21,28 +21,43 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define LOCALPLAYER_HEADER
#include "player.h"
+#include "environment.h"
#include <list>
+class Client;
class Environment;
class GenericCAO;
class ClientActiveObject;
+class IGameDef;
enum LocalPlayerAnimations {NO_ANIM, WALK_ANIM, DIG_ANIM, WD_ANIM}; // no local animation, walking, digging, both
class LocalPlayer : public Player
{
public:
- LocalPlayer(IGameDef *gamedef, const char *name);
+ LocalPlayer(Client *gamedef, const char *name);
virtual ~LocalPlayer();
- bool isLocal() const
- {
- return true;
- }
-
ClientActiveObject *parent;
+ u16 hp;
+ bool got_teleported;
bool isAttached;
+ bool touching_ground;
+ // This oscillates so that the player jumps a bit above the surface
+ bool in_liquid;
+ // This is more stable and defines the maximum speed of the player
+ bool in_liquid_stable;
+ // Gets the viscosity of water to calculate friction
+ u8 liquid_viscosity;
+ bool is_climbing;
+ bool swimming_vertical;
+
+ float physics_override_speed;
+ float physics_override_jump;
+ float physics_override_gravity;
+ bool physics_override_sneak;
+ bool physics_override_sneak_glitch;
v3f overridePosition;
@@ -60,6 +75,8 @@ public:
float last_pitch;
float last_yaw;
unsigned int last_keyPressed;
+ u8 last_camera_fov;
+ u8 last_wanted_range;
float camera_impact;
@@ -71,6 +88,9 @@ public:
video::SColor light_color;
+ float hurt_tilt_timer;
+ float hurt_tilt_strength;
+
GenericCAO* getCAO() const {
return m_cao;
}
@@ -80,10 +100,47 @@ public:
m_cao = toset;
}
+ u32 maxHudId() const { return hud.size(); }
+
+ u16 getBreath() const { return m_breath; }
+ void setBreath(u16 breath) { m_breath = breath; }
+
+ v3s16 getLightPosition() const
+ {
+ return floatToInt(m_position + v3f(0,BS+BS/2,0), BS);
+ }
+
+ void setYaw(f32 yaw)
+ {
+ m_yaw = yaw;
+ }
+
+ f32 getYaw() const { return m_yaw; }
+
+ void setPitch(f32 pitch)
+ {
+ m_pitch = pitch;
+ }
+
+ f32 getPitch() const { return m_pitch; }
+
+ void setPosition(const v3f &position)
+ {
+ m_position = position;
+ }
+
+ v3f getPosition() const { return m_position; }
+ v3f getEyePosition() const { return m_position + getEyeOffset(); }
+ v3f getEyeOffset() const
+ {
+ float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f;
+ return v3f(0, BS * eye_height, 0);
+ }
private:
void accelerateHorizontal(const v3f &target_speed, const f32 max_increase);
void accelerateVertical(const v3f &target_speed, const f32 max_increase);
+ v3f m_position;
// This is used for determining the sneaking range
v3s16 m_sneak_node;
// Whether the player is allowed to sneak
@@ -98,8 +155,14 @@ private:
v3s16 m_old_node_below;
std::string m_old_node_below_type;
bool m_can_jump;
+ u16 m_breath;
+ f32 m_yaw;
+ f32 m_pitch;
+ bool camera_barely_in_ceiling;
+ aabb3f m_collisionbox;
GenericCAO* m_cao;
+ Client *m_gamedef;
};
#endif
diff --git a/src/main.cpp b/src/main.cpp
index 1b95a9f1c..a54454653 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -17,15 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifdef _MSC_VER
- #ifndef SERVER // Dedicated server isn't linked with Irrlicht
- #pragma comment(lib, "Irrlicht.lib")
- // This would get rid of the console window
- //#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
- #endif
- #pragma comment(lib, "zlibwapi.lib")
- #pragma comment(lib, "Shell32.lib")
-#endif
+// This would get rid of the console window
+//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#include "irrlicht.h" // createDevice
@@ -948,7 +941,8 @@ static bool migrate_database(const GameParams &game_params, const Settings &cmd_
for (std::vector<v3s16>::const_iterator it = blocks.begin(); it != blocks.end(); ++it) {
if (kill) return false;
- const std::string &data = old_db->loadBlock(*it);
+ std::string data;
+ old_db->loadBlock(*it, &data);
if (!data.empty()) {
new_db->saveBlock(*it, data);
} else {
diff --git a/src/map.cpp b/src/map.cpp
index 66fabaf87..7bb8c4a13 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapblock.h"
#include "filesys.h"
#include "voxel.h"
+#include "voxelalgorithms.h"
#include "porting.h"
#include "serialization.h"
#include "nodemetadata.h"
@@ -34,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/mathconstants.h"
#include "rollback_interface.h"
#include "environment.h"
+#include "reflowscan.h"
#include "emerge.h"
#include "mapgen_v6.h"
#include "mg_biome.h"
@@ -50,6 +52,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#if USE_REDIS
#include "database-redis.h"
#endif
+#if USE_POSTGRESQL
+#include "database-postgresql.h"
+#endif
#define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
@@ -170,7 +175,7 @@ bool Map::isNodeUnderground(v3s16 p)
bool Map::isValidPosition(v3s16 p)
{
v3s16 blockpos = getNodeBlockPos(p);
- MapBlock *block = getBlockNoCreate(blockpos);
+ MapBlock *block = getBlockNoCreateNoEx(blockpos);
return (block != NULL);
}
@@ -231,7 +236,6 @@ void Map::setNode(v3s16 p, MapNode & n)
block->setNodeNoCheck(relpos, n);
}
-
/*
Goes recursively through the neighbours of the node.
@@ -411,20 +415,6 @@ void Map::unspreadLight(enum LightBank bank,
}
/*
- A single-node wrapper of the above
-*/
-void Map::unLightNeighbors(enum LightBank bank,
- v3s16 pos, u8 lightwas,
- std::set<v3s16> & light_sources,
- std::map<v3s16, MapBlock*> & modified_blocks)
-{
- std::map<v3s16, u8> from_nodes;
- from_nodes[pos] = lightwas;
-
- unspreadLight(bank, from_nodes, light_sources, modified_blocks);
-}
-
-/*
Lights neighbors of from_nodes, collects all them and then
goes on recursively.
*/
@@ -565,108 +555,6 @@ void Map::spreadLight(enum LightBank bank,
spreadLight(bank, lighted_nodes, modified_blocks);
}
-/*
- A single-node source variation of the above.
-*/
-void Map::lightNeighbors(enum LightBank bank,
- v3s16 pos,
- std::map<v3s16, MapBlock*> & modified_blocks)
-{
- std::set<v3s16> from_nodes;
- from_nodes.insert(pos);
- spreadLight(bank, from_nodes, modified_blocks);
-}
-
-v3s16 Map::getBrightestNeighbour(enum LightBank bank, v3s16 p)
-{
- INodeDefManager *nodemgr = m_gamedef->ndef();
-
- v3s16 dirs[6] = {
- v3s16(0,0,1), // back
- v3s16(0,1,0), // top
- v3s16(1,0,0), // right
- v3s16(0,0,-1), // front
- v3s16(0,-1,0), // bottom
- v3s16(-1,0,0), // left
- };
-
- u8 brightest_light = 0;
- v3s16 brightest_pos(0,0,0);
- bool found_something = false;
-
- // Loop through 6 neighbors
- for(u16 i=0; i<6; i++){
- // Get the position of the neighbor node
- v3s16 n2pos = p + dirs[i];
- MapNode n2;
- bool is_valid_position;
- n2 = getNodeNoEx(n2pos, &is_valid_position);
- if (!is_valid_position)
- continue;
-
- if(n2.getLight(bank, nodemgr) > brightest_light || found_something == false){
- brightest_light = n2.getLight(bank, nodemgr);
- brightest_pos = n2pos;
- found_something = true;
- }
- }
-
- if(found_something == false)
- throw InvalidPositionException();
-
- return brightest_pos;
-}
-
-/*
- Propagates sunlight down from a node.
- Starting point gets sunlight.
-
- Returns the lowest y value of where the sunlight went.
-
- Mud is turned into grass in where the sunlight stops.
-*/
-s16 Map::propagateSunlight(v3s16 start,
- std::map<v3s16, MapBlock*> & modified_blocks)
-{
- INodeDefManager *nodemgr = m_gamedef->ndef();
-
- s16 y = start.Y;
- for(; ; y--)
- {
- v3s16 pos(start.X, y, start.Z);
-
- v3s16 blockpos = getNodeBlockPos(pos);
- MapBlock *block;
- try{
- block = getBlockNoCreate(blockpos);
- }
- catch(InvalidPositionException &e)
- {
- break;
- }
-
- v3s16 relpos = pos - blockpos*MAP_BLOCKSIZE;
- bool is_valid_position;
- MapNode n = block->getNode(relpos, &is_valid_position);
- if (!is_valid_position)
- break;
-
- if(nodemgr->get(n).sunlight_propagates)
- {
- n.setLight(LIGHTBANK_DAY, LIGHT_SUN, nodemgr);
- block->setNode(relpos, n);
-
- modified_blocks[blockpos] = block;
- }
- else
- {
- // Sunlight goes no further
- break;
- }
- }
- return y + 1;
-}
-
void Map::updateLighting(enum LightBank bank,
std::map<v3s16, MapBlock*> & a_blocks,
std::map<v3s16, MapBlock*> & modified_blocks)
@@ -919,150 +807,34 @@ void Map::updateLighting(std::map<v3s16, MapBlock*> & a_blocks,
}
}
-/*
-*/
void Map::addNodeAndUpdate(v3s16 p, MapNode n,
std::map<v3s16, MapBlock*> &modified_blocks,
bool remove_metadata)
{
INodeDefManager *ndef = m_gamedef->ndef();
- /*PrintInfo(m_dout);
- m_dout<<"Map::addNodeAndUpdate(): p=("
- <<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;*/
-
- /*
- From this node to nodes underneath:
- If lighting is sunlight (1.0), unlight neighbours and
- set lighting to 0.
- Else discontinue.
- */
-
- v3s16 toppos = p + v3s16(0,1,0);
- //v3s16 bottompos = p + v3s16(0,-1,0);
-
- bool node_under_sunlight = true;
- std::set<v3s16> light_sources;
-
- /*
- Collect old node for rollback
- */
+ // Collect old node for rollback
RollbackNode rollback_oldnode(this, p, m_gamedef);
- /*
- If there is a node at top and it doesn't have sunlight,
- there has not been any sunlight going down.
-
- Otherwise there probably is.
- */
-
- bool is_valid_position;
- MapNode topnode = getNodeNoEx(toppos, &is_valid_position);
-
- if(is_valid_position && topnode.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN)
- node_under_sunlight = false;
-
- /*
- Remove all light that has come out of this node
- */
+ // This is needed for updating the lighting
+ MapNode oldnode = getNodeNoEx(p);
- enum LightBank banks[] =
- {
- LIGHTBANK_DAY,
- LIGHTBANK_NIGHT
- };
- for(s32 i=0; i<2; i++)
- {
- enum LightBank bank = banks[i];
-
- u8 lightwas = getNodeNoEx(p).getLight(bank, ndef);
-
- // Add the block of the added node to modified_blocks
- v3s16 blockpos = getNodeBlockPos(p);
- MapBlock * block = getBlockNoCreate(blockpos);
- assert(block != NULL);
- modified_blocks[blockpos] = block;
-
- assert(isValidPosition(p));
-
- // Unlight neighbours of node.
- // This means setting light of all consequent dimmer nodes
- // to 0.
- // This also collects the nodes at the border which will spread
- // light again into this.
- unLightNeighbors(bank, p, lightwas, light_sources, modified_blocks);
-
- n.setLight(bank, 0, ndef);
- }
-
- /*
- If node lets sunlight through and is under sunlight, it has
- sunlight too.
- */
- if(node_under_sunlight && ndef->get(n).sunlight_propagates)
- {
- n.setLight(LIGHTBANK_DAY, LIGHT_SUN, ndef);
- }
-
- /*
- Remove node metadata
- */
+ // Remove node metadata
if (remove_metadata) {
removeNodeMetadata(p);
}
- /*
- Set the node on the map
- */
-
+ // Set the node on the map
+ // Ignore light (because calling voxalgo::update_lighting_nodes)
+ n.setLight(LIGHTBANK_DAY, 0, ndef);
+ n.setLight(LIGHTBANK_NIGHT, 0, ndef);
setNode(p, n);
- /*
- If node is under sunlight and doesn't let sunlight through,
- take all sunlighted nodes under it and clear light from them
- and from where the light has been spread.
- TODO: This could be optimized by mass-unlighting instead
- of looping
- */
- if(node_under_sunlight && !ndef->get(n).sunlight_propagates)
- {
- s16 y = p.Y - 1;
- for(;; y--){
- //m_dout<<"y="<<y<<std::endl;
- v3s16 n2pos(p.X, y, p.Z);
-
- MapNode n2;
-
- n2 = getNodeNoEx(n2pos, &is_valid_position);
- if (!is_valid_position)
- break;
-
- if(n2.getLight(LIGHTBANK_DAY, ndef) == LIGHT_SUN)
- {
- unLightNeighbors(LIGHTBANK_DAY,
- n2pos, n2.getLight(LIGHTBANK_DAY, ndef),
- light_sources, modified_blocks);
- n2.setLight(LIGHTBANK_DAY, 0, ndef);
- setNode(n2pos, n2);
- }
- else
- break;
- }
- }
-
- for(s32 i=0; i<2; i++)
- {
- enum LightBank bank = banks[i];
+ // Update lighting
+ std::vector<std::pair<v3s16, MapNode> > oldnodes;
+ oldnodes.push_back(std::pair<v3s16, MapNode>(p, oldnode));
+ voxalgo::update_lighting_nodes(this, ndef, oldnodes, modified_blocks);
- /*
- Spread light from all nodes that might be capable of doing so
- */
- spreadLight(bank, light_sources, modified_blocks);
- }
-
- /*
- Update information about whether day and night light differ
- */
for(std::map<v3s16, MapBlock*>::iterator
i = modified_blocks.begin();
i != modified_blocks.end(); ++i)
@@ -1070,9 +842,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
i->second->expireDayNightDiff();
}
- /*
- Report for rollback
- */
+ // Report for rollback
if(m_gamedef->rollback())
{
RollbackNode rollback_newnode(this, p, m_gamedef);
@@ -1082,22 +852,23 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
}
/*
- Add neighboring liquid nodes and the node itself if it is
- liquid (=water node was added) to transform queue.
- */
+ Add neighboring liquid nodes and this node to transform queue.
+ (it's vital for the node itself to get updated last, if it was removed.)
+ */
v3s16 dirs[7] = {
- v3s16(0,0,0), // self
v3s16(0,0,1), // back
v3s16(0,1,0), // top
v3s16(1,0,0), // right
v3s16(0,0,-1), // front
v3s16(0,-1,0), // bottom
v3s16(-1,0,0), // left
+ v3s16(0,0,0), // self
};
for(u16 i=0; i<7; i++)
{
v3s16 p2 = p + dirs[i];
+ bool is_valid_position;
MapNode n2 = getNodeNoEx(p2, &is_valid_position);
if(is_valid_position
&& (ndef->get(n2).isLiquid() || n2.getContent() == CONTENT_AIR))
@@ -1107,183 +878,10 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
}
}
-/*
-*/
void Map::removeNodeAndUpdate(v3s16 p,
std::map<v3s16, MapBlock*> &modified_blocks)
{
- INodeDefManager *ndef = m_gamedef->ndef();
-
- /*PrintInfo(m_dout);
- m_dout<<"Map::removeNodeAndUpdate(): p=("
- <<p.X<<","<<p.Y<<","<<p.Z<<")"<<std::endl;*/
-
- bool node_under_sunlight = true;
-
- v3s16 toppos = p + v3s16(0,1,0);
-
- // Node will be replaced with this
- content_t replace_material = CONTENT_AIR;
-
- /*
- Collect old node for rollback
- */
- RollbackNode rollback_oldnode(this, p, m_gamedef);
-
- /*
- If there is a node at top and it doesn't have sunlight,
- there will be no sunlight going down.
- */
- bool is_valid_position;
- MapNode topnode = getNodeNoEx(toppos, &is_valid_position);
-
- if(is_valid_position && topnode.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN)
- node_under_sunlight = false;
-
- std::set<v3s16> light_sources;
-
- enum LightBank banks[] =
- {
- LIGHTBANK_DAY,
- LIGHTBANK_NIGHT
- };
- for(s32 i=0; i<2; i++)
- {
- enum LightBank bank = banks[i];
-
- /*
- Unlight neighbors (in case the node is a light source)
- */
- unLightNeighbors(bank, p,
- getNodeNoEx(p).getLight(bank, ndef),
- light_sources, modified_blocks);
- }
-
- /*
- Remove node metadata
- */
-
- removeNodeMetadata(p);
-
- /*
- Remove the node.
- This also clears the lighting.
- */
-
- MapNode n(replace_material);
- setNode(p, n);
-
- for(s32 i=0; i<2; i++)
- {
- enum LightBank bank = banks[i];
-
- /*
- Recalculate lighting
- */
- spreadLight(bank, light_sources, modified_blocks);
- }
-
- // Add the block of the removed node to modified_blocks
- v3s16 blockpos = getNodeBlockPos(p);
- MapBlock * block = getBlockNoCreate(blockpos);
- assert(block != NULL);
- modified_blocks[blockpos] = block;
-
- /*
- If the removed node was under sunlight, propagate the
- sunlight down from it and then light all neighbors
- of the propagated blocks.
- */
- if(node_under_sunlight)
- {
- s16 ybottom = propagateSunlight(p, modified_blocks);
- /*m_dout<<"Node was under sunlight. "
- "Propagating sunlight";
- m_dout<<" -> ybottom="<<ybottom<<std::endl;*/
- s16 y = p.Y;
- for(; y >= ybottom; y--)
- {
- v3s16 p2(p.X, y, p.Z);
- /*m_dout<<"lighting neighbors of node ("
- <<p2.X<<","<<p2.Y<<","<<p2.Z<<")"
- <<std::endl;*/
- lightNeighbors(LIGHTBANK_DAY, p2, modified_blocks);
- }
- }
- else
- {
- // Set the lighting of this node to 0
- // TODO: Is this needed? Lighting is cleared up there already.
- MapNode n = getNodeNoEx(p, &is_valid_position);
- if (is_valid_position) {
- n.setLight(LIGHTBANK_DAY, 0, ndef);
- setNode(p, n);
- } else {
- FATAL_ERROR("Invalid position");
- }
- }
-
- for(s32 i=0; i<2; i++)
- {
- enum LightBank bank = banks[i];
-
- // Get the brightest neighbour node and propagate light from it
- v3s16 n2p = getBrightestNeighbour(bank, p);
- try{
- //MapNode n2 = getNode(n2p);
- lightNeighbors(bank, n2p, modified_blocks);
- }
- catch(InvalidPositionException &e)
- {
- }
- }
-
- /*
- Update information about whether day and night light differ
- */
- for(std::map<v3s16, MapBlock*>::iterator
- i = modified_blocks.begin();
- i != modified_blocks.end(); ++i)
- {
- i->second->expireDayNightDiff();
- }
-
- /*
- Report for rollback
- */
- if(m_gamedef->rollback())
- {
- RollbackNode rollback_newnode(this, p, m_gamedef);
- RollbackAction action;
- action.setSetNode(p, rollback_oldnode, rollback_newnode);
- m_gamedef->rollback()->reportAction(action);
- }
-
- /*
- Add neighboring liquid nodes and this node to transform queue.
- (it's vital for the node itself to get updated last.)
- */
- v3s16 dirs[7] = {
- v3s16(0,0,1), // back
- v3s16(0,1,0), // top
- v3s16(1,0,0), // right
- v3s16(0,0,-1), // front
- v3s16(0,-1,0), // bottom
- v3s16(-1,0,0), // left
- v3s16(0,0,0), // self
- };
- for(u16 i=0; i<7; i++)
- {
- v3s16 p2 = p + dirs[i];
-
- bool is_position_valid;
- MapNode n2 = getNodeNoEx(p2, &is_position_valid);
- if (is_position_valid
- && (ndef->get(n2).isLiquid() || n2.getContent() == CONTENT_AIR))
- {
- m_transforming_liquid.push_back(p2);
- }
- }
+ addNodeAndUpdate(p, MapNode(CONTENT_AIR), modified_blocks, true);
}
bool Map::addNodeWithEvent(v3s16 p, MapNode n, bool remove_metadata)
@@ -1631,8 +1229,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
// list of nodes that due to viscosity have not reached their max level height
std::deque<v3s16> must_reflow;
- // List of MapBlocks that will require a lighting update (due to lava)
- std::map<v3s16, MapBlock *> lighting_modified_blocks;
+ std::vector<std::pair<v3s16, MapNode> > changed_nodes;
u32 liquid_loop_max = g_settings->getS32("liquid_loop_max");
u32 loop_max = liquid_loop_max;
@@ -1673,7 +1270,11 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
Collect information about current node
*/
s8 liquid_level = -1;
+ // The liquid node which will be placed there if
+ // the liquid flows into this node.
content_t liquid_kind = CONTENT_IGNORE;
+ // The node which will be placed there if liquid
+ // can't flow into this node.
content_t floodable_node = CONTENT_AIR;
const ContentFeatures &cf = nodemgr->get(n0);
LiquidType liquid_type = cf.liquid_type;
@@ -1709,6 +1310,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
NodeNeighbor neutrals[6]; // nodes that are solid or another kind of liquid
int num_neutrals = 0;
bool flowing_down = false;
+ bool ignored_sources = false;
for (u16 i = 0; i < 6; i++) {
NeighborType nt = NEIGHBOR_SAME_LEVEL;
switch (i) {
@@ -1736,10 +1338,15 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
flowing_down = true;
} else {
neutrals[num_neutrals++] = nb;
- // If neutral below is ignore prevent water spreading outwards
- if (nb.t == NEIGHBOR_LOWER &&
- nb.n.getContent() == CONTENT_IGNORE)
- flowing_down = true;
+ if (nb.n.getContent() == CONTENT_IGNORE) {
+ // If node below is ignore prevent water from
+ // spreading outwards and otherwise prevent from
+ // flowing away as ignore node might be the source
+ if (nb.t == NEIGHBOR_LOWER)
+ flowing_down = true;
+ else
+ ignored_sources = true;
+ }
}
break;
case LIQUID_SOURCE:
@@ -1792,6 +1399,11 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
new_node_content = liquid_kind;
else
new_node_content = floodable_node;
+ } else if (ignored_sources && liquid_level >= 0) {
+ // Maybe there are neighbouring sources that aren't loaded yet
+ // so prevent flowing away.
+ new_node_level = liquid_level;
+ new_node_content = liquid_kind;
} else {
// no surrounding sources, so get the maximum level that can flow into this node
for (u16 i = 0; i < num_flows; i++) {
@@ -1865,6 +1477,10 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
}
n0.setContent(new_node_content);
+ // Ignore light (because calling voxalgo::update_lighting_nodes)
+ n0.setLight(LIGHTBANK_DAY, 0, nodemgr);
+ n0.setLight(LIGHTBANK_NIGHT, 0, nodemgr);
+
// Find out whether there is a suspect for this action
std::string suspect;
if (m_gamedef->rollback())
@@ -1891,10 +1507,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
MapBlock *block = getBlockNoCreateNoEx(blockpos);
if (block != NULL) {
modified_blocks[blockpos] = block;
- // If new or old node emits light, MapBlock requires lighting update
- if (nodemgr->get(n0).light_source != 0 ||
- nodemgr->get(n00).light_source != 0)
- lighting_modified_blocks[block->getPos()] = block;
+ changed_nodes.push_back(std::pair<v3s16, MapNode>(p0, n00));
}
/*
@@ -1923,7 +1536,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks)
for (std::deque<v3s16>::iterator iter = must_reflow.begin(); iter != must_reflow.end(); ++iter)
m_transforming_liquid.push_back(*iter);
- updateLighting(lighting_modified_blocks, modified_blocks);
+ voxalgo::update_lighting_nodes(this, nodemgr, changed_nodes, modified_blocks);
/* ----------------------------------------------------------------------
@@ -2084,11 +1697,13 @@ NodeTimer Map::getNodeTimer(v3s16 p)
return NodeTimer();
}
NodeTimer t = block->m_node_timers.get(p_rel);
- return t;
+ NodeTimer nt(t.timeout, t.elapsed, p);
+ return nt;
}
-void Map::setNodeTimer(v3s16 p, NodeTimer t)
+void Map::setNodeTimer(const NodeTimer &t)
{
+ v3s16 p = t.position;
v3s16 blockpos = getNodeBlockPos(p);
v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE;
MapBlock *block = getBlockNoCreateNoEx(blockpos);
@@ -2102,7 +1717,8 @@ void Map::setNodeTimer(v3s16 p, NodeTimer t)
<<std::endl;
return;
}
- block->m_node_timers.set(p_rel, t);
+ NodeTimer nt(t.timeout, t.elapsed, p_rel);
+ block->m_node_timers.set(nt);
}
void Map::removeNodeTimer(v3s16 p)
@@ -2124,11 +1740,15 @@ void Map::removeNodeTimer(v3s16 p)
*/
ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge):
Map(dout_server, gamedef),
+ settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"),
m_emerge(emerge),
m_map_metadata_changed(true)
{
verbosestream<<FUNCTION_NAME<<std::endl;
+ // Tell the EmergeManager about our MapSettingsManager
+ emerge->map_settings_mgr = &settings_mgr;
+
/*
Try to load map; if not found, create a new one.
*/
@@ -2164,26 +1784,15 @@ ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emer
}
else
{
- try{
- // Load map metadata (seed, chunksize)
- loadMapMeta();
- }
- catch(SettingNotFoundException &e){
- infostream<<"ServerMap: Some metadata not found."
- <<" Using default settings."<<std::endl;
- }
- catch(FileNotGoodException &e){
- warningstream<<"Could not load map metadata"
- //<<" Disabling chunk-based generator."
- <<std::endl;
- //m_chunksize = 0;
- }
- infostream<<"ServerMap: Successfully loaded map "
- <<"metadata from "<<savedir
- <<", assuming valid save directory."
- <<" seed="<< m_emerge->params.seed <<"."
- <<std::endl;
+ if (settings_mgr.loadMapMeta()) {
+ infostream << "ServerMap: Metadata loaded from "
+ << savedir << std::endl;
+ } else {
+ infostream << "ServerMap: Metadata could not be loaded "
+ "from " << savedir << ", assuming valid save "
+ "directory." << std::endl;
+ }
m_map_saving_enabled = true;
// Map loaded, not creating new one
@@ -2253,19 +1862,26 @@ ServerMap::~ServerMap()
#endif
}
+MapgenParams *ServerMap::getMapgenParams()
+{
+ // getMapgenParams() should only ever be called after Server is initialized
+ assert(settings_mgr.mapgen_params != NULL);
+ return settings_mgr.mapgen_params;
+}
+
u64 ServerMap::getSeed()
{
- return m_emerge->params.seed;
+ return getMapgenParams()->seed;
}
s16 ServerMap::getWaterLevel()
{
- return m_emerge->params.water_level;
+ return getMapgenParams()->water_level;
}
bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
{
- s16 csize = m_emerge->params.chunksize;
+ s16 csize = getMapgenParams()->chunksize;
v3s16 bpmin = EmergeManager::getContainingChunk(blockpos, csize);
v3s16 bpmax = bpmin + v3s16(1, 1, 1) * (csize - 1);
@@ -2281,7 +1897,7 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
blockpos_over_limit(full_bpmax))
return false;
- data->seed = m_emerge->params.seed;
+ data->seed = getSeed();
data->blockpos_min = bpmin;
data->blockpos_max = bpmax;
data->blockpos_requested = blockpos;
@@ -2899,8 +2515,9 @@ void ServerMap::save(ModifiedState save_level)
infostream<<"ServerMap: Saving whole map, this can take time."
<<std::endl;
- if(m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
- saveMapMeta();
+ if (m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
+ if (settings_mgr.saveMapMeta())
+ m_map_metadata_changed = false;
}
// Profile modified reasons
@@ -2999,55 +2616,6 @@ void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst)
}
}
-void ServerMap::saveMapMeta()
-{
- DSTACK(FUNCTION_NAME);
-
- createDirs(m_savedir);
-
- std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
- std::ostringstream oss(std::ios_base::binary);
- Settings conf;
-
- m_emerge->params.save(conf);
- conf.writeLines(oss);
-
- oss << "[end_of_params]\n";
-
- if(!fs::safeWriteToFile(fullpath, oss.str())) {
- errorstream << "ServerMap::saveMapMeta(): "
- << "could not write " << fullpath << std::endl;
- throw FileNotGoodException("Cannot save chunk metadata");
- }
-
- m_map_metadata_changed = false;
-}
-
-void ServerMap::loadMapMeta()
-{
- DSTACK(FUNCTION_NAME);
-
- Settings conf;
- std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
-
- std::ifstream is(fullpath.c_str(), std::ios_base::binary);
- if (!is.good()) {
- errorstream << "ServerMap::loadMapMeta(): "
- "could not open " << fullpath << std::endl;
- throw FileNotGoodException("Cannot open map metadata");
- }
-
- if (!conf.parseConfigLines(is, "[end_of_params]")) {
- throw SerializationError("ServerMap::loadMapMeta(): "
- "[end_of_params] not found!");
- }
-
- m_emerge->params.load(conf);
-
- verbosestream << "ServerMap::loadMapMeta(): seed="
- << m_emerge->params.seed << std::endl;
-}
-
void ServerMap::saveSectorMeta(ServerMapSector *sector)
{
DSTACK(FUNCTION_NAME);
@@ -3240,6 +2808,10 @@ Database *ServerMap::createDatabase(
else if (name == "redis")
return new Database_Redis(conf);
#endif
+ #if USE_POSTGRESQL
+ else if (name == "postgresql")
+ return new Database_PostgreSQL(conf);
+ #endif
else
throw BaseException(std::string("Database backend ") + name + " not supported.");
}
@@ -3334,8 +2906,11 @@ void ServerMap::loadBlock(std::string sectordir, std::string blockfile,
block->deSerialize(is, version, true);
// If it's a new block, insert it to the map
- if(created_new)
+ if (created_new) {
sector->insertBlock(block);
+ ReflowScan scanner(this, m_emerge->ndef);
+ scanner.scan(block, &m_transforming_liquid);
+ }
/*
Save blocks loaded in old format in new format
@@ -3401,8 +2976,11 @@ void ServerMap::loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool
block->deSerialize(is, version, true);
// If it's a new block, insert it to the map
- if(created_new)
+ if (created_new) {
sector->insertBlock(block);
+ ReflowScan scanner(this, m_emerge->ndef);
+ scanner.scan(block, &m_transforming_liquid);
+ }
/*
Save blocks loaded in old format in new format
@@ -3442,8 +3020,7 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos)
v2s16 p2d(blockpos.X, blockpos.Z);
std::string ret;
-
- ret = dbase->loadBlock(blockpos);
+ dbase->loadBlock(blockpos, &ret);
if (ret != "") {
loadBlock(&ret, blockpos, createSector(p2d), false);
return getBlockNoCreateNoEx(blockpos);
diff --git a/src/map.h b/src/map.h
index 78614d228..e8d40e982 100644
--- a/src/map.h
+++ b/src/map.h
@@ -32,7 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "voxel.h"
#include "modifiedstate.h"
#include "util/container.h"
+#include "util/cpp11_container.h"
#include "nodetimer.h"
+#include "map_settings_manager.h"
class Settings;
class Database;
@@ -46,8 +48,6 @@ class IRollbackManager;
class EmergeManager;
class ServerEnvironment;
struct BlockMakeData;
-struct MapgenParams;
-
/*
MapEditEvent
@@ -211,24 +211,10 @@ public:
std::set<v3s16> & light_sources,
std::map<v3s16, MapBlock*> & modified_blocks);
- void unLightNeighbors(enum LightBank bank,
- v3s16 pos, u8 lightwas,
- std::set<v3s16> & light_sources,
- std::map<v3s16, MapBlock*> & modified_blocks);
-
void spreadLight(enum LightBank bank,
std::set<v3s16> & from_nodes,
std::map<v3s16, MapBlock*> & modified_blocks);
-
- void lightNeighbors(enum LightBank bank,
- v3s16 pos,
- std::map<v3s16, MapBlock*> & modified_blocks);
-
- v3s16 getBrightestNeighbour(enum LightBank bank, v3s16 p);
-
- s16 propagateSunlight(v3s16 start,
- std::map<v3s16, MapBlock*> & modified_blocks);
-
+
void updateLighting(enum LightBank bank,
std::map<v3s16, MapBlock*> & a_blocks,
std::map<v3s16, MapBlock*> & modified_blocks);
@@ -327,7 +313,7 @@ public:
*/
NodeTimer getNodeTimer(v3s16 p);
- void setNodeTimer(v3s16 p, NodeTimer t);
+ void setNodeTimer(const NodeTimer &t);
void removeNodeTimer(v3s16 p);
/*
@@ -463,9 +449,8 @@ public:
void save(ModifiedState save_level);
void listAllLoadableBlocks(std::vector<v3s16> &dst);
void listAllLoadedBlocks(std::vector<v3s16> &dst);
- // Saves map seed and possibly other stuff
- void saveMapMeta();
- void loadMapMeta();
+
+ MapgenParams *getMapgenParams();
/*void saveChunkMeta();
void loadChunkMeta();*/
@@ -506,6 +491,8 @@ public:
u64 getSeed();
s16 getWaterLevel();
+ MapSettingsManager settings_mgr;
+
private:
// Emerge manager
EmergeManager *m_emerge;
diff --git a/src/map_settings_manager.cpp b/src/map_settings_manager.cpp
new file mode 100644
index 000000000..53d17125c
--- /dev/null
+++ b/src/map_settings_manager.cpp
@@ -0,0 +1,194 @@
+/*
+Minetest
+Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "debug.h"
+#include "filesys.h"
+#include "log.h"
+#include "mapgen.h"
+#include "settings.h"
+
+#include "map_settings_manager.h"
+
+MapSettingsManager::MapSettingsManager(
+ Settings *user_settings, const std::string &map_meta_path)
+{
+ m_map_meta_path = map_meta_path;
+ m_user_settings = user_settings;
+ m_map_settings = new Settings;
+ mapgen_params = NULL;
+
+ assert(m_user_settings != NULL);
+}
+
+
+MapSettingsManager::~MapSettingsManager()
+{
+ delete m_map_settings;
+ delete mapgen_params;
+}
+
+
+bool MapSettingsManager::getMapSetting(
+ const std::string &name, std::string *value_out)
+{
+ if (m_map_settings->getNoEx(name, *value_out))
+ return true;
+
+ // Compatibility kludge
+ if (m_user_settings == g_settings && name == "seed")
+ return m_user_settings->getNoEx("fixed_map_seed", *value_out);
+
+ return m_user_settings->getNoEx(name, *value_out);
+}
+
+
+bool MapSettingsManager::getMapSettingNoiseParams(
+ const std::string &name, NoiseParams *value_out)
+{
+ return m_map_settings->getNoiseParams(name, *value_out) ||
+ m_user_settings->getNoiseParams(name, *value_out);
+}
+
+
+bool MapSettingsManager::setMapSetting(
+ const std::string &name, const std::string &value, bool override_meta)
+{
+ if (mapgen_params)
+ return false;
+
+ if (override_meta)
+ m_map_settings->set(name, value);
+ else
+ m_map_settings->setDefault(name, value);
+
+ return true;
+}
+
+
+bool MapSettingsManager::setMapSettingNoiseParams(
+ const std::string &name, const NoiseParams *value, bool override_meta)
+{
+ if (mapgen_params)
+ return false;
+
+ m_map_settings->setNoiseParams(name, *value, !override_meta);
+ return true;
+}
+
+
+bool MapSettingsManager::loadMapMeta()
+{
+ std::ifstream is(m_map_meta_path.c_str(), std::ios_base::binary);
+
+ if (!is.good()) {
+ errorstream << "loadMapMeta: could not open "
+ << m_map_meta_path << std::endl;
+ return false;
+ }
+
+ if (!m_map_settings->parseConfigLines(is, "[end_of_params]")) {
+ errorstream << "loadMapMeta: [end_of_params] not found!" << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+
+bool MapSettingsManager::saveMapMeta()
+{
+ // If mapgen params haven't been created yet; abort
+ if (!mapgen_params)
+ return false;
+
+ if (!fs::CreateAllDirs(fs::RemoveLastPathComponent(m_map_meta_path))) {
+ errorstream << "saveMapMeta: could not create dirs to "
+ << m_map_meta_path;
+ return false;
+ }
+
+ std::ostringstream oss(std::ios_base::binary);
+ Settings conf;
+
+ mapgen_params->MapgenParams::writeParams(&conf);
+ mapgen_params->writeParams(&conf);
+ conf.writeLines(oss);
+
+ // NOTE: If there are ever types of map settings other than
+ // those relating to map generation, save them here
+
+ oss << "[end_of_params]\n";
+
+ if (!fs::safeWriteToFile(m_map_meta_path, oss.str())) {
+ errorstream << "saveMapMeta: could not write "
+ << m_map_meta_path << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
+
+MapgenParams *MapSettingsManager::makeMapgenParams()
+{
+ if (mapgen_params)
+ return mapgen_params;
+
+ assert(m_user_settings != NULL);
+ assert(m_map_settings != NULL);
+
+ // At this point, we have (in order of precedence):
+ // 1). m_mapgen_settings->m_settings containing map_meta.txt settings or
+ // explicit overrides from scripts
+ // 2). m_mapgen_settings->m_defaults containing script-set mgparams without
+ // overrides
+ // 3). g_settings->m_settings containing all user-specified config file
+ // settings
+ // 4). g_settings->m_defaults containing any low-priority settings from
+ // scripts, e.g. mods using Lua as an enhanced config file)
+
+ // Now, get the mapgen type so we can create the appropriate MapgenParams
+ std::string mg_name;
+ MapgenType mgtype = getMapSetting("mg_name", &mg_name) ?
+ Mapgen::getMapgenType(mg_name) : MAPGEN_DEFAULT;
+ if (mgtype == MAPGEN_INVALID) {
+ errorstream << "EmergeManager: mapgen '" << mg_name <<
+ "' not valid; falling back to " <<
+ Mapgen::getMapgenName(MAPGEN_DEFAULT) << std::endl;
+ mgtype = MAPGEN_DEFAULT;
+ }
+
+ // Create our MapgenParams
+ MapgenParams *params = Mapgen::createMapgenParams(mgtype);
+ if (params == NULL)
+ return NULL;
+
+ params->mgtype = mgtype;
+
+ // Load the rest of the mapgen params from our active settings
+ params->MapgenParams::readParams(m_user_settings);
+ params->MapgenParams::readParams(m_map_settings);
+ params->readParams(m_user_settings);
+ params->readParams(m_map_settings);
+
+ // Hold onto our params
+ mapgen_params = params;
+
+ return params;
+}
diff --git a/src/map_settings_manager.h b/src/map_settings_manager.h
new file mode 100644
index 000000000..9f766f1f0
--- /dev/null
+++ b/src/map_settings_manager.h
@@ -0,0 +1,79 @@
+/*
+Minetest
+Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef MAP_SETTINGS_MANAGER_HEADER
+#define MAP_SETTINGS_MANAGER_HEADER
+
+#include <string>
+
+class Settings;
+struct NoiseParams;
+struct MapgenParams;
+
+/*
+ MapSettingsManager is a centralized object for management (creating,
+ loading, storing, saving, etc.) of config settings related to the Map.
+
+ It has two phases: the initial r/w "gather and modify settings" state, and
+ the final r/o "read and save settings" state.
+
+ The typical use case is, in order, as follows:
+ - Create a MapSettingsManager object
+ - Try to load map metadata into it from the metadata file
+ - Manually view and modify the current configuration as desired through a
+ Settings-like interface
+ - When all modifications are finished, create a 'Parameters' object
+ containing the finalized, active parameters. This could be passed along
+ to whichever Map-related objects that may require it.
+ - Save these active settings to the metadata file when requested
+*/
+class MapSettingsManager {
+public:
+ // Finalized map generation parameters
+ MapgenParams *mapgen_params;
+
+ MapSettingsManager(Settings *user_settings,
+ const std::string &map_meta_path);
+ ~MapSettingsManager();
+
+ bool getMapSetting(const std::string &name, std::string *value_out);
+
+ bool getMapSettingNoiseParams(
+ const std::string &name, NoiseParams *value_out);
+
+ // Note: Map config becomes read-only after makeMapgenParams() gets called
+ // (i.e. mapgen_params is non-NULL). Attempts to set map config after
+ // params have been finalized will result in failure.
+ bool setMapSetting(const std::string &name,
+ const std::string &value, bool override_meta = false);
+
+ bool setMapSettingNoiseParams(const std::string &name,
+ const NoiseParams *value, bool override_meta = false);
+
+ bool loadMapMeta();
+ bool saveMapMeta();
+ MapgenParams *makeMapgenParams();
+
+private:
+ std::string m_map_meta_path;
+ Settings *m_map_settings;
+ Settings *m_user_settings;
+};
+
+#endif
diff --git a/src/mapblock.h b/src/mapblock.h
index 73c17ee60..5adfcf3fb 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -488,9 +488,9 @@ public:
m_node_timers.remove(p);
}
- inline void setNodeTimer(v3s16 p, NodeTimer t)
+ inline void setNodeTimer(const NodeTimer &t)
{
- m_node_timers.set(p,t);
+ m_node_timers.set(t);
}
inline void clearNodeTimers()
diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp
index e1b044271..00f83e7ab 100644
--- a/src/mapblock_mesh.cpp
+++ b/src/mapblock_mesh.cpp
@@ -839,7 +839,7 @@ static void updateFastFaceRow(
{
v3s16 p = startpos;
- u16 continuous_tiles_count = 0;
+ u16 continuous_tiles_count = 1;
bool makes_face = false;
v3s16 p_corrected;
@@ -889,8 +889,8 @@ static void updateFastFaceRow(
&& (tile.material_flags & MATERIAL_FLAG_TILEABLE_HORIZONTAL)
&& (tile.material_flags & MATERIAL_FLAG_TILEABLE_VERTICAL)) {
next_is_different = false;
- }
- else{
+ continuous_tiles_count++;
+ } else {
/*if(makes_face){
g_profiler->add("Meshgen: diff: next_makes_face != makes_face",
next_makes_face != makes_face ? 1 : 0);
@@ -915,8 +915,6 @@ static void updateFastFaceRow(
g_profiler->add("Meshgen: diff: last position", 1);*/
}
- continuous_tiles_count++;
-
if(next_is_different)
{
/*
@@ -928,8 +926,6 @@ static void updateFastFaceRow(
v3f pf(p_corrected.X, p_corrected.Y, p_corrected.Z);
// Center point of face (kind of)
v3f sp = pf - ((f32)continuous_tiles_count / 2.0 - 0.5) * translate_dir_f;
- if(continuous_tiles_count != 1)
- sp += translate_dir_f;
v3f scale(1,1,1);
if(translate_dir.X != 0) {
@@ -952,19 +948,18 @@ static void updateFastFaceRow(
}
}
- continuous_tiles_count = 0;
-
- makes_face = next_makes_face;
- p_corrected = next_p_corrected;
- face_dir_corrected = next_face_dir_corrected;
- lights[0] = next_lights[0];
- lights[1] = next_lights[1];
- lights[2] = next_lights[2];
- lights[3] = next_lights[3];
- tile = next_tile;
- light_source = next_light_source;
+ continuous_tiles_count = 1;
}
+ makes_face = next_makes_face;
+ p_corrected = next_p_corrected;
+ face_dir_corrected = next_face_dir_corrected;
+ lights[0] = next_lights[0];
+ lights[1] = next_lights[1];
+ lights[2] = next_lights[2];
+ lights[3] = next_lights[3];
+ tile = next_tile;
+ light_source = next_light_source;
p = p_next;
}
}
@@ -1038,7 +1033,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
m_enable_shaders = data->m_use_shaders;
m_use_tangent_vertices = data->m_use_tangent_vertices;
m_enable_vbo = g_settings->getBool("enable_vbo");
-
+
if (g_settings->getBool("enable_minimap")) {
m_minimap_mapblock = new MinimapMapblock;
m_minimap_mapblock->getMinimapNodes(
@@ -1303,10 +1298,8 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
// Cracks
if(crack != m_last_crack)
{
- for(std::map<u32, std::string>::iterator
- i = m_crack_materials.begin();
- i != m_crack_materials.end(); ++i)
- {
+ for (UNORDERED_MAP<u32, std::string>::iterator i = m_crack_materials.begin();
+ i != m_crack_materials.end(); ++i) {
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer(i->first);
std::string basename = i->second;
@@ -1320,9 +1313,9 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
// If the current material is also animated,
// update animation info
- std::map<u32, TileSpec>::iterator anim_iter =
- m_animation_tiles.find(i->first);
- if(anim_iter != m_animation_tiles.end()){
+ UNORDERED_MAP<u32, TileSpec>::iterator anim_iter =
+ m_animation_tiles.find(i->first);
+ if (anim_iter != m_animation_tiles.end()){
TileSpec &tile = anim_iter->second;
tile.texture = new_texture;
tile.texture_id = new_texture_id;
@@ -1335,10 +1328,8 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
}
// Texture animation
- for(std::map<u32, TileSpec>::iterator
- i = m_animation_tiles.begin();
- i != m_animation_tiles.end(); ++i)
- {
+ for (UNORDERED_MAP<u32, TileSpec>::iterator i = m_animation_tiles.begin();
+ i != m_animation_tiles.end(); ++i) {
const TileSpec &tile = i->second;
// Figure out current frame
int frameoffset = m_animation_frame_offsets[i->first];
@@ -1448,7 +1439,7 @@ void MeshCollector::append(const TileSpec &tile,
vertices[i].Color, vertices[i].TCoords);
p->vertices.push_back(vert);
}
- }
+ }
for (u32 i = 0; i < numIndices; i++) {
u32 j = indices[i] + vertex_count;
@@ -1504,7 +1495,7 @@ void MeshCollector::append(const TileSpec &tile,
vertices[i].Normal, c, vertices[i].TCoords);
p->vertices.push_back(vert);
}
- }
+ }
for (u32 i = 0; i < numIndices; i++) {
u32 j = indices[i] + vertex_count;
diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h
index f89fbe669..8376468da 100644
--- a/src/mapblock_mesh.h
+++ b/src/mapblock_mesh.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes_extrabloated.h"
#include "client/tile.h"
#include "voxel.h"
+#include "util/cpp11_container.h"
#include <map>
class IGameDef;
@@ -121,7 +122,7 @@ public:
if(m_animation_force_timer > 0)
m_animation_force_timer--;
}
-
+
void updateCameraOffset(v3s16 camera_offset);
private:
@@ -144,20 +145,20 @@ private:
// Last crack value passed to animate()
int m_last_crack;
// Maps mesh buffer (i.e. material) indices to base texture names
- std::map<u32, std::string> m_crack_materials;
+ UNORDERED_MAP<u32, std::string> m_crack_materials;
// Animation info: texture animationi
// Maps meshbuffers to TileSpecs
- std::map<u32, TileSpec> m_animation_tiles;
- std::map<u32, int> m_animation_frames; // last animation frame
- std::map<u32, int> m_animation_frame_offsets;
-
+ UNORDERED_MAP<u32, TileSpec> m_animation_tiles;
+ UNORDERED_MAP<u32, int> m_animation_frames; // last animation frame
+ UNORDERED_MAP<u32, int> m_animation_frame_offsets;
+
// Animation info: day/night transitions
// Last daynight_ratio value passed to animate()
u32 m_last_daynight_ratio;
// For each meshbuffer, maps vertex indices to (day,night) pairs
std::map<u32, std::map<u32, std::pair<u8, u8> > > m_daynight_diffs;
-
+
// Camera offset info -> do we have to translate the mesh?
v3s16 m_camera_offset;
};
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index b3c9380a0..fd4f5858f 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -39,12 +39,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/numeric.h"
#include "filesys.h"
#include "log.h"
+#include "mapgen_flat.h"
+#include "mapgen_fractal.h"
+#include "mapgen_v5.h"
+#include "mapgen_v6.h"
+#include "mapgen_v7.h"
+#include "mapgen_valleys.h"
+#include "mapgen_singlenode.h"
+#include "cavegen.h"
+#include "dungeongen.h"
FlagDesc flagdesc_mapgen[] = {
- {"trees", MG_TREES},
{"caves", MG_CAVES},
{"dungeons", MG_DUNGEONS},
- {"flat", MG_FLAT},
{"light", MG_LIGHT},
{"decorations", MG_DECORATIONS},
{NULL, 0}
@@ -61,6 +68,28 @@ FlagDesc flagdesc_gennotify[] = {
{NULL, 0}
};
+struct MapgenDesc {
+ const char *name;
+ bool is_user_visible;
+};
+
+////
+//// Built-in mapgens
+////
+
+static MapgenDesc g_reg_mapgens[] = {
+ {"v5", true},
+ {"v6", true},
+ {"v7", true},
+ {"flat", true},
+ {"fractal", true},
+ {"valleys", true},
+ {"singlenode", false},
+};
+
+STATIC_ASSERT(
+ ARRLEN(g_reg_mapgens) == MAPGEN_INVALID,
+ registered_mapgens_is_wrong_size);
////
//// Mapgen
@@ -76,10 +105,9 @@ Mapgen::Mapgen()
vm = NULL;
ndef = NULL;
- heightmap = NULL;
+ biomegen = NULL;
biomemap = NULL;
- heatmap = NULL;
- humidmap = NULL;
+ heightmap = NULL;
}
@@ -88,17 +116,30 @@ Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge) :
{
generating = false;
id = mapgenid;
- seed = (int)params->seed;
water_level = params->water_level;
flags = params->flags;
csize = v3s16(1, 1, 1) * (params->chunksize * MAP_BLOCKSIZE);
+ /*
+ We are losing half our entropy by doing this, but it is necessary to
+ preserve reverse compatibility. If the top half of our current 64 bit
+ seeds ever starts getting used, existing worlds will break due to a
+ different hash outcome and no way to differentiate between versions.
+
+ A solution could be to add a new bit to designate that the top half of
+ the seed value should be used, essentially a 1-bit version code, but
+ this would require increasing the total size of a seed to 9 bytes (yuck)
+
+ It's probably okay if this never gets fixed. 4.2 billion possibilities
+ ought to be enough for anyone.
+ */
+ seed = (s32)params->seed;
+
vm = NULL;
- ndef = NULL;
- heightmap = NULL;
+ ndef = emerge->ndef;
+ biomegen = NULL;
biomemap = NULL;
- heatmap = NULL;
- humidmap = NULL;
+ heightmap = NULL;
}
@@ -107,7 +148,84 @@ Mapgen::~Mapgen()
}
-u32 Mapgen::getBlockSeed(v3s16 p, int seed)
+MapgenType Mapgen::getMapgenType(const std::string &mgname)
+{
+ for (size_t i = 0; i != ARRLEN(g_reg_mapgens); i++) {
+ if (mgname == g_reg_mapgens[i].name)
+ return (MapgenType)i;
+ }
+
+ return MAPGEN_INVALID;
+}
+
+
+const char *Mapgen::getMapgenName(MapgenType mgtype)
+{
+ size_t index = (size_t)mgtype;
+ if (index == MAPGEN_INVALID || index >= ARRLEN(g_reg_mapgens))
+ return "invalid";
+
+ return g_reg_mapgens[index].name;
+}
+
+
+Mapgen *Mapgen::createMapgen(MapgenType mgtype, int mgid,
+ MapgenParams *params, EmergeManager *emerge)
+{
+ switch (mgtype) {
+ case MAPGEN_FLAT:
+ return new MapgenFlat(mgid, (MapgenFlatParams *)params, emerge);
+ case MAPGEN_FRACTAL:
+ return new MapgenFractal(mgid, (MapgenFractalParams *)params, emerge);
+ case MAPGEN_SINGLENODE:
+ return new MapgenSinglenode(mgid, (MapgenSinglenodeParams *)params, emerge);
+ case MAPGEN_V5:
+ return new MapgenV5(mgid, (MapgenV5Params *)params, emerge);
+ case MAPGEN_V6:
+ return new MapgenV6(mgid, (MapgenV6Params *)params, emerge);
+ case MAPGEN_V7:
+ return new MapgenV7(mgid, (MapgenV7Params *)params, emerge);
+ case MAPGEN_VALLEYS:
+ return new MapgenValleys(mgid, (MapgenValleysParams *)params, emerge);
+ default:
+ return NULL;
+ }
+}
+
+
+MapgenParams *Mapgen::createMapgenParams(MapgenType mgtype)
+{
+ switch (mgtype) {
+ case MAPGEN_FLAT:
+ return new MapgenFlatParams;
+ case MAPGEN_FRACTAL:
+ return new MapgenFractalParams;
+ case MAPGEN_SINGLENODE:
+ return new MapgenSinglenodeParams;
+ case MAPGEN_V5:
+ return new MapgenV5Params;
+ case MAPGEN_V6:
+ return new MapgenV6Params;
+ case MAPGEN_V7:
+ return new MapgenV7Params;
+ case MAPGEN_VALLEYS:
+ return new MapgenValleysParams;
+ default:
+ return NULL;
+ }
+}
+
+
+void Mapgen::getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden)
+{
+ for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
+ if (include_hidden || g_reg_mapgens[i].is_user_visible)
+ mgnames->push_back(g_reg_mapgens[i].name);
+ }
+}
+
+
+u32 Mapgen::getBlockSeed(v3s16 p, s32 seed)
{
return (u32)seed +
p.Z * 38134234 +
@@ -116,7 +234,7 @@ u32 Mapgen::getBlockSeed(v3s16 p, int seed)
}
-u32 Mapgen::getBlockSeed2(v3s16 p, int seed)
+u32 Mapgen::getBlockSeed2(v3s16 p, s32 seed)
{
u32 n = 1619 * p.X + 31337 * p.Y + 52591 * p.Z + 1013 * seed;
n = (n >> 13) ^ n;
@@ -199,27 +317,86 @@ void Mapgen::updateHeightmap(v3s16 nmin, v3s16 nmax)
//printf("updateHeightmap: %dus\n", t.stop());
}
+inline bool Mapgen::isLiquidHorizontallyFlowable(u32 vi, v3s16 em)
+{
+ u32 vi_neg_x = vi;
+ vm->m_area.add_x(em, vi_neg_x, -1);
+ if (vm->m_data[vi_neg_x].getContent() != CONTENT_IGNORE) {
+ const ContentFeatures &c_nx = ndef->get(vm->m_data[vi_neg_x]);
+ if (c_nx.floodable && !c_nx.isLiquid())
+ return true;
+ }
+ u32 vi_pos_x = vi;
+ vm->m_area.add_x(em, vi_pos_x, +1);
+ if (vm->m_data[vi_pos_x].getContent() != CONTENT_IGNORE) {
+ const ContentFeatures &c_px = ndef->get(vm->m_data[vi_pos_x]);
+ if (c_px.floodable && !c_px.isLiquid())
+ return true;
+ }
+ u32 vi_neg_z = vi;
+ vm->m_area.add_z(em, vi_neg_z, -1);
+ if (vm->m_data[vi_neg_z].getContent() != CONTENT_IGNORE) {
+ const ContentFeatures &c_nz = ndef->get(vm->m_data[vi_neg_z]);
+ if (c_nz.floodable && !c_nz.isLiquid())
+ return true;
+ }
+ u32 vi_pos_z = vi;
+ vm->m_area.add_z(em, vi_pos_z, +1);
+ if (vm->m_data[vi_pos_z].getContent() != CONTENT_IGNORE) {
+ const ContentFeatures &c_pz = ndef->get(vm->m_data[vi_pos_z]);
+ if (c_pz.floodable && !c_pz.isLiquid())
+ return true;
+ }
+ return false;
+}
void Mapgen::updateLiquid(UniqueQueue<v3s16> *trans_liquid, v3s16 nmin, v3s16 nmax)
{
- bool isliquid, wasliquid;
+ bool isignored, isliquid, wasignored, wasliquid, waschecked, waspushed;
v3s16 em = vm->m_area.getExtent();
- for (s16 z = nmin.Z; z <= nmax.Z; z++) {
- for (s16 x = nmin.X; x <= nmax.X; x++) {
- wasliquid = true;
-
- u32 i = vm->m_area.index(x, nmax.Y, z);
- for (s16 y = nmax.Y; y >= nmin.Y; y--) {
- isliquid = ndef->get(vm->m_data[i]).isLiquid();
-
- // there was a change between liquid and nonliquid, add to queue.
- if (isliquid != wasliquid)
+ for (s16 z = nmin.Z + 1; z <= nmax.Z - 1; z++)
+ for (s16 x = nmin.X + 1; x <= nmax.X - 1; x++) {
+ wasignored = true;
+ wasliquid = false;
+ waschecked = false;
+ waspushed = false;
+
+ u32 vi = vm->m_area.index(x, nmax.Y, z);
+ for (s16 y = nmax.Y; y >= nmin.Y; y--) {
+ isignored = vm->m_data[vi].getContent() == CONTENT_IGNORE;
+ isliquid = ndef->get(vm->m_data[vi]).isLiquid();
+
+ if (isignored || wasignored || isliquid == wasliquid) {
+ // Neither topmost node of liquid column nor topmost node below column
+ waschecked = false;
+ waspushed = false;
+ } else if (isliquid) {
+ // This is the topmost node in the column
+ bool ispushed = false;
+ if (isLiquidHorizontallyFlowable(vi, em)) {
trans_liquid->push_back(v3s16(x, y, z));
-
- wasliquid = isliquid;
- vm->m_area.add_y(em, i, -1);
+ ispushed = true;
+ }
+ // Remember waschecked and waspushed to avoid repeated
+ // checks/pushes in case the column consists of only this node
+ waschecked = true;
+ waspushed = ispushed;
+ } else {
+ // This is the topmost node below a liquid column
+ u32 vi_above = vi;
+ vm->m_area.add_y(em, vi_above, 1);
+ if (!waspushed && (ndef->get(vm->m_data[vi]).floodable ||
+ (!waschecked && isLiquidHorizontallyFlowable(vi_above, em)))) {
+ // Push back the lowest node in the column which is one
+ // node above this one
+ trans_liquid->push_back(v3s16(x, y + 1, z));
+ }
}
+
+ wasliquid = isliquid;
+ wasignored = isignored;
+ vm->m_area.add_y(em, vi, -1);
}
}
}
@@ -372,6 +549,349 @@ void Mapgen::spreadLight(v3s16 nmin, v3s16 nmax)
////
+//// MapgenBasic
+////
+
+MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge)
+ : Mapgen(mapgenid, params, emerge)
+{
+ this->m_emerge = emerge;
+ this->m_bmgr = emerge->biomemgr;
+
+ //// Here, 'stride' refers to the number of elements needed to skip to index
+ //// an adjacent element for that coordinate in noise/height/biome maps
+ //// (*not* vmanip content map!)
+
+ // Note there is no X stride explicitly defined. Items adjacent in the X
+ // coordinate are assumed to be adjacent in memory as well (i.e. stride of 1).
+
+ // Number of elements to skip to get to the next Y coordinate
+ this->ystride = csize.X;
+
+ // Number of elements to skip to get to the next Z coordinate
+ this->zstride = csize.X * csize.Y;
+
+ // Z-stride value for maps oversized for 1-down overgeneration
+ this->zstride_1d = csize.X * (csize.Y + 1);
+
+ // Z-stride value for maps oversized for 1-up 1-down overgeneration
+ this->zstride_1u1d = csize.X * (csize.Y + 2);
+
+ //// Allocate heightmap
+ this->heightmap = new s16[csize.X * csize.Z];
+
+ //// Initialize biome generator
+ // TODO(hmmmm): should we have a way to disable biomemanager biomes?
+ biomegen = m_bmgr->createBiomeGen(BIOMEGEN_ORIGINAL, params->bparams, csize);
+ biomemap = biomegen->biomemap;
+
+ //// Look up some commonly used content
+ c_stone = ndef->getId("mapgen_stone");
+ c_water_source = ndef->getId("mapgen_water_source");
+ c_desert_stone = ndef->getId("mapgen_desert_stone");
+ c_sandstone = ndef->getId("mapgen_sandstone");
+ c_river_water_source = ndef->getId("mapgen_river_water_source");
+
+ // Fall back to more basic content if not defined
+ if (c_desert_stone == CONTENT_IGNORE)
+ c_desert_stone = c_stone;
+ if (c_sandstone == CONTENT_IGNORE)
+ c_sandstone = c_stone;
+ if (c_river_water_source == CONTENT_IGNORE)
+ c_river_water_source = c_water_source;
+
+ //// Content used for dungeon generation
+ c_cobble = ndef->getId("mapgen_cobble");
+ c_stair_cobble = ndef->getId("mapgen_stair_cobble");
+ c_mossycobble = ndef->getId("mapgen_mossycobble");
+ c_sandstonebrick = ndef->getId("mapgen_sandstonebrick");
+ c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
+
+ // Fall back to more basic content if not defined
+ if (c_mossycobble == CONTENT_IGNORE)
+ c_mossycobble = c_cobble;
+ if (c_stair_cobble == CONTENT_IGNORE)
+ c_stair_cobble = c_cobble;
+ if (c_sandstonebrick == CONTENT_IGNORE)
+ c_sandstonebrick = c_sandstone;
+ if (c_stair_sandstonebrick == CONTENT_IGNORE)
+ c_stair_sandstonebrick = c_sandstone;
+}
+
+
+MapgenBasic::~MapgenBasic()
+{
+ delete biomegen;
+ delete []heightmap;
+}
+
+
+MgStoneType MapgenBasic::generateBiomes()
+{
+ // can't generate biomes without a biome generator!
+ assert(biomegen);
+ assert(biomemap);
+
+ v3s16 em = vm->m_area.getExtent();
+ u32 index = 0;
+ MgStoneType stone_type = MGSTONE_STONE;
+
+ noise_filler_depth->perlinMap2D(node_min.X, node_min.Z);
+
+ for (s16 z = node_min.Z; z <= node_max.Z; z++)
+ for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
+ Biome *biome = NULL;
+ u16 depth_top = 0;
+ u16 base_filler = 0;
+ u16 depth_water_top = 0;
+ u16 depth_riverbed = 0;
+ u32 vi = vm->m_area.index(x, node_max.Y, z);
+
+ // Check node at base of mapchunk above, either a node of a previously
+ // generated mapchunk or if not, a node of overgenerated base terrain.
+ content_t c_above = vm->m_data[vi + em.X].getContent();
+ bool air_above = c_above == CONTENT_AIR;
+ bool river_water_above = c_above == c_river_water_source;
+ bool water_above = c_above == c_water_source || river_water_above;
+
+ biomemap[index] = BIOME_NONE;
+
+ // If there is air or water above enable top/filler placement, otherwise force
+ // nplaced to stone level by setting a number exceeding any possible filler depth.
+ u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
+
+ for (s16 y = node_max.Y; y >= node_min.Y; y--) {
+ content_t c = vm->m_data[vi].getContent();
+
+ // Biome is recalculated each time an upper surface is detected while
+ // working down a column. The selected biome then remains in effect for
+ // all nodes below until the next surface and biome recalculation.
+ // Biome is recalculated:
+ // 1. At the surface of stone below air or water.
+ // 2. At the surface of water below air.
+ // 3. When stone or water is detected but biome has not yet been calculated.
+ bool is_stone_surface = (c == c_stone) &&
+ (air_above || water_above || !biome);
+
+ bool is_water_surface =
+ (c == c_water_source || c == c_river_water_source) &&
+ (air_above || !biome);
+
+ if (is_stone_surface || is_water_surface) {
+ biome = biomegen->getBiomeAtIndex(index, y);
+
+ if (biomemap[index] == BIOME_NONE && is_stone_surface)
+ biomemap[index] = biome->index;
+
+ depth_top = biome->depth_top;
+ base_filler = MYMAX(depth_top +
+ biome->depth_filler +
+ noise_filler_depth->result[index], 0.f);
+ depth_water_top = biome->depth_water_top;
+ depth_riverbed = biome->depth_riverbed;
+
+ // Detect stone type for dungeons during every biome calculation.
+ // This is more efficient than detecting per-node and will not
+ // miss any desert stone or sandstone biomes.
+ if (biome->c_stone == c_desert_stone)
+ stone_type = MGSTONE_DESERT_STONE;
+ else if (biome->c_stone == c_sandstone)
+ stone_type = MGSTONE_SANDSTONE;
+ }
+
+ if (c == c_stone) {
+ content_t c_below = vm->m_data[vi - em.X].getContent();
+
+ // If the node below isn't solid, make this node stone, so that
+ // any top/filler nodes above are structurally supported.
+ // This is done by aborting the cycle of top/filler placement
+ // immediately by forcing nplaced to stone level.
+ if (c_below == CONTENT_AIR
+ || c_below == c_water_source
+ || c_below == c_river_water_source)
+ nplaced = U16_MAX;
+
+ if (river_water_above) {
+ if (nplaced < depth_riverbed) {
+ vm->m_data[vi] = MapNode(biome->c_riverbed);
+ nplaced++;
+ } else {
+ nplaced = U16_MAX; // Disable top/filler placement
+ river_water_above = false;
+ }
+ } else if (nplaced < depth_top) {
+ vm->m_data[vi] = MapNode(biome->c_top);
+ nplaced++;
+ } else if (nplaced < base_filler) {
+ vm->m_data[vi] = MapNode(biome->c_filler);
+ nplaced++;
+ } else {
+ vm->m_data[vi] = MapNode(biome->c_stone);
+ }
+
+ air_above = false;
+ water_above = false;
+ } else if (c == c_water_source) {
+ vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
+ ? biome->c_water_top : biome->c_water);
+ nplaced = 0; // Enable top/filler placement for next surface
+ air_above = false;
+ water_above = true;
+ } else if (c == c_river_water_source) {
+ vm->m_data[vi] = MapNode(biome->c_river_water);
+ nplaced = 0; // Enable riverbed placement for next surface
+ air_above = false;
+ water_above = true;
+ river_water_above = true;
+ } else if (c == CONTENT_AIR) {
+ nplaced = 0; // Enable top/filler placement for next surface
+ air_above = true;
+ water_above = false;
+ } else { // Possible various nodes overgenerated from neighbouring mapchunks
+ nplaced = U16_MAX; // Disable top/filler placement
+ air_above = false;
+ water_above = false;
+ }
+
+ vm->m_area.add_y(em, vi, -1);
+ }
+ }
+
+ return stone_type;
+}
+
+
+void MapgenBasic::dustTopNodes()
+{
+ if (node_max.Y < water_level)
+ return;
+
+ v3s16 em = vm->m_area.getExtent();
+ u32 index = 0;
+
+ for (s16 z = node_min.Z; z <= node_max.Z; z++)
+ for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
+ Biome *biome = (Biome *)m_bmgr->getRaw(biomemap[index]);
+
+ if (biome->c_dust == CONTENT_IGNORE)
+ continue;
+
+ u32 vi = vm->m_area.index(x, full_node_max.Y, z);
+ content_t c_full_max = vm->m_data[vi].getContent();
+ s16 y_start;
+
+ if (c_full_max == CONTENT_AIR) {
+ y_start = full_node_max.Y - 1;
+ } else if (c_full_max == CONTENT_IGNORE) {
+ vi = vm->m_area.index(x, node_max.Y + 1, z);
+ content_t c_max = vm->m_data[vi].getContent();
+
+ if (c_max == CONTENT_AIR)
+ y_start = node_max.Y;
+ else
+ continue;
+ } else {
+ continue;
+ }
+
+ vi = vm->m_area.index(x, y_start, z);
+ for (s16 y = y_start; y >= node_min.Y - 1; y--) {
+ if (vm->m_data[vi].getContent() != CONTENT_AIR)
+ break;
+
+ vm->m_area.add_y(em, vi, -1);
+ }
+
+ content_t c = vm->m_data[vi].getContent();
+ if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
+ vm->m_area.add_y(em, vi, 1);
+ vm->m_data[vi] = MapNode(biome->c_dust);
+ }
+ }
+}
+
+
+void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
+{
+ if (max_stone_y < node_min.Y)
+ return;
+
+ CavesNoiseIntersection caves_noise(ndef, m_bmgr, csize,
+ &np_cave1, &np_cave2, seed, cave_width);
+
+ caves_noise.generateCaves(vm, node_min, node_max, biomemap);
+
+ if (node_max.Y > large_cave_depth)
+ return;
+
+ PseudoRandom ps(blockseed + 21343);
+ u32 bruises_count = ps.range(0, 2);
+ for (u32 i = 0; i < bruises_count; i++) {
+ CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
+ c_water_source, CONTENT_IGNORE);
+
+ cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
+ }
+}
+
+
+void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
+{
+ if (max_stone_y < node_min.Y)
+ return;
+
+ DungeonParams dp;
+
+ dp.seed = seed;
+ dp.c_water = c_water_source;
+ dp.c_river_water = c_river_water_source;
+ dp.rooms_min = 2;
+ dp.rooms_max = 16;
+ dp.y_min = -MAX_MAP_GENERATION_LIMIT;
+ dp.y_max = MAX_MAP_GENERATION_LIMIT;
+ dp.np_density = nparams_dungeon_density;
+ dp.np_alt_wall = nparams_dungeon_alt_wall;
+
+ switch (stone_type) {
+ default:
+ case MGSTONE_STONE:
+ dp.c_wall = c_cobble;
+ dp.c_alt_wall = c_mossycobble;
+ dp.c_stair = c_stair_cobble;
+
+ dp.diagonal_dirs = false;
+ dp.holesize = v3s16(1, 2, 1);
+ dp.roomsize = v3s16(0, 0, 0);
+ dp.notifytype = GENNOTIFY_DUNGEON;
+ break;
+ case MGSTONE_DESERT_STONE:
+ dp.c_wall = c_desert_stone;
+ dp.c_alt_wall = CONTENT_IGNORE;
+ dp.c_stair = c_desert_stone;
+
+ dp.diagonal_dirs = true;
+ dp.holesize = v3s16(2, 3, 2);
+ dp.roomsize = v3s16(2, 5, 2);
+ dp.notifytype = GENNOTIFY_TEMPLE;
+ break;
+ case MGSTONE_SANDSTONE:
+ dp.c_wall = c_sandstonebrick;
+ dp.c_alt_wall = CONTENT_IGNORE;
+ dp.c_stair = c_sandstonebrick;
+
+ dp.diagonal_dirs = false;
+ dp.holesize = v3s16(2, 2, 2);
+ dp.roomsize = v3s16(2, 0, 2);
+ dp.notifytype = GENNOTIFY_DUNGEON;
+ break;
+ }
+
+ DungeonGen dgen(ndef, &gennotify, &dp);
+ dgen.generate(vm, blockseed, full_node_min, full_node_max);
+}
+
+
+////
//// GenerateNotifier
////
@@ -444,46 +964,50 @@ void GenerateNotifier::getEvents(
//// MapgenParams
////
-void MapgenParams::load(const Settings &settings)
+
+MapgenParams::~MapgenParams()
+{
+ delete bparams;
+}
+
+
+void MapgenParams::readParams(const Settings *settings)
{
std::string seed_str;
- const char *seed_name = (&settings == g_settings) ? "fixed_map_seed" : "seed";
-
- if (settings.getNoEx(seed_name, seed_str) && !seed_str.empty())
- seed = read_seed(seed_str.c_str());
- else
- myrand_bytes(&seed, sizeof(seed));
-
- settings.getNoEx("mg_name", mg_name);
- settings.getS16NoEx("water_level", water_level);
- settings.getS16NoEx("chunksize", chunksize);
- settings.getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
- settings.getNoiseParams("mg_biome_np_heat", np_biome_heat);
- settings.getNoiseParams("mg_biome_np_heat_blend", np_biome_heat_blend);
- settings.getNoiseParams("mg_biome_np_humidity", np_biome_humidity);
- settings.getNoiseParams("mg_biome_np_humidity_blend", np_biome_humidity_blend);
-
- delete sparams;
- MapgenFactory *mgfactory = EmergeManager::getMapgenFactory(mg_name);
- if (mgfactory) {
- sparams = mgfactory->createMapgenParams();
- sparams->readParams(&settings);
+ const char *seed_name = (settings == g_settings) ? "fixed_map_seed" : "seed";
+
+ if (settings->getNoEx(seed_name, seed_str)) {
+ if (!seed_str.empty())
+ seed = read_seed(seed_str.c_str());
+ else
+ myrand_bytes(&seed, sizeof(seed));
+ }
+
+ std::string mg_name;
+ if (settings->getNoEx("mg_name", mg_name))
+ this->mgtype = Mapgen::getMapgenType(mg_name);
+
+ settings->getS16NoEx("water_level", water_level);
+ settings->getS16NoEx("chunksize", chunksize);
+ settings->getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
+
+ delete bparams;
+ bparams = BiomeManager::createBiomeParams(BIOMEGEN_ORIGINAL);
+ if (bparams) {
+ bparams->readParams(settings);
+ bparams->seed = seed;
}
}
-void MapgenParams::save(Settings &settings) const
+void MapgenParams::writeParams(Settings *settings) const
{
- settings.set("mg_name", mg_name);
- settings.setU64("seed", seed);
- settings.setS16("water_level", water_level);
- settings.setS16("chunksize", chunksize);
- settings.setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX);
- settings.setNoiseParams("mg_biome_np_heat", np_biome_heat);
- settings.setNoiseParams("mg_biome_np_heat_blend", np_biome_heat_blend);
- settings.setNoiseParams("mg_biome_np_humidity", np_biome_humidity);
- settings.setNoiseParams("mg_biome_np_humidity_blend", np_biome_humidity_blend);
-
- if (sparams)
- sparams->writeParams(&settings);
+ settings->set("mg_name", Mapgen::getMapgenName(mgtype));
+ settings->setU64("seed", seed);
+ settings->setS16("water_level", water_level);
+ settings->setS16("chunksize", chunksize);
+ settings->setFlagStr("mg_flags", flags, flagdesc_mapgen, U32_MAX);
+
+ if (bparams)
+ bparams->writeParams(settings);
}
diff --git a/src/mapgen.h b/src/mapgen.h
index abc3d2e89..b18bfb930 100644
--- a/src/mapgen.h
+++ b/src/mapgen.h
@@ -26,16 +26,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/string.h"
#include "util/container.h"
-#define DEFAULT_MAPGEN "v6"
+#define MAPGEN_DEFAULT MAPGEN_V7
+#define MAPGEN_DEFAULT_NAME "v7"
/////////////////// Mapgen flags
-#define MG_TREES 0x01
+#define MG_TREES 0x01 // Deprecated. Moved into mgv6 flags
#define MG_CAVES 0x02
#define MG_DUNGEONS 0x04
-#define MG_FLAT 0x08
+#define MG_FLAT 0x08 // Deprecated. Moved into mgv6 flags
#define MG_LIGHT 0x10
#define MG_DECORATIONS 0x20
+typedef u8 biome_t; // copy from mg_biome.h to avoid an unnecessary include
+
class Settings;
class MMVManip;
class INodeDefManager;
@@ -44,6 +47,9 @@ extern FlagDesc flagdesc_mapgen[];
extern FlagDesc flagdesc_gennotify[];
class Biome;
+class BiomeGen;
+struct BiomeParams;
+class BiomeManager;
class EmergeManager;
class MapBlock;
class VoxelManipulator;
@@ -73,9 +79,9 @@ enum GenNotifyType {
// TODO(hmmmm/paramat): make stone type selection dynamic
enum MgStoneType {
- STONE,
- DESERT_STONE,
- SANDSTONE,
+ MGSTONE_STONE,
+ MGSTONE_DESERT_STONE,
+ MGSTONE_SANDSTONE,
};
struct GenNotifyEvent {
@@ -102,46 +108,55 @@ private:
std::list<GenNotifyEvent> m_notify_events;
};
-struct MapgenSpecificParams {
- virtual void readParams(const Settings *settings) = 0;
- virtual void writeParams(Settings *settings) const = 0;
- virtual ~MapgenSpecificParams() {}
+enum MapgenType {
+ MAPGEN_V5,
+ MAPGEN_V6,
+ MAPGEN_V7,
+ MAPGEN_FLAT,
+ MAPGEN_FRACTAL,
+ MAPGEN_VALLEYS,
+ MAPGEN_SINGLENODE,
+ MAPGEN_INVALID,
};
struct MapgenParams {
- std::string mg_name;
+ MapgenType mgtype;
s16 chunksize;
u64 seed;
s16 water_level;
u32 flags;
- NoiseParams np_biome_heat;
- NoiseParams np_biome_heat_blend;
- NoiseParams np_biome_humidity;
- NoiseParams np_biome_humidity_blend;
-
- MapgenSpecificParams *sparams;
+ BiomeParams *bparams;
MapgenParams() :
- mg_name(DEFAULT_MAPGEN),
+ mgtype(MAPGEN_DEFAULT),
chunksize(5),
seed(0),
water_level(1),
flags(MG_CAVES | MG_LIGHT | MG_DECORATIONS),
- np_biome_heat(NoiseParams(50, 50, v3f(750.0, 750.0, 750.0), 5349, 3, 0.5, 2.0)),
- np_biome_heat_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0)),
- np_biome_humidity(NoiseParams(50, 50, v3f(750.0, 750.0, 750.0), 842, 3, 0.5, 2.0)),
- np_biome_humidity_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)),
- sparams(NULL)
- {}
-
- void load(const Settings &settings);
- void save(Settings &settings) const;
+ bparams(NULL)
+ {
+ }
+
+ virtual ~MapgenParams();
+
+ virtual void readParams(const Settings *settings);
+ virtual void writeParams(Settings *settings) const;
};
+
+/*
+ Generic interface for map generators. All mapgens must inherit this class.
+ If a feature exposed by a public member pointer is not supported by a
+ certain mapgen, it must be set to NULL.
+
+ Apart from makeChunk, getGroundLevelAtPoint, and getSpawnLevelAtPoint, all
+ methods can be used by constructing a Mapgen base class and setting the
+ appropriate public members (e.g. vm, ndef, and so on).
+*/
class Mapgen {
public:
- int seed;
+ s32 seed;
int water_level;
u32 flags;
bool generating;
@@ -152,19 +167,20 @@ public:
u32 blockseed;
s16 *heightmap;
- u8 *biomemap;
- float *heatmap;
- float *humidmap;
+ biome_t *biomemap;
v3s16 csize;
+ BiomeGen *biomegen;
GenerateNotifier gennotify;
Mapgen();
Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
virtual ~Mapgen();
- static u32 getBlockSeed(v3s16 p, int seed);
- static u32 getBlockSeed2(v3s16 p, int seed);
+ virtual MapgenType getType() const { return MAPGEN_INVALID; }
+
+ static u32 getBlockSeed(v3s16 p, s32 seed);
+ static u32 getBlockSeed2(v3s16 p, s32 seed);
s16 findGroundLevelFull(v2s16 p2d);
s16 findGroundLevel(v2s16 p2d, s16 ymin, s16 ymax);
s16 findLiquidSurface(v2s16 p2d, s16 ymin, s16 ymax);
@@ -188,15 +204,81 @@ public:
// signify this and to cause Server::findSpawnPos() to try another (X, Z).
virtual int getSpawnLevelAtPoint(v2s16 p) { return 0; }
+ // Mapgen management functions
+ static MapgenType getMapgenType(const std::string &mgname);
+ static const char *getMapgenName(MapgenType mgtype);
+ static Mapgen *createMapgen(MapgenType mgtype, int mgid,
+ MapgenParams *params, EmergeManager *emerge);
+ static MapgenParams *createMapgenParams(MapgenType mgtype);
+ static void getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden);
+
private:
+ // isLiquidHorizontallyFlowable() is a helper function for updateLiquid()
+ // that checks whether there are floodable nodes without liquid beneath
+ // the node at index vi.
+ inline bool isLiquidHorizontallyFlowable(u32 vi, v3s16 em);
DISABLE_CLASS_COPY(Mapgen);
};
-struct MapgenFactory {
- virtual Mapgen *createMapgen(int mgid, MapgenParams *params,
- EmergeManager *emerge) = 0;
- virtual MapgenSpecificParams *createMapgenParams() = 0;
- virtual ~MapgenFactory() {}
+/*
+ MapgenBasic is a Mapgen implementation that handles basic functionality
+ the majority of conventional mapgens will probably want to use, but isn't
+ generic enough to be included as part of the base Mapgen class (such as
+ generating biome terrain over terrain node skeletons, generating caves,
+ dungeons, etc.)
+
+ Inherit MapgenBasic instead of Mapgen to add this basic functionality to
+ your mapgen without having to reimplement it. Feel free to override any of
+ these methods if you desire different or more advanced behavior.
+
+ Note that you must still create your own generateTerrain implementation when
+ inheriting MapgenBasic.
+*/
+class MapgenBasic : public Mapgen {
+public:
+ MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+ virtual ~MapgenBasic();
+
+ virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
+ virtual void generateDungeons(s16 max_stone_y, MgStoneType stone_type);
+ virtual MgStoneType generateBiomes();
+ virtual void dustTopNodes();
+
+protected:
+ EmergeManager *m_emerge;
+ BiomeManager *m_bmgr;
+
+ Noise *noise_filler_depth;
+
+ v3s16 node_min;
+ v3s16 node_max;
+ v3s16 full_node_min;
+ v3s16 full_node_max;
+
+ // Content required for generateBiomes
+ content_t c_stone;
+ content_t c_water_source;
+ content_t c_river_water_source;
+ content_t c_desert_stone;
+ content_t c_sandstone;
+
+ // Content required for generateDungeons
+ content_t c_cobble;
+ content_t c_stair_cobble;
+ content_t c_mossycobble;
+ content_t c_sandstonebrick;
+ content_t c_stair_sandstonebrick;
+
+ int ystride;
+ int zstride;
+ int zstride_1d;
+ int zstride_1u1d;
+
+ u32 spflags;
+
+ NoiseParams np_cave1;
+ NoiseParams np_cave2;
+ float cave_width;
};
#endif
diff --git a/src/mapgen_flat.cpp b/src/mapgen_flat.cpp
index 4669f1716..cc120b580 100644
--- a/src/mapgen_flat.cpp
+++ b/src/mapgen_flat.cpp
@@ -49,75 +49,24 @@ FlagDesc flagdesc_mapgen_flat[] = {
///////////////////////////////////////////////////////////////////////////////////////
-MapgenFlat::MapgenFlat(int mapgenid, MapgenParams *params, EmergeManager *emerge)
- : Mapgen(mapgenid, params, emerge)
+MapgenFlat::MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *emerge)
+ : MapgenBasic(mapgenid, params, emerge)
{
- this->m_emerge = emerge;
- this->bmgr = emerge->biomemgr;
-
- //// amount of elements to skip for the next index
- //// for noise/height/biome maps (not vmanip)
- this->ystride = csize.X;
- // 1-down overgeneration
- this->zstride_1d = csize.X * (csize.Y + 1);
-
- this->biomemap = new u8[csize.X * csize.Z];
- this->heightmap = new s16[csize.X * csize.Z];
- this->heatmap = NULL;
- this->humidmap = NULL;
-
- MapgenFlatParams *sp = (MapgenFlatParams *)params->sparams;
-
- this->spflags = sp->spflags;
- this->ground_level = sp->ground_level;
- this->large_cave_depth = sp->large_cave_depth;
- this->cave_width = sp->cave_width;
- this->lake_threshold = sp->lake_threshold;
- this->lake_steepness = sp->lake_steepness;
- this->hill_threshold = sp->hill_threshold;
- this->hill_steepness = sp->hill_steepness;
+ this->spflags = params->spflags;
+ this->ground_level = params->ground_level;
+ this->large_cave_depth = params->large_cave_depth;
+ this->cave_width = params->cave_width;
+ this->lake_threshold = params->lake_threshold;
+ this->lake_steepness = params->lake_steepness;
+ this->hill_threshold = params->hill_threshold;
+ this->hill_steepness = params->hill_steepness;
//// 2D noise
- noise_terrain = new Noise(&sp->np_terrain, seed, csize.X, csize.Z);
- noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
-
- //// 3D noise
- // 1-down overgeneraion
- noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
- noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
-
- //// Biome noise
- noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
- noise_humidity = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
- noise_heat_blend = new Noise(&params->np_biome_heat_blend, seed, csize.X, csize.Z);
- noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
-
- //// Resolve nodes to be used
- INodeDefManager *ndef = emerge->ndef;
-
- c_stone = ndef->getId("mapgen_stone");
- c_water_source = ndef->getId("mapgen_water_source");
- c_lava_source = ndef->getId("mapgen_lava_source");
- c_desert_stone = ndef->getId("mapgen_desert_stone");
- c_ice = ndef->getId("mapgen_ice");
- c_sandstone = ndef->getId("mapgen_sandstone");
-
- c_cobble = ndef->getId("mapgen_cobble");
- c_stair_cobble = ndef->getId("mapgen_stair_cobble");
- c_mossycobble = ndef->getId("mapgen_mossycobble");
- c_sandstonebrick = ndef->getId("mapgen_sandstonebrick");
- c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
- if (c_ice == CONTENT_IGNORE)
- c_ice = CONTENT_AIR;
- if (c_mossycobble == CONTENT_IGNORE)
- c_mossycobble = c_cobble;
- if (c_stair_cobble == CONTENT_IGNORE)
- c_stair_cobble = c_cobble;
- if (c_sandstonebrick == CONTENT_IGNORE)
- c_sandstonebrick = c_sandstone;
- if (c_stair_sandstonebrick == CONTENT_IGNORE)
- c_stair_sandstonebrick = c_sandstone;
+ noise_terrain = new Noise(&params->np_terrain, seed, csize.X, csize.Z);
+ noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+
+ MapgenBasic::np_cave1 = params->np_cave1;
+ MapgenBasic::np_cave2 = params->np_cave2;
}
@@ -125,16 +74,6 @@ MapgenFlat::~MapgenFlat()
{
delete noise_terrain;
delete noise_filler_depth;
- delete noise_cave1;
- delete noise_cave2;
-
- delete noise_heat;
- delete noise_humidity;
- delete noise_heat_blend;
- delete noise_humidity_blend;
-
- delete[] heightmap;
- delete[] biomemap;
}
@@ -143,7 +82,7 @@ MapgenFlatParams::MapgenFlatParams()
spflags = 0;
ground_level = 8;
large_cave_depth = -33;
- cave_width = 0.3;
+ cave_width = 0.09;
lake_threshold = -0.45;
lake_steepness = 48.0;
hill_threshold = 0.45;
@@ -151,8 +90,8 @@ MapgenFlatParams::MapgenFlatParams()
np_terrain = NoiseParams(0, 1, v3f(600, 600, 600), 7244, 5, 0.6, 2.0);
np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0);
- np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0);
- np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0);
+ np_cave1 = NoiseParams(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0);
+ np_cave2 = NoiseParams(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0);
}
@@ -243,67 +182,21 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
blockseed = getBlockSeed2(full_node_min, seed);
- // Make some noise
- calculateNoise();
-
// Generate base terrain, mountains, and ridges with initial heightmaps
s16 stone_surface_max_y = generateTerrain();
// Create heightmap
updateHeightmap(node_min, node_max);
- // Create biomemap at heightmap surface
- bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
- noise_humidity->result, heightmap, biomemap);
-
- // Actually place the biome-specific nodes
- MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+ // Init biome generator, place biome-specific nodes, and build biomemap
+ biomegen->calcBiomeNoise(node_min);
+ MgStoneType stone_type = generateBiomes();
if (flags & MG_CAVES)
- generateCaves(stone_surface_max_y);
-
- if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
- DungeonParams dp;
-
- dp.np_rarity = nparams_dungeon_rarity;
- dp.np_density = nparams_dungeon_density;
- dp.np_wetness = nparams_dungeon_wetness;
- dp.c_water = c_water_source;
- if (stone_type == STONE) {
- dp.c_cobble = c_cobble;
- dp.c_moss = c_mossycobble;
- dp.c_stair = c_stair_cobble;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 3.0;
- dp.holesize = v3s16(1, 2, 1);
- dp.roomsize = v3s16(0, 0, 0);
- dp.notifytype = GENNOTIFY_DUNGEON;
- } else if (stone_type == DESERT_STONE) {
- dp.c_cobble = c_desert_stone;
- dp.c_moss = c_desert_stone;
- dp.c_stair = c_desert_stone;
-
- dp.diagonal_dirs = true;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 3, 2);
- dp.roomsize = v3s16(2, 5, 2);
- dp.notifytype = GENNOTIFY_TEMPLE;
- } else if (stone_type == SANDSTONE) {
- dp.c_cobble = c_sandstonebrick;
- dp.c_moss = c_sandstonebrick;
- dp.c_stair = c_sandstonebrick;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 2, 2);
- dp.roomsize = v3s16(2, 0, 2);
- dp.notifytype = GENNOTIFY_DUNGEON;
- }
+ generateCaves(stone_surface_max_y, large_cave_depth);
- DungeonGen dgen(this, &dp);
- dgen.generate(blockseed, full_node_min, full_node_max);
- }
+ if (flags & MG_DUNGEONS)
+ generateDungeons(stone_surface_max_y, stone_type);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
@@ -330,35 +223,6 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
}
-void MapgenFlat::calculateNoise()
-{
- //TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
- s16 x = node_min.X;
- s16 z = node_min.Z;
-
- if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS))
- noise_terrain->perlinMap2D(x, z);
-
- // Cave noises are calculated in generateCaves()
- // only if solid terrain is present in mapchunk
-
- noise_filler_depth->perlinMap2D(x, z);
- noise_heat->perlinMap2D(x, z);
- noise_humidity->perlinMap2D(x, z);
- noise_heat_blend->perlinMap2D(x, z);
- noise_humidity_blend->perlinMap2D(x, z);
-
- for (s32 i = 0; i < csize.X * csize.Z; i++) {
- noise_heat->result[i] += noise_heat_blend->result[i];
- noise_humidity->result[i] += noise_humidity_blend->result[i];
- }
-
- heatmap = noise_heat->result;
- humidmap = noise_humidity->result;
- //printf("calculateNoise: %dus\n", t.stop());
-}
-
-
s16 MapgenFlat::generateTerrain()
{
MapNode n_air(CONTENT_AIR);
@@ -369,13 +233,14 @@ s16 MapgenFlat::generateTerrain()
s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
u32 ni2d = 0;
+ bool use_noise = (spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS);
+ if (use_noise)
+ noise_terrain->perlinMap2D(node_min.X, node_min.Z);
+
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 x = node_min.X; x <= node_max.X; x++, ni2d++) {
s16 stone_level = ground_level;
- float n_terrain = 0.0f;
-
- if ((spflags & MGFLAT_LAKES) || (spflags & MGFLAT_HILLS))
- n_terrain = noise_terrain->result[ni2d];
+ float n_terrain = use_noise ? noise_terrain->result[ni2d] : 0.0f;
if ((spflags & MGFLAT_LAKES) && n_terrain < lake_threshold) {
s16 depress = (lake_threshold - n_terrain) * lake_steepness;
@@ -404,219 +269,3 @@ s16 MapgenFlat::generateTerrain()
return stone_surface_max_y;
}
-
-
-MgStoneType MapgenFlat::generateBiomes(float *heat_map, float *humidity_map)
-{
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
- MgStoneType stone_type = STONE;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = NULL;
- u16 depth_top = 0;
- u16 base_filler = 0;
- u16 depth_water_top = 0;
- u32 vi = vm->m_area.index(x, node_max.Y, z);
-
- // Check node at base of mapchunk above, either a node of a previously
- // generated mapchunk or if not, a node of overgenerated base terrain.
- content_t c_above = vm->m_data[vi + em.X].getContent();
- bool air_above = c_above == CONTENT_AIR;
- bool water_above = c_above == c_water_source;
-
- // If there is air or water above enable top/filler placement, otherwise force
- // nplaced to stone level by setting a number exceeding any possible filler depth.
- u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
-
- for (s16 y = node_max.Y; y >= node_min.Y; y--) {
- content_t c = vm->m_data[vi].getContent();
-
- // Biome is recalculated each time an upper surface is detected while
- // working down a column. The selected biome then remains in effect for
- // all nodes below until the next surface and biome recalculation.
- // Biome is recalculated:
- // 1. At the surface of stone below air or water.
- // 2. At the surface of water below air.
- // 3. When stone or water is detected but biome has not yet been calculated.
- if ((c == c_stone && (air_above || water_above || !biome)) ||
- (c == c_water_source && (air_above || !biome))) {
- biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
- depth_top = biome->depth_top;
- base_filler = MYMAX(depth_top + biome->depth_filler
- + noise_filler_depth->result[index], 0);
- depth_water_top = biome->depth_water_top;
-
- // Detect stone type for dungeons during every biome calculation.
- // This is more efficient than detecting per-node and will not
- // miss any desert stone or sandstone biomes.
- if (biome->c_stone == c_desert_stone)
- stone_type = DESERT_STONE;
- else if (biome->c_stone == c_sandstone)
- stone_type = SANDSTONE;
- }
-
- if (c == c_stone) {
- content_t c_below = vm->m_data[vi - em.X].getContent();
-
- // If the node below isn't solid, make this node stone, so that
- // any top/filler nodes above are structurally supported.
- // This is done by aborting the cycle of top/filler placement
- // immediately by forcing nplaced to stone level.
- if (c_below == CONTENT_AIR || c_below == c_water_source)
- nplaced = U16_MAX;
-
- if (nplaced < depth_top) {
- vm->m_data[vi] = MapNode(biome->c_top);
- nplaced++;
- } else if (nplaced < base_filler) {
- vm->m_data[vi] = MapNode(biome->c_filler);
- nplaced++;
- } else {
- vm->m_data[vi] = MapNode(biome->c_stone);
- }
-
- air_above = false;
- water_above = false;
- } else if (c == c_water_source) {
- vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
- biome->c_water_top : biome->c_water);
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = false;
- water_above = true;
- } else if (c == CONTENT_AIR) {
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = true;
- water_above = false;
- } else { // Possible various nodes overgenerated from neighbouring mapchunks
- nplaced = U16_MAX; // Disable top/filler placement
- air_above = false;
- water_above = false;
- }
-
- vm->m_area.add_y(em, vi, -1);
- }
- }
-
- return stone_type;
-}
-
-
-void MapgenFlat::dustTopNodes()
-{
- if (node_max.Y < water_level)
- return;
-
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
- if (biome->c_dust == CONTENT_IGNORE)
- continue;
-
- u32 vi = vm->m_area.index(x, full_node_max.Y, z);
- content_t c_full_max = vm->m_data[vi].getContent();
- s16 y_start;
-
- if (c_full_max == CONTENT_AIR) {
- y_start = full_node_max.Y - 1;
- } else if (c_full_max == CONTENT_IGNORE) {
- vi = vm->m_area.index(x, node_max.Y + 1, z);
- content_t c_max = vm->m_data[vi].getContent();
-
- if (c_max == CONTENT_AIR)
- y_start = node_max.Y;
- else
- continue;
- } else {
- continue;
- }
-
- vi = vm->m_area.index(x, y_start, z);
- for (s16 y = y_start; y >= node_min.Y - 1; y--) {
- if (vm->m_data[vi].getContent() != CONTENT_AIR)
- break;
-
- vm->m_area.add_y(em, vi, -1);
- }
-
- content_t c = vm->m_data[vi].getContent();
- if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
- vm->m_area.add_y(em, vi, 1);
- vm->m_data[vi] = MapNode(biome->c_dust);
- }
- }
-}
-
-
-void MapgenFlat::generateCaves(s16 max_stone_y)
-{
- if (max_stone_y < node_min.Y)
- return;
-
- noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
- noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
- v3s16 em = vm->m_area.getExtent();
- u32 index2d = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
- bool column_is_open = false; // Is column open to overground
- bool is_tunnel = false; // Is tunnel or tunnel floor
- u32 vi = vm->m_area.index(x, node_max.Y, z);
- u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
- (x - node_min.X);
- // Biome of column
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
- // Don't excavate the overgenerated stone at node_max.Y + 1,
- // this creates a 'roof' over the tunnel, preventing light in
- // tunnels at mapchunk borders when generating mapchunks upwards.
- // This 'roof' is removed when the mapchunk above is generated.
- for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
- index3d -= ystride,
- vm->m_area.add_y(em, vi, -1)) {
-
- content_t c = vm->m_data[vi].getContent();
- if (c == CONTENT_AIR || c == biome->c_water_top ||
- c == biome->c_water) {
- column_is_open = true;
- continue;
- }
- // Ground
- float d1 = contour(noise_cave1->result[index3d]);
- float d2 = contour(noise_cave2->result[index3d]);
-
- if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
- // In tunnel and ground content, excavate
- vm->m_data[vi] = MapNode(CONTENT_AIR);
- is_tunnel = true;
- } else {
- // Not in tunnel or not ground content
- if (is_tunnel && column_is_open &&
- (c == biome->c_filler || c == biome->c_stone))
- // Tunnel entrance floor
- vm->m_data[vi] = MapNode(biome->c_top);
-
- column_is_open = false;
- is_tunnel = false;
- }
- }
- }
-
- if (node_max.Y > large_cave_depth)
- return;
-
- PseudoRandom ps(blockseed + 21343);
- u32 bruises_count = ps.range(0, 2);
- for (u32 i = 0; i < bruises_count; i++) {
- CaveV5 cave(this, &ps);
- cave.makeCave(node_min, node_max, max_stone_y);
- }
-}
diff --git a/src/mapgen_flat.h b/src/mapgen_flat.h
index 8aed09be5..8b3de2bcf 100644
--- a/src/mapgen_flat.h
+++ b/src/mapgen_flat.h
@@ -32,7 +32,7 @@ class BiomeManager;
extern FlagDesc flagdesc_mapgen_flat[];
-struct MapgenFlatParams : public MapgenSpecificParams {
+struct MapgenFlatParams : public MapgenParams {
u32 spflags;
s16 ground_level;
s16 large_cave_depth;
@@ -53,72 +53,25 @@ struct MapgenFlatParams : public MapgenSpecificParams {
void writeParams(Settings *settings) const;
};
-class MapgenFlat : public Mapgen {
+class MapgenFlat : public MapgenBasic {
public:
- EmergeManager *m_emerge;
- BiomeManager *bmgr;
+ MapgenFlat(int mapgenid, MapgenFlatParams *params, EmergeManager *emerge);
+ ~MapgenFlat();
- int ystride;
- int zstride_1d;
+ virtual MapgenType getType() const { return MAPGEN_FLAT; }
- v3s16 node_min;
- v3s16 node_max;
- v3s16 full_node_min;
- v3s16 full_node_max;
+ virtual void makeChunk(BlockMakeData *data);
+ int getSpawnLevelAtPoint(v2s16 p);
+ s16 generateTerrain();
- u32 spflags;
+private:
s16 ground_level;
s16 large_cave_depth;
- float cave_width;
float lake_threshold;
float lake_steepness;
float hill_threshold;
float hill_steepness;
Noise *noise_terrain;
- Noise *noise_filler_depth;
- Noise *noise_cave1;
- Noise *noise_cave2;
-
- Noise *noise_heat;
- Noise *noise_humidity;
- Noise *noise_heat_blend;
- Noise *noise_humidity_blend;
-
- content_t c_stone;
- content_t c_water_source;
- content_t c_lava_source;
- content_t c_desert_stone;
- content_t c_ice;
- content_t c_sandstone;
-
- content_t c_cobble;
- content_t c_stair_cobble;
- content_t c_mossycobble;
- content_t c_sandstonebrick;
- content_t c_stair_sandstonebrick;
-
- MapgenFlat(int mapgenid, MapgenParams *params, EmergeManager *emerge);
- ~MapgenFlat();
-
- virtual void makeChunk(BlockMakeData *data);
- int getSpawnLevelAtPoint(v2s16 p);
- void calculateNoise();
- s16 generateTerrain();
- MgStoneType generateBiomes(float *heat_map, float *humidity_map);
- void dustTopNodes();
- void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryFlat : public MapgenFactory {
- Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
- {
- return new MapgenFlat(mgid, params, emerge);
- };
-
- MapgenSpecificParams *createMapgenParams()
- {
- return new MapgenFlatParams();
- };
};
#endif
diff --git a/src/mapgen_fractal.cpp b/src/mapgen_fractal.cpp
index e2e29f875..a6ed18ae7 100644
--- a/src/mapgen_fractal.cpp
+++ b/src/mapgen_fractal.cpp
@@ -47,81 +47,30 @@ FlagDesc flagdesc_mapgen_fractal[] = {
///////////////////////////////////////////////////////////////////////////////////////
-MapgenFractal::MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager *emerge)
- : Mapgen(mapgenid, params, emerge)
+MapgenFractal::MapgenFractal(int mapgenid, MapgenFractalParams *params, EmergeManager *emerge)
+ : MapgenBasic(mapgenid, params, emerge)
{
- this->m_emerge = emerge;
- this->bmgr = emerge->biomemgr;
-
- //// amount of elements to skip for the next index
- //// for noise/height/biome maps (not vmanip)
- this->ystride = csize.X;
- // 1-down overgeneration
- this->zstride_1d = csize.X * (csize.Y + 1);
-
- this->biomemap = new u8[csize.X * csize.Z];
- this->heightmap = new s16[csize.X * csize.Z];
- this->heatmap = NULL;
- this->humidmap = NULL;
-
- MapgenFractalParams *sp = (MapgenFractalParams *)params->sparams;
-
- this->spflags = sp->spflags;
- this->cave_width = sp->cave_width;
- this->fractal = sp->fractal;
- this->iterations = sp->iterations;
- this->scale = sp->scale;
- this->offset = sp->offset;
- this->slice_w = sp->slice_w;
- this->julia_x = sp->julia_x;
- this->julia_y = sp->julia_y;
- this->julia_z = sp->julia_z;
- this->julia_w = sp->julia_w;
+ this->spflags = params->spflags;
+ this->cave_width = params->cave_width;
+ this->fractal = params->fractal;
+ this->iterations = params->iterations;
+ this->scale = params->scale;
+ this->offset = params->offset;
+ this->slice_w = params->slice_w;
+ this->julia_x = params->julia_x;
+ this->julia_y = params->julia_y;
+ this->julia_z = params->julia_z;
+ this->julia_w = params->julia_w;
//// 2D terrain noise
- noise_seabed = new Noise(&sp->np_seabed, seed, csize.X, csize.Z);
- noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
+ noise_seabed = new Noise(&params->np_seabed, seed, csize.X, csize.Z);
+ noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
- //// 3D terrain noise
- // 1-down overgeneraion
- noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
- noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
-
- //// Biome noise
- noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
- noise_humidity = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
- noise_heat_blend = new Noise(&params->np_biome_heat_blend, seed, csize.X, csize.Z);
- noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
+ MapgenBasic::np_cave1 = params->np_cave1;
+ MapgenBasic::np_cave2 = params->np_cave2;
this->formula = fractal / 2 + fractal % 2;
this->julia = fractal % 2 == 0;
-
- //// Resolve nodes to be used
- INodeDefManager *ndef = emerge->ndef;
-
- c_stone = ndef->getId("mapgen_stone");
- c_water_source = ndef->getId("mapgen_water_source");
- c_lava_source = ndef->getId("mapgen_lava_source");
- c_desert_stone = ndef->getId("mapgen_desert_stone");
- c_ice = ndef->getId("mapgen_ice");
- c_sandstone = ndef->getId("mapgen_sandstone");
-
- c_cobble = ndef->getId("mapgen_cobble");
- c_stair_cobble = ndef->getId("mapgen_stair_cobble");
- c_mossycobble = ndef->getId("mapgen_mossycobble");
- c_sandstonebrick = ndef->getId("mapgen_sandstonebrick");
- c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
- if (c_ice == CONTENT_IGNORE)
- c_ice = CONTENT_AIR;
- if (c_mossycobble == CONTENT_IGNORE)
- c_mossycobble = c_cobble;
- if (c_stair_cobble == CONTENT_IGNORE)
- c_stair_cobble = c_cobble;
- if (c_sandstonebrick == CONTENT_IGNORE)
- c_sandstonebrick = c_sandstone;
- if (c_stair_sandstonebrick == CONTENT_IGNORE)
- c_stair_sandstonebrick = c_sandstone;
}
@@ -129,23 +78,13 @@ MapgenFractal::~MapgenFractal()
{
delete noise_seabed;
delete noise_filler_depth;
- delete noise_cave1;
- delete noise_cave2;
-
- delete noise_heat;
- delete noise_humidity;
- delete noise_heat_blend;
- delete noise_humidity_blend;
-
- delete[] heightmap;
- delete[] biomemap;
}
MapgenFractalParams::MapgenFractalParams()
{
spflags = 0;
- cave_width = 0.3;
+ cave_width = 0.09;
fractal = 1;
iterations = 11;
scale = v3f(4096.0, 1024.0, 4096.0);
@@ -158,8 +97,8 @@ MapgenFractalParams::MapgenFractalParams()
np_seabed = NoiseParams(-14, 9, v3f(600, 600, 600), 41900, 5, 0.6, 2.0);
np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0);
- np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0);
- np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0);
+ np_cave1 = NoiseParams(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0);
+ np_cave2 = NoiseParams(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0);
}
@@ -217,7 +156,7 @@ int MapgenFractal::getSpawnLevelAtPoint(v2s16 p)
s16 search_start = MYMAX(seabed_level, water_level + 1);
if (seabed_level > water_level)
solid_below = true;
-
+
for (s16 y = search_start; y <= search_start + 128; y++) {
if (getFractalAtPoint(p.X, y, p.Y)) { // Fractal node
solid_below = true;
@@ -259,67 +198,21 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
blockseed = getBlockSeed2(full_node_min, seed);
- // Make some noise
- calculateNoise();
-
// Generate base terrain, mountains, and ridges with initial heightmaps
s16 stone_surface_max_y = generateTerrain();
// Create heightmap
updateHeightmap(node_min, node_max);
- // Create biomemap at heightmap surface
- bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
- noise_humidity->result, heightmap, biomemap);
-
- // Actually place the biome-specific nodes
- MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+ // Init biome generator, place biome-specific nodes, and build biomemap
+ biomegen->calcBiomeNoise(node_min);
+ MgStoneType stone_type = generateBiomes();
if (flags & MG_CAVES)
- generateCaves(stone_surface_max_y);
-
- if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
- DungeonParams dp;
-
- dp.np_rarity = nparams_dungeon_rarity;
- dp.np_density = nparams_dungeon_density;
- dp.np_wetness = nparams_dungeon_wetness;
- dp.c_water = c_water_source;
- if (stone_type == STONE) {
- dp.c_cobble = c_cobble;
- dp.c_moss = c_mossycobble;
- dp.c_stair = c_stair_cobble;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 3.0;
- dp.holesize = v3s16(1, 2, 1);
- dp.roomsize = v3s16(0, 0, 0);
- dp.notifytype = GENNOTIFY_DUNGEON;
- } else if (stone_type == DESERT_STONE) {
- dp.c_cobble = c_desert_stone;
- dp.c_moss = c_desert_stone;
- dp.c_stair = c_desert_stone;
-
- dp.diagonal_dirs = true;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 3, 2);
- dp.roomsize = v3s16(2, 5, 2);
- dp.notifytype = GENNOTIFY_TEMPLE;
- } else if (stone_type == SANDSTONE) {
- dp.c_cobble = c_sandstonebrick;
- dp.c_moss = c_sandstonebrick;
- dp.c_stair = c_sandstonebrick;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 2, 2);
- dp.roomsize = v3s16(2, 0, 2);
- dp.notifytype = GENNOTIFY_DUNGEON;
- }
+ generateCaves(stone_surface_max_y, MGFRACTAL_LARGE_CAVE_DEPTH);
- DungeonGen dgen(this, &dp);
- dgen.generate(blockseed, full_node_min, full_node_max);
- }
+ if (flags & MG_DUNGEONS)
+ generateDungeons(stone_surface_max_y, stone_type);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
@@ -346,34 +239,6 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
}
-void MapgenFractal::calculateNoise()
-{
- //TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
- s16 x = node_min.X;
- s16 z = node_min.Z;
-
- noise_seabed->perlinMap2D(x, z);
-
- // Cave noises are calculated in generateCaves()
- // only if solid terrain is present in mapchunk
-
- noise_filler_depth->perlinMap2D(x, z);
- noise_heat->perlinMap2D(x, z);
- noise_humidity->perlinMap2D(x, z);
- noise_heat_blend->perlinMap2D(x, z);
- noise_humidity_blend->perlinMap2D(x, z);
-
- for (s32 i = 0; i < csize.X * csize.Z; i++) {
- noise_heat->result[i] += noise_heat_blend->result[i];
- noise_humidity->result[i] += noise_humidity_blend->result[i];
- }
-
- heatmap = noise_heat->result;
- humidmap = noise_humidity->result;
- //printf("calculateNoise: %dus\n", t.stop());
-}
-
-
bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z)
{
float cx, cy, cz, cw, ox, oy, oz, ow;
@@ -503,6 +368,8 @@ s16 MapgenFractal::generateTerrain()
s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
u32 index2d = 0;
+ noise_seabed->perlinMap2D(node_min.X, node_min.Z);
+
for (s16 z = node_min.Z; z <= node_max.Z; z++) {
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
u32 vi = vm->m_area.index(node_min.X, y, z);
@@ -528,219 +395,3 @@ s16 MapgenFractal::generateTerrain()
return stone_surface_max_y;
}
-
-
-MgStoneType MapgenFractal::generateBiomes(float *heat_map, float *humidity_map)
-{
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
- MgStoneType stone_type = STONE;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = NULL;
- u16 depth_top = 0;
- u16 base_filler = 0;
- u16 depth_water_top = 0;
- u32 vi = vm->m_area.index(x, node_max.Y, z);
-
- // Check node at base of mapchunk above, either a node of a previously
- // generated mapchunk or if not, a node of overgenerated base terrain.
- content_t c_above = vm->m_data[vi + em.X].getContent();
- bool air_above = c_above == CONTENT_AIR;
- bool water_above = c_above == c_water_source;
-
- // If there is air or water above enable top/filler placement, otherwise force
- // nplaced to stone level by setting a number exceeding any possible filler depth.
- u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
-
- for (s16 y = node_max.Y; y >= node_min.Y; y--) {
- content_t c = vm->m_data[vi].getContent();
-
- // Biome is recalculated each time an upper surface is detected while
- // working down a column. The selected biome then remains in effect for
- // all nodes below until the next surface and biome recalculation.
- // Biome is recalculated:
- // 1. At the surface of stone below air or water.
- // 2. At the surface of water below air.
- // 3. When stone or water is detected but biome has not yet been calculated.
- if ((c == c_stone && (air_above || water_above || !biome)) ||
- (c == c_water_source && (air_above || !biome))) {
- biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
- depth_top = biome->depth_top;
- base_filler = MYMAX(depth_top + biome->depth_filler
- + noise_filler_depth->result[index], 0);
- depth_water_top = biome->depth_water_top;
-
- // Detect stone type for dungeons during every biome calculation.
- // This is more efficient than detecting per-node and will not
- // miss any desert stone or sandstone biomes.
- if (biome->c_stone == c_desert_stone)
- stone_type = DESERT_STONE;
- else if (biome->c_stone == c_sandstone)
- stone_type = SANDSTONE;
- }
-
- if (c == c_stone) {
- content_t c_below = vm->m_data[vi - em.X].getContent();
-
- // If the node below isn't solid, make this node stone, so that
- // any top/filler nodes above are structurally supported.
- // This is done by aborting the cycle of top/filler placement
- // immediately by forcing nplaced to stone level.
- if (c_below == CONTENT_AIR || c_below == c_water_source)
- nplaced = U16_MAX;
-
- if (nplaced < depth_top) {
- vm->m_data[vi] = MapNode(biome->c_top);
- nplaced++;
- } else if (nplaced < base_filler) {
- vm->m_data[vi] = MapNode(biome->c_filler);
- nplaced++;
- } else {
- vm->m_data[vi] = MapNode(biome->c_stone);
- }
-
- air_above = false;
- water_above = false;
- } else if (c == c_water_source) {
- vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
- biome->c_water_top : biome->c_water);
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = false;
- water_above = true;
- } else if (c == CONTENT_AIR) {
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = true;
- water_above = false;
- } else { // Possible various nodes overgenerated from neighbouring mapchunks
- nplaced = U16_MAX; // Disable top/filler placement
- air_above = false;
- water_above = false;
- }
-
- vm->m_area.add_y(em, vi, -1);
- }
- }
-
- return stone_type;
-}
-
-
-void MapgenFractal::dustTopNodes()
-{
- if (node_max.Y < water_level)
- return;
-
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
- if (biome->c_dust == CONTENT_IGNORE)
- continue;
-
- u32 vi = vm->m_area.index(x, full_node_max.Y, z);
- content_t c_full_max = vm->m_data[vi].getContent();
- s16 y_start;
-
- if (c_full_max == CONTENT_AIR) {
- y_start = full_node_max.Y - 1;
- } else if (c_full_max == CONTENT_IGNORE) {
- vi = vm->m_area.index(x, node_max.Y + 1, z);
- content_t c_max = vm->m_data[vi].getContent();
-
- if (c_max == CONTENT_AIR)
- y_start = node_max.Y;
- else
- continue;
- } else {
- continue;
- }
-
- vi = vm->m_area.index(x, y_start, z);
- for (s16 y = y_start; y >= node_min.Y - 1; y--) {
- if (vm->m_data[vi].getContent() != CONTENT_AIR)
- break;
-
- vm->m_area.add_y(em, vi, -1);
- }
-
- content_t c = vm->m_data[vi].getContent();
- if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
- vm->m_area.add_y(em, vi, 1);
- vm->m_data[vi] = MapNode(biome->c_dust);
- }
- }
-}
-
-
-void MapgenFractal::generateCaves(s16 max_stone_y)
-{
- if (max_stone_y < node_min.Y)
- return;
-
- noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
- noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
- v3s16 em = vm->m_area.getExtent();
- u32 index2d = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
- bool column_is_open = false; // Is column open to overground
- bool is_tunnel = false; // Is tunnel or tunnel floor
- u32 vi = vm->m_area.index(x, node_max.Y, z);
- u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
- (x - node_min.X);
- // Biome of column
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
- // Don't excavate the overgenerated stone at node_max.Y + 1,
- // this creates a 'roof' over the tunnel, preventing light in
- // tunnels at mapchunk borders when generating mapchunks upwards.
- // This 'roof' is removed when the mapchunk above is generated.
- for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
- index3d -= ystride,
- vm->m_area.add_y(em, vi, -1)) {
-
- content_t c = vm->m_data[vi].getContent();
- if (c == CONTENT_AIR || c == biome->c_water_top ||
- c == biome->c_water) {
- column_is_open = true;
- continue;
- }
- // Ground
- float d1 = contour(noise_cave1->result[index3d]);
- float d2 = contour(noise_cave2->result[index3d]);
-
- if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
- // In tunnel and ground content, excavate
- vm->m_data[vi] = MapNode(CONTENT_AIR);
- is_tunnel = true;
- } else {
- // Not in tunnel or not ground content
- if (is_tunnel && column_is_open &&
- (c == biome->c_filler || c == biome->c_stone))
- // Tunnel entrance floor
- vm->m_data[vi] = MapNode(biome->c_top);
-
- column_is_open = false;
- is_tunnel = false;
- }
- }
- }
-
- if (node_max.Y > MGFRACTAL_LARGE_CAVE_DEPTH)
- return;
-
- PseudoRandom ps(blockseed + 21343);
- u32 bruises_count = ps.range(0, 2);
- for (u32 i = 0; i < bruises_count; i++) {
- CaveV5 cave(this, &ps);
- cave.makeCave(node_min, node_max, max_stone_y);
- }
-}
diff --git a/src/mapgen_fractal.h b/src/mapgen_fractal.h
index dd96045e2..3331848bc 100644
--- a/src/mapgen_fractal.h
+++ b/src/mapgen_fractal.h
@@ -33,7 +33,7 @@ class BiomeManager;
extern FlagDesc flagdesc_mapgen_fractal[];
-struct MapgenFractalParams : public MapgenSpecificParams {
+struct MapgenFractalParams : public MapgenParams {
u32 spflags;
float cave_width;
u16 fractal;
@@ -57,23 +57,22 @@ struct MapgenFractalParams : public MapgenSpecificParams {
void writeParams(Settings *settings) const;
};
-class MapgenFractal : public Mapgen {
+class MapgenFractal : public MapgenBasic {
public:
- EmergeManager *m_emerge;
- BiomeManager *bmgr;
+ MapgenFractal(int mapgenid, MapgenFractalParams *params, EmergeManager *emerge);
+ ~MapgenFractal();
+
+ virtual MapgenType getType() const { return MAPGEN_FRACTAL; }
+
+ virtual void makeChunk(BlockMakeData *data);
+ int getSpawnLevelAtPoint(v2s16 p);
+ bool getFractalAtPoint(s16 x, s16 y, s16 z);
+ s16 generateTerrain();
- int ystride;
- int zstride_1d;
+private:
u16 formula;
bool julia;
- v3s16 node_min;
- v3s16 node_max;
- v3s16 full_node_min;
- v3s16 full_node_max;
-
- u32 spflags;
- float cave_width;
u16 fractal;
u16 iterations;
v3f scale;
@@ -84,51 +83,6 @@ public:
float julia_z;
float julia_w;
Noise *noise_seabed;
- Noise *noise_filler_depth;
- Noise *noise_cave1;
- Noise *noise_cave2;
-
- Noise *noise_heat;
- Noise *noise_humidity;
- Noise *noise_heat_blend;
- Noise *noise_humidity_blend;
-
- content_t c_stone;
- content_t c_water_source;
- content_t c_lava_source;
- content_t c_desert_stone;
- content_t c_ice;
- content_t c_sandstone;
-
- content_t c_cobble;
- content_t c_stair_cobble;
- content_t c_mossycobble;
- content_t c_sandstonebrick;
- content_t c_stair_sandstonebrick;
-
- MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager *emerge);
- ~MapgenFractal();
-
- virtual void makeChunk(BlockMakeData *data);
- int getSpawnLevelAtPoint(v2s16 p);
- void calculateNoise();
- bool getFractalAtPoint(s16 x, s16 y, s16 z);
- s16 generateTerrain();
- MgStoneType generateBiomes(float *heat_map, float *humidity_map);
- void dustTopNodes();
- void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryFractal : public MapgenFactory {
- Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
- {
- return new MapgenFractal(mgid, params, emerge);
- };
-
- MapgenSpecificParams *createMapgenParams()
- {
- return new MapgenFractalParams();
- };
};
#endif
diff --git a/src/mapgen_singlenode.h b/src/mapgen_singlenode.h
index 2c6496c00..07520134d 100644
--- a/src/mapgen_singlenode.h
+++ b/src/mapgen_singlenode.h
@@ -22,11 +22,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen.h"
-struct MapgenSinglenodeParams : public MapgenSpecificParams {
-
+struct MapgenSinglenodeParams : public MapgenParams {
MapgenSinglenodeParams() {}
~MapgenSinglenodeParams() {}
-
+
void readParams(const Settings *settings) {}
void writeParams(Settings *settings) const {}
};
@@ -39,19 +38,11 @@ public:
MapgenSinglenode(int mapgenid, MapgenParams *params, EmergeManager *emerge);
~MapgenSinglenode();
-
+
+ virtual MapgenType getType() const { return MAPGEN_SINGLENODE; }
+
void makeChunk(BlockMakeData *data);
int getSpawnLevelAtPoint(v2s16 p);
};
-struct MapgenFactorySinglenode : public MapgenFactory {
- Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge) {
- return new MapgenSinglenode(mgid, params, emerge);
- };
-
- MapgenSpecificParams *createMapgenParams() {
- return new MapgenSinglenodeParams();
- };
-};
-
#endif
diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index b98acb928..9f189e253 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -45,72 +45,23 @@ FlagDesc flagdesc_mapgen_v5[] = {
};
-MapgenV5::MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge)
- : Mapgen(mapgenid, params, emerge)
+MapgenV5::MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge)
+ : MapgenBasic(mapgenid, params, emerge)
{
- this->m_emerge = emerge;
- this->bmgr = emerge->biomemgr;
-
- // amount of elements to skip for the next index
- // for noise/height/biome maps (not vmanip)
- this->ystride = csize.X;
- // 1-down overgeneration
- this->zstride_1d = csize.X * (csize.Y + 1);
-
- this->biomemap = new u8[csize.X * csize.Z];
- this->heightmap = new s16[csize.X * csize.Z];
- this->heatmap = NULL;
- this->humidmap = NULL;
-
- MapgenV5Params *sp = (MapgenV5Params *)params->sparams;
-
- this->spflags = sp->spflags;
- this->cave_width = sp->cave_width;
+ this->spflags = params->spflags;
+ this->cave_width = params->cave_width;
// Terrain noise
- noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
- noise_factor = new Noise(&sp->np_factor, seed, csize.X, csize.Z);
- noise_height = new Noise(&sp->np_height, seed, csize.X, csize.Z);
+ noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+ noise_factor = new Noise(&params->np_factor, seed, csize.X, csize.Z);
+ noise_height = new Noise(&params->np_height, seed, csize.X, csize.Z);
// 3D terrain noise
// 1-up 1-down overgeneration
- noise_ground = new Noise(&sp->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
- // 1-down overgeneraion
- noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
- noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
-
- // Biome noise
- noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
- noise_humidity = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
- noise_heat_blend = new Noise(&params->np_biome_heat_blend, seed, csize.X, csize.Z);
- noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
-
- //// Resolve nodes to be used
- INodeDefManager *ndef = emerge->ndef;
-
- c_stone = ndef->getId("mapgen_stone");
- c_water_source = ndef->getId("mapgen_water_source");
- c_lava_source = ndef->getId("mapgen_lava_source");
- c_desert_stone = ndef->getId("mapgen_desert_stone");
- c_ice = ndef->getId("mapgen_ice");
- c_sandstone = ndef->getId("mapgen_sandstone");
-
- c_cobble = ndef->getId("mapgen_cobble");
- c_stair_cobble = ndef->getId("mapgen_stair_cobble");
- c_mossycobble = ndef->getId("mapgen_mossycobble");
- c_sandstonebrick = ndef->getId("mapgen_sandstonebrick");
- c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
- if (c_ice == CONTENT_IGNORE)
- c_ice = CONTENT_AIR;
- if (c_mossycobble == CONTENT_IGNORE)
- c_mossycobble = c_cobble;
- if (c_stair_cobble == CONTENT_IGNORE)
- c_stair_cobble = c_cobble;
- if (c_sandstonebrick == CONTENT_IGNORE)
- c_sandstonebrick = c_sandstone;
- if (c_stair_sandstonebrick == CONTENT_IGNORE)
- c_stair_sandstonebrick = c_sandstone;
+ noise_ground = new Noise(&params->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
+
+ MapgenBasic::np_cave1 = params->np_cave1;
+ MapgenBasic::np_cave2 = params->np_cave2;
}
@@ -119,17 +70,7 @@ MapgenV5::~MapgenV5()
delete noise_filler_depth;
delete noise_factor;
delete noise_height;
- delete noise_cave1;
- delete noise_cave2;
delete noise_ground;
-
- delete noise_heat;
- delete noise_humidity;
- delete noise_heat_blend;
- delete noise_humidity_blend;
-
- delete[] heightmap;
- delete[] biomemap;
}
@@ -239,69 +180,23 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Create a block-specific seed
blockseed = getBlockSeed2(full_node_min, seed);
- // Make some noise
- calculateNoise();
-
// Generate base terrain
s16 stone_surface_max_y = generateBaseTerrain();
// Create heightmap
updateHeightmap(node_min, node_max);
- // Create biomemap at heightmap surface
- bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
- noise_humidity->result, heightmap, biomemap);
-
- // Actually place the biome-specific nodes
- MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+ // Init biome generator, place biome-specific nodes, and build biomemap
+ biomegen->calcBiomeNoise(node_min);
+ MgStoneType stone_type = generateBiomes();
// Generate caves
if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
- generateCaves(stone_surface_max_y);
+ generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH);
// Generate dungeons and desert temples
- if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
- DungeonParams dp;
-
- dp.np_rarity = nparams_dungeon_rarity;
- dp.np_density = nparams_dungeon_density;
- dp.np_wetness = nparams_dungeon_wetness;
- dp.c_water = c_water_source;
- if (stone_type == STONE) {
- dp.c_cobble = c_cobble;
- dp.c_moss = c_mossycobble;
- dp.c_stair = c_stair_cobble;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 3.0;
- dp.holesize = v3s16(1, 2, 1);
- dp.roomsize = v3s16(0, 0, 0);
- dp.notifytype = GENNOTIFY_DUNGEON;
- } else if (stone_type == DESERT_STONE) {
- dp.c_cobble = c_desert_stone;
- dp.c_moss = c_desert_stone;
- dp.c_stair = c_desert_stone;
-
- dp.diagonal_dirs = true;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 3, 2);
- dp.roomsize = v3s16(2, 5, 2);
- dp.notifytype = GENNOTIFY_TEMPLE;
- } else if (stone_type == SANDSTONE) {
- dp.c_cobble = c_sandstonebrick;
- dp.c_moss = c_sandstonebrick;
- dp.c_stair = c_sandstonebrick;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 2, 2);
- dp.roomsize = v3s16(2, 0, 2);
- dp.notifytype = GENNOTIFY_DUNGEON;
- }
-
- DungeonGen dgen(this, &dp);
- dgen.generate(blockseed, full_node_min, full_node_max);
- }
+ if (flags & MG_DUNGEONS)
+ generateDungeons(stone_surface_max_y, stone_type);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
@@ -328,37 +223,6 @@ void MapgenV5::makeChunk(BlockMakeData *data)
}
-void MapgenV5::calculateNoise()
-{
- //TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
- s16 x = node_min.X;
- s16 y = node_min.Y - 1;
- s16 z = node_min.Z;
-
- noise_factor->perlinMap2D(x, z);
- noise_height->perlinMap2D(x, z);
- noise_ground->perlinMap3D(x, y, z);
-
- // Cave noises are calculated in generateCaves()
- // only if solid terrain is present in mapchunk
-
- noise_filler_depth->perlinMap2D(x, z);
- noise_heat->perlinMap2D(x, z);
- noise_humidity->perlinMap2D(x, z);
- noise_heat_blend->perlinMap2D(x, z);
- noise_humidity_blend->perlinMap2D(x, z);
-
- for (s32 i = 0; i < csize.X * csize.Z; i++) {
- noise_heat->result[i] += noise_heat_blend->result[i];
- noise_humidity->result[i] += noise_humidity_blend->result[i];
- }
-
- heatmap = noise_heat->result;
- humidmap = noise_humidity->result;
- //printf("calculateNoise: %dus\n", t.stop());
-}
-
-
//bool is_cave(u32 index) {
// double d1 = contour(noise_cave1->result[index]);
// double d2 = contour(noise_cave2->result[index]);
@@ -382,6 +246,10 @@ int MapgenV5::generateBaseTerrain()
u32 index2d = 0;
int stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
+ noise_factor->perlinMap2D(node_min.X, node_min.Z);
+ noise_height->perlinMap2D(node_min.X, node_min.Z);
+ noise_ground->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+
for (s16 z=node_min.Z; z<=node_max.Z; z++) {
for (s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) {
u32 vi = vm->m_area.index(node_min.X, y, z);
@@ -414,219 +282,3 @@ int MapgenV5::generateBaseTerrain()
return stone_surface_max_y;
}
-
-
-MgStoneType MapgenV5::generateBiomes(float *heat_map, float *humidity_map)
-{
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
- MgStoneType stone_type = STONE;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = NULL;
- u16 depth_top = 0;
- u16 base_filler = 0;
- u16 depth_water_top = 0;
- u32 vi = vm->m_area.index(x, node_max.Y, z);
-
- // Check node at base of mapchunk above, either a node of a previously
- // generated mapchunk or if not, a node of overgenerated base terrain.
- content_t c_above = vm->m_data[vi + em.X].getContent();
- bool air_above = c_above == CONTENT_AIR;
- bool water_above = c_above == c_water_source;
-
- // If there is air or water above enable top/filler placement, otherwise force
- // nplaced to stone level by setting a number exceeding any possible filler depth.
- u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
- for (s16 y = node_max.Y; y >= node_min.Y; y--) {
- content_t c = vm->m_data[vi].getContent();
-
- // Biome is recalculated each time an upper surface is detected while
- // working down a column. The selected biome then remains in effect for
- // all nodes below until the next surface and biome recalculation.
- // Biome is recalculated:
- // 1. At the surface of stone below air or water.
- // 2. At the surface of water below air.
- // 3. When stone or water is detected but biome has not yet been calculated.
- if ((c == c_stone && (air_above || water_above || !biome)) ||
- (c == c_water_source && (air_above || !biome))) {
- biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
- depth_top = biome->depth_top;
- base_filler = MYMAX(depth_top + biome->depth_filler
- + noise_filler_depth->result[index], 0);
- depth_water_top = biome->depth_water_top;
-
- // Detect stone type for dungeons during every biome calculation.
- // This is more efficient than detecting per-node and will not
- // miss any desert stone or sandstone biomes.
- if (biome->c_stone == c_desert_stone)
- stone_type = DESERT_STONE;
- else if (biome->c_stone == c_sandstone)
- stone_type = SANDSTONE;
- }
-
- if (c == c_stone) {
- content_t c_below = vm->m_data[vi - em.X].getContent();
-
- // If the node below isn't solid, make this node stone, so that
- // any top/filler nodes above are structurally supported.
- // This is done by aborting the cycle of top/filler placement
- // immediately by forcing nplaced to stone level.
- if (c_below == CONTENT_AIR || c_below == c_water_source)
- nplaced = U16_MAX;
-
- if (nplaced < depth_top) {
- vm->m_data[vi] = MapNode(biome->c_top);
- nplaced++;
- } else if (nplaced < base_filler) {
- vm->m_data[vi] = MapNode(biome->c_filler);
- nplaced++;
- } else {
- vm->m_data[vi] = MapNode(biome->c_stone);
- }
-
- air_above = false;
- water_above = false;
- } else if (c == c_water_source) {
- vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
- biome->c_water_top : biome->c_water);
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = false;
- water_above = true;
- } else if (c == CONTENT_AIR) {
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = true;
- water_above = false;
- } else { // Possible various nodes overgenerated from neighbouring mapchunks
- nplaced = U16_MAX; // Disable top/filler placement
- air_above = false;
- water_above = false;
- }
-
- vm->m_area.add_y(em, vi, -1);
- }
- }
-
- return stone_type;
-}
-
-
-void MapgenV5::dustTopNodes()
-{
- if (node_max.Y < water_level)
- return;
-
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
- if (biome->c_dust == CONTENT_IGNORE)
- continue;
-
- u32 vi = vm->m_area.index(x, full_node_max.Y, z);
- content_t c_full_max = vm->m_data[vi].getContent();
- s16 y_start;
-
- if (c_full_max == CONTENT_AIR) {
- y_start = full_node_max.Y - 1;
- } else if (c_full_max == CONTENT_IGNORE) {
- vi = vm->m_area.index(x, node_max.Y + 1, z);
- content_t c_max = vm->m_data[vi].getContent();
-
- if (c_max == CONTENT_AIR)
- y_start = node_max.Y;
- else
- continue;
- } else {
- continue;
- }
-
- vi = vm->m_area.index(x, y_start, z);
- for (s16 y = y_start; y >= node_min.Y - 1; y--) {
- if (vm->m_data[vi].getContent() != CONTENT_AIR)
- break;
-
- vm->m_area.add_y(em, vi, -1);
- }
-
- content_t c = vm->m_data[vi].getContent();
- if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
- vm->m_area.add_y(em, vi, 1);
- vm->m_data[vi] = MapNode(biome->c_dust);
- }
- }
-}
-
-
-void MapgenV5::generateCaves(int max_stone_y)
-{
- if (max_stone_y < node_min.Y)
- return;
-
- noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
- noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
- v3s16 em = vm->m_area.getExtent();
- u32 index2d = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
- bool column_is_open = false; // Is column open to overground
- bool is_tunnel = false; // Is tunnel or tunnel floor
- // Indexes at column top (node_max.Y)
- u32 vi = vm->m_area.index(x, node_max.Y, z);
- u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
- (x - node_min.X);
- // Biome of column
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
- // Don't excavate the overgenerated stone at node_max.Y + 1,
- // this creates a 'roof' over the tunnel, preventing light in
- // tunnels at mapchunk borders when generating mapchunks upwards.
- // This 'roof' is removed when the mapchunk above is generated.
- for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
- index3d -= ystride,
- vm->m_area.add_y(em, vi, -1)) {
-
- content_t c = vm->m_data[vi].getContent();
- if (c == CONTENT_AIR || c == biome->c_water_top ||
- c == biome->c_water) {
- column_is_open = true;
- continue;
- }
- // Ground
- float d1 = contour(noise_cave1->result[index3d]);
- float d2 = contour(noise_cave2->result[index3d]);
-
- if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
- // In tunnel and ground content, excavate
- vm->m_data[vi] = MapNode(CONTENT_AIR);
- is_tunnel = true;
- } else {
- // Not in tunnel or not ground content
- if (is_tunnel && column_is_open &&
- (c == biome->c_filler || c == biome->c_stone))
- // Tunnel entrance floor
- vm->m_data[vi] = MapNode(biome->c_top);
-
- column_is_open = false;
- is_tunnel = false;
- }
- }
- }
-
- if (node_max.Y > MGV5_LARGE_CAVE_DEPTH)
- return;
-
- PseudoRandom ps(blockseed + 21343);
- u32 bruises_count = ps.range(0, 2);
- for (u32 i = 0; i < bruises_count; i++) {
- CaveV5 cave(this, &ps);
- cave.makeCave(node_min, node_max, max_stone_y);
- }
-}
diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h
index fd2f7f4d8..ddb090a9c 100644
--- a/src/mapgen_v5.h
+++ b/src/mapgen_v5.h
@@ -30,7 +30,7 @@ class BiomeManager;
extern FlagDesc flagdesc_mapgen_v5[];
-struct MapgenV5Params : public MapgenSpecificParams {
+struct MapgenV5Params : public MapgenParams {
u32 spflags;
float cave_width;
NoiseParams np_filler_depth;
@@ -48,69 +48,21 @@ struct MapgenV5Params : public MapgenSpecificParams {
};
-class MapgenV5 : public Mapgen {
+class MapgenV5 : public MapgenBasic {
public:
- EmergeManager *m_emerge;
- BiomeManager *bmgr;
-
- int ystride;
- int zstride_1d;
-
- v3s16 node_min;
- v3s16 node_max;
- v3s16 full_node_min;
- v3s16 full_node_max;
-
- u32 spflags;
- float cave_width;
- Noise *noise_filler_depth;
- Noise *noise_factor;
- Noise *noise_height;
- Noise *noise_cave1;
- Noise *noise_cave2;
- Noise *noise_ground;
-
- Noise *noise_heat;
- Noise *noise_humidity;
- Noise *noise_heat_blend;
- Noise *noise_humidity_blend;
-
- content_t c_stone;
- content_t c_water_source;
- content_t c_lava_source;
- content_t c_desert_stone;
- content_t c_ice;
- content_t c_sandstone;
-
- content_t c_cobble;
- content_t c_stair_cobble;
- content_t c_mossycobble;
- content_t c_sandstonebrick;
- content_t c_stair_sandstonebrick;
-
- MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+ MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge);
~MapgenV5();
+ virtual MapgenType getType() const { return MAPGEN_V5; }
+
virtual void makeChunk(BlockMakeData *data);
int getSpawnLevelAtPoint(v2s16 p);
- void calculateNoise();
int generateBaseTerrain();
- MgStoneType generateBiomes(float *heat_map, float *humidity_map);
- void generateCaves(int max_stone_y);
- void dustTopNodes();
-};
-
-struct MapgenFactoryV5 : public MapgenFactory {
- Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
- {
- return new MapgenV5(mgid, params, emerge);
- };
-
- MapgenSpecificParams *createMapgenParams()
- {
- return new MapgenV5Params();
- };
+private:
+ Noise *noise_factor;
+ Noise *noise_height;
+ Noise *noise_ground;
};
#endif
diff --git a/src/mapgen_v6.cpp b/src/mapgen_v6.cpp
index c389b2ed4..79617a830 100644
--- a/src/mapgen_v6.cpp
+++ b/src/mapgen_v6.cpp
@@ -53,7 +53,7 @@ FlagDesc flagdesc_mapgen_v6[] = {
/////////////////////////////////////////////////////////////////////////////
-MapgenV6::MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge)
+MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge)
: Mapgen(mapgenid, params, emerge)
{
this->m_emerge = emerge;
@@ -61,26 +61,25 @@ MapgenV6::MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge)
this->heightmap = new s16[csize.X * csize.Z];
- MapgenV6Params *sp = (MapgenV6Params *)params->sparams;
- this->spflags = sp->spflags;
- this->freq_desert = sp->freq_desert;
- this->freq_beach = sp->freq_beach;
+ this->spflags = params->spflags;
+ this->freq_desert = params->freq_desert;
+ this->freq_beach = params->freq_beach;
- np_cave = &sp->np_cave;
- np_humidity = &sp->np_humidity;
- np_trees = &sp->np_trees;
- np_apple_trees = &sp->np_apple_trees;
+ np_cave = &params->np_cave;
+ np_humidity = &params->np_humidity;
+ np_trees = &params->np_trees;
+ np_apple_trees = &params->np_apple_trees;
//// Create noise objects
- noise_terrain_base = new Noise(&sp->np_terrain_base, seed, csize.X, csize.Y);
- noise_terrain_higher = new Noise(&sp->np_terrain_higher, seed, csize.X, csize.Y);
- noise_steepness = new Noise(&sp->np_steepness, seed, csize.X, csize.Y);
- noise_height_select = new Noise(&sp->np_height_select, seed, csize.X, csize.Y);
- noise_mud = new Noise(&sp->np_mud, seed, csize.X, csize.Y);
- noise_beach = new Noise(&sp->np_beach, seed, csize.X, csize.Y);
- noise_biome = new Noise(&sp->np_biome, seed,
+ noise_terrain_base = new Noise(&params->np_terrain_base, seed, csize.X, csize.Y);
+ noise_terrain_higher = new Noise(&params->np_terrain_higher, seed, csize.X, csize.Y);
+ noise_steepness = new Noise(&params->np_steepness, seed, csize.X, csize.Y);
+ noise_height_select = new Noise(&params->np_height_select, seed, csize.X, csize.Y);
+ noise_mud = new Noise(&params->np_mud, seed, csize.X, csize.Y);
+ noise_beach = new Noise(&params->np_beach, seed, csize.X, csize.Y);
+ noise_biome = new Noise(&params->np_biome, seed,
csize.X + 2 * MAP_BLOCKSIZE, csize.Y + 2 * MAP_BLOCKSIZE);
- noise_humidity = new Noise(&sp->np_humidity, seed,
+ noise_humidity = new Noise(&params->np_humidity, seed,
csize.X + 2 * MAP_BLOCKSIZE, csize.Y + 2 * MAP_BLOCKSIZE);
//// Resolve nodes to be used
@@ -269,7 +268,7 @@ float MapgenV6::baseTerrainLevel(float terrain_base, float terrain_higher,
float MapgenV6::baseTerrainLevelFromNoise(v2s16 p)
{
- if ((spflags & MGV6_FLAT) || (flags & MG_FLAT))
+ if (spflags & MGV6_FLAT)
return water_level;
float terrain_base = NoisePerlin2D_PO(&noise_terrain_base->np,
@@ -295,7 +294,7 @@ float MapgenV6::baseTerrainLevelFromMap(v2s16 p)
float MapgenV6::baseTerrainLevelFromMap(int index)
{
- if ((spflags & MGV6_FLAT) || (flags & MG_FLAT))
+ if (spflags & MGV6_FLAT)
return water_level;
float terrain_base = noise_terrain_base->result[index];
@@ -403,7 +402,7 @@ bool MapgenV6::getHaveAppleTree(v2s16 p)
float MapgenV6::getMudAmount(int index)
{
- if ((spflags & MGV6_FLAT) || (flags & MG_FLAT))
+ if (spflags & MGV6_FLAT)
return MGV6_AVERAGE_MUD_AMOUNT;
/*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin(
@@ -559,34 +558,38 @@ void MapgenV6::makeChunk(BlockMakeData *data)
if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
DungeonParams dp;
- dp.np_rarity = nparams_dungeon_rarity;
- dp.np_density = nparams_dungeon_density;
- dp.np_wetness = nparams_dungeon_wetness;
- dp.c_water = c_water_source;
+ dp.seed = seed;
+ dp.c_water = c_water_source;
+ dp.c_river_water = c_water_source;
+ dp.rooms_min = 2;
+ dp.rooms_max = 16;
+ dp.y_min = -MAX_MAP_GENERATION_LIMIT;
+ dp.y_max = MAX_MAP_GENERATION_LIMIT;
+ dp.np_density = NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
+ dp.np_alt_wall = NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
+
if (getBiome(0, v2s16(node_min.X, node_min.Z)) == BT_DESERT) {
- dp.c_cobble = c_desert_stone;
- dp.c_moss = c_desert_stone;
- dp.c_stair = c_desert_stone;
+ dp.c_wall = c_desert_stone;
+ dp.c_alt_wall = CONTENT_IGNORE;
+ dp.c_stair = c_desert_stone;
dp.diagonal_dirs = true;
- dp.mossratio = 0.0;
dp.holesize = v3s16(2, 3, 2);
dp.roomsize = v3s16(2, 5, 2);
dp.notifytype = GENNOTIFY_TEMPLE;
} else {
- dp.c_cobble = c_cobble;
- dp.c_moss = c_mossycobble;
- dp.c_stair = c_stair_cobble;
+ dp.c_wall = c_cobble;
+ dp.c_alt_wall = c_mossycobble;
+ dp.c_stair = c_stair_cobble;
dp.diagonal_dirs = false;
- dp.mossratio = 3.0;
dp.holesize = v3s16(1, 2, 1);
dp.roomsize = v3s16(0, 0, 0);
dp.notifytype = GENNOTIFY_DUNGEON;
}
- DungeonGen dgen(this, &dp);
- dgen.generate(blockseed, full_node_min, full_node_max);
+ DungeonGen dgen(ndef, &gennotify, &dp);
+ dgen.generate(vm, blockseed, full_node_min, full_node_max);
}
// Add top and bottom side of water to transforming_liquid queue
@@ -596,7 +599,7 @@ void MapgenV6::makeChunk(BlockMakeData *data)
growGrass();
// Generate some trees, and add grass, if a jungle
- if ((spflags & MGV6_TREES) || (flags & MG_TREES))
+ if (spflags & MGV6_TREES)
placeTreesAndJungleGrass();
// Generate the registered decorations
@@ -623,7 +626,7 @@ void MapgenV6::calculateNoise()
int fx = full_node_min.X;
int fz = full_node_min.Z;
- if (!((spflags & MGV6_FLAT) || (flags & MG_FLAT))) {
+ if (!(spflags & MGV6_FLAT)) {
noise_terrain_base->perlinMap2D_PO(x, 0.5, z, 0.5);
noise_terrain_higher->perlinMap2D_PO(x, 0.5, z, 0.5);
noise_steepness->perlinMap2D_PO(x, 0.5, z, 0.5);
@@ -1066,9 +1069,10 @@ void MapgenV6::generateCaves(int max_stone_y)
}
for (u32 i = 0; i < caves_count + bruises_count; i++) {
- bool large_cave = (i >= caves_count);
- CaveV6 cave(this, &ps, &ps2, large_cave);
+ CavesV6 cave(ndef, &gennotify, water_level, c_water_source, c_lava_source);
- cave.makeCave(node_min, node_max, max_stone_y);
+ bool large_cave = (i >= caves_count);
+ cave.makeCave(vm, node_min, node_max, &ps, &ps2,
+ large_cave, max_stone_y, heightmap);
}
}
diff --git a/src/mapgen_v6.h b/src/mapgen_v6.h
index a55fc6d53..f018ffaca 100644
--- a/src/mapgen_v6.h
+++ b/src/mapgen_v6.h
@@ -53,7 +53,7 @@ enum BiomeV6Type
};
-struct MapgenV6Params : public MapgenSpecificParams {
+struct MapgenV6Params : public MapgenParams {
u32 spflags;
float freq_desert;
float freq_beach;
@@ -124,9 +124,11 @@ public:
content_t c_mossycobble;
content_t c_stair_cobble;
- MapgenV6(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+ MapgenV6(int mapgenid, MapgenV6Params *params, EmergeManager *emerge);
~MapgenV6();
+ virtual MapgenType getType() const { return MAPGEN_V6; }
+
void makeChunk(BlockMakeData *data);
int getGroundLevelAtPoint(v2s16 p);
int getSpawnLevelAtPoint(v2s16 p);
@@ -162,18 +164,4 @@ public:
virtual void generateCaves(int max_stone_y);
};
-
-struct MapgenFactoryV6 : public MapgenFactory {
- Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
- {
- return new MapgenV6(mgid, params, emerge);
- };
-
- MapgenSpecificParams *createMapgenParams()
- {
- return new MapgenV6Params();
- };
-};
-
-
#endif
diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp
index 9fb65f577..04a9e3c16 100644
--- a/src/mapgen_v7.cpp
+++ b/src/mapgen_v7.cpp
@@ -41,89 +41,44 @@ with this program; if not, write to the Free Software Foundation, Inc.,
FlagDesc flagdesc_mapgen_v7[] = {
- {"mountains", MGV7_MOUNTAINS},
- {"ridges", MGV7_RIDGES},
- {NULL, 0}
+ {"mountains", MGV7_MOUNTAINS},
+ {"ridges", MGV7_RIDGES},
+ {"floatlands", MGV7_FLOATLANDS},
+ {NULL, 0}
};
///////////////////////////////////////////////////////////////////////////////
-MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge)
- : Mapgen(mapgenid, params, emerge)
+MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
+ : MapgenBasic(mapgenid, params, emerge)
{
- this->m_emerge = emerge;
- this->bmgr = emerge->biomemgr;
-
- //// amount of elements to skip for the next index
- //// for noise/height/biome maps (not vmanip)
- this->ystride = csize.X;
- // 1-up 1-down overgeneration
- this->zstride_1u1d = csize.X * (csize.Y + 2);
- // 1-down overgeneration
- this->zstride_1d = csize.X * (csize.Y + 1);
-
- this->biomemap = new u8[csize.X * csize.Z];
- this->heightmap = new s16[csize.X * csize.Z];
- this->heatmap = NULL;
- this->humidmap = NULL;
- this->ridge_heightmap = new s16[csize.X * csize.Z];
-
- MapgenV7Params *sp = (MapgenV7Params *)params->sparams;
-
- this->spflags = sp->spflags;
- this->cave_width = sp->cave_width;
+ this->spflags = params->spflags;
+ this->cave_width = params->cave_width;
+ this->float_mount_density = params->float_mount_density;
+ this->float_mount_height = params->float_mount_height;
+ this->floatland_level = params->floatland_level;
+ this->shadow_limit = params->shadow_limit;
//// Terrain noise
- noise_terrain_base = new Noise(&sp->np_terrain_base, seed, csize.X, csize.Z);
- noise_terrain_alt = new Noise(&sp->np_terrain_alt, seed, csize.X, csize.Z);
- noise_terrain_persist = new Noise(&sp->np_terrain_persist, seed, csize.X, csize.Z);
- noise_height_select = new Noise(&sp->np_height_select, seed, csize.X, csize.Z);
- noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
- noise_mount_height = new Noise(&sp->np_mount_height, seed, csize.X, csize.Z);
- noise_ridge_uwater = new Noise(&sp->np_ridge_uwater, seed, csize.X, csize.Z);
+ noise_terrain_base = new Noise(&params->np_terrain_base, seed, csize.X, csize.Z);
+ noise_terrain_alt = new Noise(&params->np_terrain_alt, seed, csize.X, csize.Z);
+ noise_terrain_persist = new Noise(&params->np_terrain_persist, seed, csize.X, csize.Z);
+ noise_height_select = new Noise(&params->np_height_select, seed, csize.X, csize.Z);
+ noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+ noise_mount_height = new Noise(&params->np_mount_height, seed, csize.X, csize.Z);
+ noise_ridge_uwater = new Noise(&params->np_ridge_uwater, seed, csize.X, csize.Z);
+ noise_floatland_base = new Noise(&params->np_floatland_base, seed, csize.X, csize.Z);
+ noise_float_base_height = new Noise(&params->np_float_base_height, seed, csize.X, csize.Z);
//// 3d terrain noise
// 1-up 1-down overgeneration
- noise_mountain = new Noise(&sp->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
- noise_ridge = new Noise(&sp->np_ridge, seed, csize.X, csize.Y + 2, csize.Z);
- // 1-down overgeneraion
- noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
- noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
-
- //// Biome noise
- noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
- noise_humidity = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
- noise_heat_blend = new Noise(&params->np_biome_heat_blend, seed, csize.X, csize.Z);
- noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
-
- //// Resolve nodes to be used
- INodeDefManager *ndef = emerge->ndef;
-
- c_stone = ndef->getId("mapgen_stone");
- c_water_source = ndef->getId("mapgen_water_source");
- c_lava_source = ndef->getId("mapgen_lava_source");
- c_desert_stone = ndef->getId("mapgen_desert_stone");
- c_ice = ndef->getId("mapgen_ice");
- c_sandstone = ndef->getId("mapgen_sandstone");
-
- c_cobble = ndef->getId("mapgen_cobble");
- c_stair_cobble = ndef->getId("mapgen_stair_cobble");
- c_mossycobble = ndef->getId("mapgen_mossycobble");
- c_sandstonebrick = ndef->getId("mapgen_sandstonebrick");
- c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
-
- if (c_ice == CONTENT_IGNORE)
- c_ice = CONTENT_AIR;
- if (c_mossycobble == CONTENT_IGNORE)
- c_mossycobble = c_cobble;
- if (c_stair_cobble == CONTENT_IGNORE)
- c_stair_cobble = c_cobble;
- if (c_sandstonebrick == CONTENT_IGNORE)
- c_sandstonebrick = c_sandstone;
- if (c_stair_sandstonebrick == CONTENT_IGNORE)
- c_stair_sandstonebrick = c_sandstone;
+ noise_mountain = new Noise(&params->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
+ noise_ridge = new Noise(&params->np_ridge, seed, csize.X, csize.Y + 2, csize.Z);
+
+ MapgenBasic::np_cave1 = params->np_cave1;
+ MapgenBasic::np_cave2 = params->np_cave2;
}
@@ -136,76 +91,85 @@ MapgenV7::~MapgenV7()
delete noise_filler_depth;
delete noise_mount_height;
delete noise_ridge_uwater;
+ delete noise_floatland_base;
+ delete noise_float_base_height;
delete noise_mountain;
delete noise_ridge;
- delete noise_cave1;
- delete noise_cave2;
-
- delete noise_heat;
- delete noise_humidity;
- delete noise_heat_blend;
- delete noise_humidity_blend;
-
- delete[] ridge_heightmap;
- delete[] heightmap;
- delete[] biomemap;
}
MapgenV7Params::MapgenV7Params()
{
- spflags = MGV7_MOUNTAINS | MGV7_RIDGES;
- cave_width = 0.3;
-
- np_terrain_base = NoiseParams(4, 70, v3f(600, 600, 600), 82341, 5, 0.6, 2.0);
- np_terrain_alt = NoiseParams(4, 25, v3f(600, 600, 600), 5934, 5, 0.6, 2.0);
- np_terrain_persist = NoiseParams(0.6, 0.1, v3f(2000, 2000, 2000), 539, 3, 0.6, 2.0);
- np_height_select = NoiseParams(-8, 16, v3f(500, 500, 500), 4213, 6, 0.7, 2.0);
- np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0);
- np_mount_height = NoiseParams(256, 112, v3f(1000, 1000, 1000), 72449, 3, 0.6, 2.0);
- np_ridge_uwater = NoiseParams(0, 1, v3f(1000, 1000, 1000), 85039, 5, 0.6, 2.0);
- np_mountain = NoiseParams(-0.6, 1, v3f(250, 350, 250), 5333, 5, 0.63, 2.0);
- np_ridge = NoiseParams(0, 1, v3f(100, 100, 100), 6467, 4, 0.75, 2.0);
- np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0);
- np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0);
+ spflags = MGV7_MOUNTAINS | MGV7_RIDGES;
+ cave_width = 0.09;
+ float_mount_density = 0.6;
+ float_mount_height = 128.0;
+ floatland_level = 1280;
+ shadow_limit = 1024;
+
+ np_terrain_base = NoiseParams(4, 70, v3f(600, 600, 600), 82341, 5, 0.6, 2.0);
+ np_terrain_alt = NoiseParams(4, 25, v3f(600, 600, 600), 5934, 5, 0.6, 2.0);
+ np_terrain_persist = NoiseParams(0.6, 0.1, v3f(2000, 2000, 2000), 539, 3, 0.6, 2.0);
+ np_height_select = NoiseParams(-8, 16, v3f(500, 500, 500), 4213, 6, 0.7, 2.0);
+ np_filler_depth = NoiseParams(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0);
+ np_mount_height = NoiseParams(256, 112, v3f(1000, 1000, 1000), 72449, 3, 0.6, 2.0);
+ np_ridge_uwater = NoiseParams(0, 1, v3f(1000, 1000, 1000), 85039, 5, 0.6, 2.0);
+ np_floatland_base = NoiseParams(-0.6, 1.5, v3f(600, 600, 600), 114, 5, 0.6, 2.0);
+ np_float_base_height = NoiseParams(48, 24, v3f(300, 300, 300), 907, 4, 0.7, 2.0);
+ np_mountain = NoiseParams(-0.6, 1, v3f(250, 350, 250), 5333, 5, 0.63, 2.0);
+ np_ridge = NoiseParams(0, 1, v3f(100, 100, 100), 6467, 4, 0.75, 2.0);
+ np_cave1 = NoiseParams(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0);
+ np_cave2 = NoiseParams(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0);
}
void MapgenV7Params::readParams(const Settings *settings)
{
- settings->getFlagStrNoEx("mgv7_spflags", spflags, flagdesc_mapgen_v7);
- settings->getFloatNoEx("mgv7_cave_width", cave_width);
-
- settings->getNoiseParams("mgv7_np_terrain_base", np_terrain_base);
- settings->getNoiseParams("mgv7_np_terrain_alt", np_terrain_alt);
- settings->getNoiseParams("mgv7_np_terrain_persist", np_terrain_persist);
- settings->getNoiseParams("mgv7_np_height_select", np_height_select);
- settings->getNoiseParams("mgv7_np_filler_depth", np_filler_depth);
- settings->getNoiseParams("mgv7_np_mount_height", np_mount_height);
- settings->getNoiseParams("mgv7_np_ridge_uwater", np_ridge_uwater);
- settings->getNoiseParams("mgv7_np_mountain", np_mountain);
- settings->getNoiseParams("mgv7_np_ridge", np_ridge);
- settings->getNoiseParams("mgv7_np_cave1", np_cave1);
- settings->getNoiseParams("mgv7_np_cave2", np_cave2);
+ settings->getFlagStrNoEx("mgv7_spflags", spflags, flagdesc_mapgen_v7);
+ settings->getFloatNoEx("mgv7_cave_width", cave_width);
+ settings->getFloatNoEx("mgv7_float_mount_density", float_mount_density);
+ settings->getFloatNoEx("mgv7_float_mount_height", float_mount_height);
+ settings->getS16NoEx("mgv7_floatland_level", floatland_level);
+ settings->getS16NoEx("mgv7_shadow_limit", shadow_limit);
+
+ settings->getNoiseParams("mgv7_np_terrain_base", np_terrain_base);
+ settings->getNoiseParams("mgv7_np_terrain_alt", np_terrain_alt);
+ settings->getNoiseParams("mgv7_np_terrain_persist", np_terrain_persist);
+ settings->getNoiseParams("mgv7_np_height_select", np_height_select);
+ settings->getNoiseParams("mgv7_np_filler_depth", np_filler_depth);
+ settings->getNoiseParams("mgv7_np_mount_height", np_mount_height);
+ settings->getNoiseParams("mgv7_np_ridge_uwater", np_ridge_uwater);
+ settings->getNoiseParams("mgv7_np_floatland_base", np_floatland_base);
+ settings->getNoiseParams("mgv7_np_float_base_height", np_float_base_height);
+ settings->getNoiseParams("mgv7_np_mountain", np_mountain);
+ settings->getNoiseParams("mgv7_np_ridge", np_ridge);
+ settings->getNoiseParams("mgv7_np_cave1", np_cave1);
+ settings->getNoiseParams("mgv7_np_cave2", np_cave2);
}
void MapgenV7Params::writeParams(Settings *settings) const
{
- settings->setFlagStr("mgv7_spflags", spflags, flagdesc_mapgen_v7, U32_MAX);
- settings->setFloat("mgv7_cave_width", cave_width);
-
- settings->setNoiseParams("mgv7_np_terrain_base", np_terrain_base);
- settings->setNoiseParams("mgv7_np_terrain_alt", np_terrain_alt);
- settings->setNoiseParams("mgv7_np_terrain_persist", np_terrain_persist);
- settings->setNoiseParams("mgv7_np_height_select", np_height_select);
- settings->setNoiseParams("mgv7_np_filler_depth", np_filler_depth);
- settings->setNoiseParams("mgv7_np_mount_height", np_mount_height);
- settings->setNoiseParams("mgv7_np_ridge_uwater", np_ridge_uwater);
- settings->setNoiseParams("mgv7_np_mountain", np_mountain);
- settings->setNoiseParams("mgv7_np_ridge", np_ridge);
- settings->setNoiseParams("mgv7_np_cave1", np_cave1);
- settings->setNoiseParams("mgv7_np_cave2", np_cave2);
+ settings->setFlagStr("mgv7_spflags", spflags, flagdesc_mapgen_v7, U32_MAX);
+ settings->setFloat("mgv7_cave_width", cave_width);
+ settings->setFloat("mgv7_float_mount_density", float_mount_density);
+ settings->setFloat("mgv7_float_mount_height", float_mount_height);
+ settings->setS16("mgv7_floatland_level", floatland_level);
+ settings->setS16("mgv7_shadow_limit", shadow_limit);
+
+ settings->setNoiseParams("mgv7_np_terrain_base", np_terrain_base);
+ settings->setNoiseParams("mgv7_np_terrain_alt", np_terrain_alt);
+ settings->setNoiseParams("mgv7_np_terrain_persist", np_terrain_persist);
+ settings->setNoiseParams("mgv7_np_height_select", np_height_select);
+ settings->setNoiseParams("mgv7_np_filler_depth", np_filler_depth);
+ settings->setNoiseParams("mgv7_np_mount_height", np_mount_height);
+ settings->setNoiseParams("mgv7_np_ridge_uwater", np_ridge_uwater);
+ settings->setNoiseParams("mgv7_np_floatland_base", np_floatland_base);
+ settings->setNoiseParams("mgv7_np_float_base_height", np_float_base_height);
+ settings->setNoiseParams("mgv7_np_mountain", np_mountain);
+ settings->setNoiseParams("mgv7_np_ridge", np_ridge);
+ settings->setNoiseParams("mgv7_np_cave1", np_cave1);
+ settings->setNoiseParams("mgv7_np_cave2", np_cave2);
}
@@ -217,17 +181,27 @@ int MapgenV7::getSpawnLevelAtPoint(v2s16 p)
// Base terrain calculation
s16 y = baseTerrainLevelAtPoint(p.X, p.Y);
- // Ridge/river terrain calculation
- float width = 0.2;
- float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2;
- // if inside a river this is an unsuitable spawn point
- if (fabs(uwatern) <= width)
- return MAX_MAP_GENERATION_LIMIT;
+ // If enabled, check if inside a river
+ if (spflags & MGV7_RIDGES) {
+ float width = 0.2;
+ float uwatern = NoisePerlin2D(&noise_ridge_uwater->np, p.X, p.Y, seed) * 2;
+ if (fabs(uwatern) <= width)
+ return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
+ }
+
+ // If mountains are disabled, terrain level is base terrain level
+ // Avoids spawn on non-existant mountain terrain
+ if (!(spflags & MGV7_MOUNTAINS)) {
+ if (y <= water_level || y > water_level + 16)
+ return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
+ else
+ return y;
+ }
// Mountain terrain calculation
int iters = 128;
while (iters--) {
- if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) { // Air, y is ground level
+ if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) { // If air above
if (y <= water_level || y > water_level + 16)
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
else
@@ -236,7 +210,7 @@ int MapgenV7::getSpawnLevelAtPoint(v2s16 p)
y++;
}
- // Unsuitable spawn point, no ground surface found
+ // Unsuitable spawn point, no mountain surface found
return MAX_MAP_GENERATION_LIMIT;
}
@@ -267,70 +241,26 @@ void MapgenV7::makeChunk(BlockMakeData *data)
blockseed = getBlockSeed2(full_node_min, seed);
- // Make some noise
- calculateNoise();
-
- // Generate terrain and ridges with initial heightmaps
+ // Generate base and mountain terrain
+ // An initial heightmap is no longer created here for use in generateRidgeTerrain()
s16 stone_surface_max_y = generateTerrain();
+ // Generate rivers
if (spflags & MGV7_RIDGES)
generateRidgeTerrain();
- // Update heightmap to include mountain terrain
+ // Create heightmap
updateHeightmap(node_min, node_max);
- // Create biomemap at heightmap surface
- bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
- noise_humidity->result, heightmap, biomemap);
-
- // Actually place the biome-specific nodes
- MgStoneType stone_type = generateBiomes(noise_heat->result, noise_humidity->result);
+ // Init biome generator, place biome-specific nodes, and build biomemap
+ biomegen->calcBiomeNoise(node_min);
+ MgStoneType stone_type = generateBiomes();
if (flags & MG_CAVES)
- generateCaves(stone_surface_max_y);
-
- if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
- DungeonParams dp;
-
- dp.np_rarity = nparams_dungeon_rarity;
- dp.np_density = nparams_dungeon_density;
- dp.np_wetness = nparams_dungeon_wetness;
- dp.c_water = c_water_source;
- if (stone_type == STONE) {
- dp.c_cobble = c_cobble;
- dp.c_moss = c_mossycobble;
- dp.c_stair = c_stair_cobble;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 3.0;
- dp.holesize = v3s16(1, 2, 1);
- dp.roomsize = v3s16(0, 0, 0);
- dp.notifytype = GENNOTIFY_DUNGEON;
- } else if (stone_type == DESERT_STONE) {
- dp.c_cobble = c_desert_stone;
- dp.c_moss = c_desert_stone;
- dp.c_stair = c_desert_stone;
-
- dp.diagonal_dirs = true;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 3, 2);
- dp.roomsize = v3s16(2, 5, 2);
- dp.notifytype = GENNOTIFY_TEMPLE;
- } else if (stone_type == SANDSTONE) {
- dp.c_cobble = c_sandstonebrick;
- dp.c_moss = c_sandstonebrick;
- dp.c_stair = c_sandstonebrick;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 0.0;
- dp.holesize = v3s16(2, 2, 2);
- dp.roomsize = v3s16(2, 0, 2);
- dp.notifytype = GENNOTIFY_DUNGEON;
- }
+ generateCaves(stone_surface_max_y, water_level);
- DungeonGen dgen(this, &dp);
- dgen.generate(blockseed, full_node_min, full_node_max);
- }
+ if (flags & MG_DUNGEONS)
+ generateDungeons(stone_surface_max_y, stone_type);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
@@ -346,9 +276,13 @@ void MapgenV7::makeChunk(BlockMakeData *data)
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
+ // Limit floatland shadow
+ bool propagate_shadow = !((spflags & MGV7_FLOATLANDS) &&
+ node_min.Y <= shadow_limit && node_max.Y >= shadow_limit);
+
if (flags & MG_LIGHT)
calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
- full_node_min, full_node_max);
+ full_node_min, full_node_max, propagate_shadow);
//setLighting(node_min - v3s16(1, 0, 1) * MAP_BLOCKSIZE,
// node_max + v3s16(1, 0, 1) * MAP_BLOCKSIZE, 0xFF);
@@ -357,62 +291,6 @@ void MapgenV7::makeChunk(BlockMakeData *data)
}
-void MapgenV7::calculateNoise()
-{
- //TimeTaker t("calculateNoise", NULL, PRECISION_MICRO);
- s16 x = node_min.X;
- s16 y = node_min.Y - 1;
- s16 z = node_min.Z;
-
- noise_terrain_persist->perlinMap2D(x, z);
- float *persistmap = noise_terrain_persist->result;
-
- noise_terrain_base->perlinMap2D(x, z, persistmap);
- noise_terrain_alt->perlinMap2D(x, z, persistmap);
- noise_height_select->perlinMap2D(x, z);
-
- if (spflags & MGV7_MOUNTAINS) {
- noise_mountain->perlinMap3D(x, y, z);
- noise_mount_height->perlinMap2D(x, z);
- }
-
- if ((spflags & MGV7_RIDGES) && node_max.Y >= water_level) {
- noise_ridge->perlinMap3D(x, y, z);
- noise_ridge_uwater->perlinMap2D(x, z);
- }
-
- // Cave noises are calculated in generateCaves()
- // only if solid terrain is present in mapchunk
-
- noise_filler_depth->perlinMap2D(x, z);
- noise_heat->perlinMap2D(x, z);
- noise_humidity->perlinMap2D(x, z);
- noise_heat_blend->perlinMap2D(x, z);
- noise_humidity_blend->perlinMap2D(x, z);
-
- for (s32 i = 0; i < csize.X * csize.Z; i++) {
- noise_heat->result[i] += noise_heat_blend->result[i];
- noise_humidity->result[i] += noise_humidity_blend->result[i];
- }
-
- heatmap = noise_heat->result;
- humidmap = noise_humidity->result;
- //printf("calculateNoise: %dus\n", t.stop());
-}
-
-
-Biome *MapgenV7::getBiomeAtPoint(v3s16 p)
-{
- float heat = NoisePerlin2D(&noise_heat->np, p.X, p.Z, seed) +
- NoisePerlin2D(&noise_heat_blend->np, p.X, p.Z, seed);
- float humidity = NoisePerlin2D(&noise_humidity->np, p.X, p.Z, seed) +
- NoisePerlin2D(&noise_humidity_blend->np, p.X, p.Z, seed);
- s16 groundlevel = baseTerrainLevelAtPoint(p.X, p.Z);
-
- return bmgr->getBiome(heat, humidity, groundlevel);
-}
-
-
float MapgenV7::baseTerrainLevelAtPoint(s16 x, s16 z)
{
float hselect = NoisePerlin2D(&noise_height_select->np, x, z, seed);
@@ -466,26 +344,94 @@ bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y)
}
+bool MapgenV7::getFloatlandMountainFromMap(int idx_xyz, int idx_xz, s16 y)
+{
+ // Make rim 2 nodes thick to match floatland base terrain
+ float density_gradient = (y >= floatland_level) ?
+ -pow((float)(y - floatland_level) / float_mount_height, 0.75f) :
+ -pow((float)(floatland_level - 1 - y) / float_mount_height, 0.75f);
+
+ float floatn = noise_mountain->result[idx_xyz] + float_mount_density;
+
+ return floatn + density_gradient >= 0.0f;
+}
+
+
+void MapgenV7::floatBaseExtentFromMap(s16 *float_base_min, s16 *float_base_max, int idx_xz)
+{
+ // '+1' to avoid a layer of stone at y = MAX_MAP_GENERATION_LIMIT
+ s16 base_min = MAX_MAP_GENERATION_LIMIT + 1;
+ s16 base_max = MAX_MAP_GENERATION_LIMIT;
+
+ float n_base = noise_floatland_base->result[idx_xz];
+ if (n_base > 0.0f) {
+ float n_base_height = noise_float_base_height->result[idx_xz];
+ float amp = n_base * n_base_height;
+ float ridge = n_base_height / 3.0f;
+ base_min = floatland_level - amp / 1.5f;
+
+ if (amp > ridge * 2.0f) {
+ // Lake bed
+ base_max = floatland_level - (amp - ridge * 2.0f) / 2.0f;
+ } else {
+ // Hills and ridges
+ float diff = fabs(amp - ridge) / ridge;
+ // Smooth ridges using the 'smoothstep function'
+ float smooth_diff = diff * diff * (3.0f - 2.0f * diff);
+ base_max = floatland_level + ridge - smooth_diff * ridge;
+ }
+ }
+
+ *float_base_min = base_min;
+ *float_base_max = base_max;
+}
+
+
int MapgenV7::generateTerrain()
{
MapNode n_air(CONTENT_AIR);
MapNode n_stone(c_stone);
MapNode n_water(c_water_source);
+ //// Calculate noise for terrain generation
+ noise_terrain_persist->perlinMap2D(node_min.X, node_min.Z);
+ float *persistmap = noise_terrain_persist->result;
+
+ noise_terrain_base->perlinMap2D(node_min.X, node_min.Z, persistmap);
+ noise_terrain_alt->perlinMap2D(node_min.X, node_min.Z, persistmap);
+ noise_height_select->perlinMap2D(node_min.X, node_min.Z);
+
+ if ((spflags & MGV7_MOUNTAINS) || (spflags & MGV7_FLOATLANDS)) {
+ noise_mountain->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+ }
+
+ if (spflags & MGV7_MOUNTAINS) {
+ noise_mount_height->perlinMap2D(node_min.X, node_min.Z);
+ }
+
+ if (spflags & MGV7_FLOATLANDS) {
+ noise_floatland_base->perlinMap2D(node_min.X, node_min.Z);
+ noise_float_base_height->perlinMap2D(node_min.X, node_min.Z);
+ }
+
+ //// Place nodes
v3s16 em = vm->m_area.getExtent();
s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
u32 index2d = 0;
- bool mountain_flag = spflags & MGV7_MOUNTAINS;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
s16 surface_y = baseTerrainLevelFromMap(index2d);
- heightmap[index2d] = surface_y; // Create base terrain heightmap
- ridge_heightmap[index2d] = surface_y;
-
if (surface_y > stone_surface_max_y)
stone_surface_max_y = surface_y;
+ // Get extent of floatland base terrain
+ // '+1' to avoid a layer of stone at y = MAX_MAP_GENERATION_LIMIT
+ s16 float_base_min = MAX_MAP_GENERATION_LIMIT + 1;
+ s16 float_base_max = MAX_MAP_GENERATION_LIMIT;
+ if (spflags & MGV7_FLOATLANDS)
+ floatBaseExtentFromMap(&float_base_min, &float_base_max, index2d);
+
u32 vi = vm->m_area.index(x, node_min.Y - 1, z);
u32 index3d = (z - node_min.Z) * zstride_1u1d + (x - node_min.X);
@@ -493,13 +439,21 @@ int MapgenV7::generateTerrain()
if (vm->m_data[vi].getContent() == CONTENT_IGNORE) {
if (y <= surface_y) {
vm->m_data[vi] = n_stone; // Base terrain
- } else if (mountain_flag &&
+ } else if ((spflags & MGV7_MOUNTAINS) &&
getMountainTerrainFromMap(index3d, index2d, y)) {
vm->m_data[vi] = n_stone; // Mountain terrain
if (y > stone_surface_max_y)
stone_surface_max_y = y;
+ } else if ((spflags & MGV7_FLOATLANDS) &&
+ ((y >= float_base_min && y <= float_base_max) ||
+ getFloatlandMountainFromMap(index3d, index2d, y))) {
+ vm->m_data[vi] = n_stone; // Floatland terrain
+ stone_surface_max_y = node_max.Y;
} else if (y <= water_level) {
- vm->m_data[vi] = n_water;
+ vm->m_data[vi] = n_water; // Ground level water
+ } else if ((spflags & MGV7_FLOATLANDS) &&
+ (y >= float_base_max && y <= floatland_level)) {
+ vm->m_data[vi] = n_water; // Floatland water
} else {
vm->m_data[vi] = n_air;
}
@@ -515,9 +469,12 @@ int MapgenV7::generateTerrain()
void MapgenV7::generateRidgeTerrain()
{
- if (node_max.Y < water_level - 16)
+ if ((node_max.Y < water_level - 16) || (node_max.Y > shadow_limit))
return;
+ noise_ridge->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+ noise_ridge_uwater->perlinMap2D(node_min.X, node_min.Z);
+
MapNode n_water(c_water_source);
MapNode n_air(CONTENT_AIR);
u32 index = 0;
@@ -529,9 +486,6 @@ void MapgenV7::generateRidgeTerrain()
for (s16 x = node_min.X; x <= node_max.X; x++, index++, vi++) {
int j = (z - node_min.Z) * csize.X + (x - node_min.X);
- if (heightmap[j] < water_level - 16) // Use base terrain heightmap
- continue;
-
float uwatern = noise_ridge_uwater->result[j] * 2;
if (fabs(uwatern) > width)
continue;
@@ -544,233 +498,19 @@ void MapgenV7::generateRidgeTerrain()
if (nridge + width_mod * height_mod < 0.6)
continue;
- if (y < ridge_heightmap[j])
- ridge_heightmap[j] = y - 1;
-
vm->m_data[vi] = (y > water_level) ? n_air : n_water;
}
}
}
-MgStoneType MapgenV7::generateBiomes(float *heat_map, float *humidity_map)
-{
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
- MgStoneType stone_type = STONE;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = NULL;
- u16 depth_top = 0;
- u16 base_filler = 0;
- u16 depth_water_top = 0;
- u32 vi = vm->m_area.index(x, node_max.Y, z);
-
- // Check node at base of mapchunk above, either a node of a previously
- // generated mapchunk or if not, a node of overgenerated base terrain.
- content_t c_above = vm->m_data[vi + em.X].getContent();
- bool air_above = c_above == CONTENT_AIR;
- bool water_above = c_above == c_water_source;
-
- // If there is air or water above enable top/filler placement, otherwise force
- // nplaced to stone level by setting a number exceeding any possible filler depth.
- u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
- for (s16 y = node_max.Y; y >= node_min.Y; y--) {
- content_t c = vm->m_data[vi].getContent();
-
- // Biome is recalculated each time an upper surface is detected while
- // working down a column. The selected biome then remains in effect for
- // all nodes below until the next surface and biome recalculation.
- // Biome is recalculated:
- // 1. At the surface of stone below air or water.
- // 2. At the surface of water below air.
- // 3. When stone or water is detected but biome has not yet been calculated.
- if ((c == c_stone && (air_above || water_above || !biome)) ||
- (c == c_water_source && (air_above || !biome))) {
- biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
- depth_top = biome->depth_top;
- base_filler = MYMAX(depth_top + biome->depth_filler
- + noise_filler_depth->result[index], 0);
- depth_water_top = biome->depth_water_top;
-
- // Detect stone type for dungeons during every biome calculation.
- // This is more efficient than detecting per-node and will not
- // miss any desert stone or sandstone biomes.
- if (biome->c_stone == c_desert_stone)
- stone_type = DESERT_STONE;
- else if (biome->c_stone == c_sandstone)
- stone_type = SANDSTONE;
- }
-
- if (c == c_stone) {
- content_t c_below = vm->m_data[vi - em.X].getContent();
-
- // If the node below isn't solid, make this node stone, so that
- // any top/filler nodes above are structurally supported.
- // This is done by aborting the cycle of top/filler placement
- // immediately by forcing nplaced to stone level.
- if (c_below == CONTENT_AIR || c_below == c_water_source)
- nplaced = U16_MAX;
-
- if (nplaced < depth_top) {
- vm->m_data[vi] = MapNode(biome->c_top);
- nplaced++;
- } else if (nplaced < base_filler) {
- vm->m_data[vi] = MapNode(biome->c_filler);
- nplaced++;
- } else {
- vm->m_data[vi] = MapNode(biome->c_stone);
- }
-
- air_above = false;
- water_above = false;
- } else if (c == c_water_source) {
- vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ?
- biome->c_water_top : biome->c_water);
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = false;
- water_above = true;
- } else if (c == CONTENT_AIR) {
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = true;
- water_above = false;
- } else { // Possible various nodes overgenerated from neighbouring mapchunks
- nplaced = U16_MAX; // Disable top/filler placement
- air_above = false;
- water_above = false;
- }
-
- vm->m_area.add_y(em, vi, -1);
- }
- }
-
- return stone_type;
-}
-
-
-void MapgenV7::dustTopNodes()
-{
- if (node_max.Y < water_level)
- return;
-
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
- if (biome->c_dust == CONTENT_IGNORE)
- continue;
-
- u32 vi = vm->m_area.index(x, full_node_max.Y, z);
- content_t c_full_max = vm->m_data[vi].getContent();
- s16 y_start;
-
- if (c_full_max == CONTENT_AIR) {
- y_start = full_node_max.Y - 1;
- } else if (c_full_max == CONTENT_IGNORE) {
- vi = vm->m_area.index(x, node_max.Y + 1, z);
- content_t c_max = vm->m_data[vi].getContent();
-
- if (c_max == CONTENT_AIR)
- y_start = node_max.Y;
- else
- continue;
- } else {
- continue;
- }
-
- vi = vm->m_area.index(x, y_start, z);
- for (s16 y = y_start; y >= node_min.Y - 1; y--) {
- if (vm->m_data[vi].getContent() != CONTENT_AIR)
- break;
-
- vm->m_area.add_y(em, vi, -1);
- }
-
- content_t c = vm->m_data[vi].getContent();
- if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
- vm->m_area.add_y(em, vi, 1);
- vm->m_data[vi] = MapNode(biome->c_dust);
- }
- }
-}
-
-
-void MapgenV7::generateCaves(s16 max_stone_y)
-{
- if (max_stone_y < node_min.Y)
- return;
-
- noise_cave1->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
- noise_cave2->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
-
- v3s16 em = vm->m_area.getExtent();
- u32 index2d = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index2d++) {
- bool column_is_open = false; // Is column open to overground
- bool is_tunnel = false; // Is tunnel or tunnel floor
- // Indexes at column top (node_max.Y)
- u32 vi = vm->m_area.index(x, node_max.Y, z);
- u32 index3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride +
- (x - node_min.X);
- // Biome of column
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index2d]);
-
- // Don't excavate the overgenerated stone at node_max.Y + 1,
- // this creates a 'roof' over the tunnel, preventing light in
- // tunnels at mapchunk borders when generating mapchunks upwards.
- // This 'roof' is removed when the mapchunk above is generated.
- for (s16 y = node_max.Y; y >= node_min.Y - 1; y--,
- index3d -= ystride,
- vm->m_area.add_y(em, vi, -1)) {
-
- content_t c = vm->m_data[vi].getContent();
- if (c == CONTENT_AIR || c == biome->c_water_top ||
- c == biome->c_water) {
- column_is_open = true;
- continue;
- }
- // Ground
- float d1 = contour(noise_cave1->result[index3d]);
- float d2 = contour(noise_cave2->result[index3d]);
-
- if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
- // In tunnel and ground content, excavate
- vm->m_data[vi] = MapNode(CONTENT_AIR);
- is_tunnel = true;
- } else {
- // Not in tunnel or not ground content
- if (is_tunnel && column_is_open &&
- (c == biome->c_filler || c == biome->c_stone))
- // Tunnel entrance floor
- vm->m_data[vi] = MapNode(biome->c_top);
-
- column_is_open = false;
- is_tunnel = false;
- }
- }
- }
-
- if (node_min.Y >= water_level)
- return;
-
- PseudoRandom ps(blockseed + 21343);
- u32 bruises_count = ps.range(0, 2);
- for (u32 i = 0; i < bruises_count; i++) {
- CaveV7 cave(this, &ps);
- cave.makeCave(node_min, node_max, max_stone_y);
- }
-}
-
-
-///////////////////////////////////////////////////////////////
-
+////////////////////////////////////////////////////////////////////////////////
+//// Code Boneyard
+////
+//// Much of the stuff here has potential to become useful again at some point
+//// in the future, but we don't want it to get lost or forgotten in version
+//// control.
+////
#if 0
int MapgenV7::generateMountainTerrain(s16 ymax)
diff --git a/src/mapgen_v7.h b/src/mapgen_v7.h
index c25220646..3972387a7 100644
--- a/src/mapgen_v7.h
+++ b/src/mapgen_v7.h
@@ -23,18 +23,24 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen.h"
-/////////////////// Mapgen V7 flags
-#define MGV7_MOUNTAINS 0x01
-#define MGV7_RIDGES 0x02
+////////////// Mapgen V7 flags
+#define MGV7_MOUNTAINS 0x01
+#define MGV7_RIDGES 0x02
+#define MGV7_FLOATLANDS 0x04
class BiomeManager;
extern FlagDesc flagdesc_mapgen_v7[];
-struct MapgenV7Params : public MapgenSpecificParams {
+struct MapgenV7Params : public MapgenParams {
u32 spflags;
float cave_width;
+ float float_mount_density;
+ float float_mount_height;
+ s16 floatland_level;
+ s16 shadow_limit;
+
NoiseParams np_terrain_base;
NoiseParams np_terrain_alt;
NoiseParams np_terrain_persist;
@@ -42,6 +48,8 @@ struct MapgenV7Params : public MapgenSpecificParams {
NoiseParams np_filler_depth;
NoiseParams np_mount_height;
NoiseParams np_ridge_uwater;
+ NoiseParams np_floatland_base;
+ NoiseParams np_float_base_height;
NoiseParams np_mountain;
NoiseParams np_ridge;
NoiseParams np_cave1;
@@ -54,87 +62,42 @@ struct MapgenV7Params : public MapgenSpecificParams {
void writeParams(Settings *settings) const;
};
-class MapgenV7 : public Mapgen {
+class MapgenV7 : public MapgenBasic {
public:
- EmergeManager *m_emerge;
- BiomeManager *bmgr;
-
- int ystride;
- int zstride_1u1d;
- int zstride_1d;
-
- v3s16 node_min;
- v3s16 node_max;
- v3s16 full_node_min;
- v3s16 full_node_max;
-
- s16 *ridge_heightmap;
-
- u32 spflags;
- float cave_width;
- Noise *noise_terrain_base;
- Noise *noise_terrain_alt;
- Noise *noise_terrain_persist;
- Noise *noise_height_select;
- Noise *noise_filler_depth;
- Noise *noise_mount_height;
- Noise *noise_ridge_uwater;
- Noise *noise_mountain;
- Noise *noise_ridge;
- Noise *noise_cave1;
- Noise *noise_cave2;
-
- Noise *noise_heat;
- Noise *noise_humidity;
- Noise *noise_heat_blend;
- Noise *noise_humidity_blend;
-
- content_t c_stone;
- content_t c_water_source;
- content_t c_lava_source;
- content_t c_desert_stone;
- content_t c_ice;
- content_t c_sandstone;
-
- content_t c_cobble;
- content_t c_stair_cobble;
- content_t c_mossycobble;
- content_t c_sandstonebrick;
- content_t c_stair_sandstonebrick;
-
- MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+ MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge);
~MapgenV7();
+ virtual MapgenType getType() const { return MAPGEN_V7; }
+
virtual void makeChunk(BlockMakeData *data);
int getSpawnLevelAtPoint(v2s16 p);
- Biome *getBiomeAtPoint(v3s16 p);
float baseTerrainLevelAtPoint(s16 x, s16 z);
float baseTerrainLevelFromMap(int index);
bool getMountainTerrainAtPoint(s16 x, s16 y, s16 z);
bool getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y);
-
- void calculateNoise();
+ bool getFloatlandMountainFromMap(int idx_xyz, int idx_xz, s16 y);
+ void floatBaseExtentFromMap(s16 *float_base_min, s16 *float_base_max, int idx_xz);
int generateTerrain();
void generateRidgeTerrain();
- MgStoneType generateBiomes(float *heat_map, float *humidity_map);
- void dustTopNodes();
+private:
+ float float_mount_density;
+ float float_mount_height;
+ s16 floatland_level;
+ s16 shadow_limit;
- void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryV7 : public MapgenFactory {
- Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
- {
- return new MapgenV7(mgid, params, emerge);
- };
-
- MapgenSpecificParams *createMapgenParams()
- {
- return new MapgenV7Params();
- };
+ Noise *noise_terrain_base;
+ Noise *noise_terrain_alt;
+ Noise *noise_terrain_persist;
+ Noise *noise_height_select;
+ Noise *noise_mount_height;
+ Noise *noise_ridge_uwater;
+ Noise *noise_floatland_base;
+ Noise *noise_float_base_height;
+ Noise *noise_mountain;
+ Noise *noise_ridge;
};
#endif
diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp
index 0ec5409cb..ce7a95329 100644
--- a/src/mapgen_valleys.cpp
+++ b/src/mapgen_valleys.cpp
@@ -64,64 +64,46 @@ static FlagDesc flagdesc_mapgen_valleys[] = {
///////////////////////////////////////////////////////////////////////////////
-MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *emerge)
- : Mapgen(mapgenid, params, emerge)
+MapgenValleys::MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeManager *emerge)
+ : MapgenBasic(mapgenid, params, emerge)
{
- this->m_emerge = emerge;
- this->bmgr = emerge->biomemgr;
-
- //// amount of elements to skip for the next index
- //// for noise/height/biome maps (not vmanip)
- this->ystride = csize.X;
- this->zstride = csize.X * (csize.Y + 2);
- // 1-down overgeneration
- this->zstride_1d = csize.X * (csize.Y + 1);
-
- this->biomemap = new u8[csize.X * csize.Z];
- this->heightmap = new s16[csize.X * csize.Z];
- this->heatmap = NULL;
- this->humidmap = NULL;
+ // NOTE: MapgenValleys has a hard dependency on BiomeGenOriginal
+ this->m_bgen = (BiomeGenOriginal *)biomegen;
this->map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT,
g_settings->getU16("map_generation_limit"));
- MapgenValleysParams *sp = (MapgenValleysParams *)params->sparams;
+ BiomeParamsOriginal *bp = (BiomeParamsOriginal *)params->bparams;
- this->spflags = sp->spflags;
- this->altitude_chill = sp->altitude_chill;
- this->large_cave_depth = sp->large_cave_depth;
- this->lava_features_lim = rangelim(sp->lava_features, 0, 10);
- this->massive_cave_depth = sp->massive_cave_depth;
- this->river_depth_bed = sp->river_depth + 1.f;
- this->river_size_factor = sp->river_size / 100.f;
- this->water_features_lim = rangelim(sp->water_features, 0, 10);
- this->cave_width = sp->cave_width;
+ this->spflags = params->spflags;
+ this->altitude_chill = params->altitude_chill;
+ this->large_cave_depth = params->large_cave_depth;
+ this->lava_features_lim = rangelim(params->lava_features, 0, 10);
+ this->massive_cave_depth = params->massive_cave_depth;
+ this->river_depth_bed = params->river_depth + 1.f;
+ this->river_size_factor = params->river_size / 100.f;
+ this->water_features_lim = rangelim(params->water_features, 0, 10);
+ this->cave_width = params->cave_width;
//// 2D Terrain noise
- noise_filler_depth = new Noise(&sp->np_filler_depth, seed, csize.X, csize.Z);
- noise_inter_valley_slope = new Noise(&sp->np_inter_valley_slope, seed, csize.X, csize.Z);
- noise_rivers = new Noise(&sp->np_rivers, seed, csize.X, csize.Z);
- noise_terrain_height = new Noise(&sp->np_terrain_height, seed, csize.X, csize.Z);
- noise_valley_depth = new Noise(&sp->np_valley_depth, seed, csize.X, csize.Z);
- noise_valley_profile = new Noise(&sp->np_valley_profile, seed, csize.X, csize.Z);
+ noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
+ noise_inter_valley_slope = new Noise(&params->np_inter_valley_slope, seed, csize.X, csize.Z);
+ noise_rivers = new Noise(&params->np_rivers, seed, csize.X, csize.Z);
+ noise_terrain_height = new Noise(&params->np_terrain_height, seed, csize.X, csize.Z);
+ noise_valley_depth = new Noise(&params->np_valley_depth, seed, csize.X, csize.Z);
+ noise_valley_profile = new Noise(&params->np_valley_profile, seed, csize.X, csize.Z);
//// 3D Terrain noise
// 1-up 1-down overgeneration
- noise_inter_valley_fill = new Noise(&sp->np_inter_valley_fill, seed, csize.X, csize.Y + 2, csize.Z);
+ noise_inter_valley_fill = new Noise(&params->np_inter_valley_fill, seed, csize.X, csize.Y + 2, csize.Z);
// 1-down overgeneraion
- noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
- noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
- noise_massive_caves = new Noise(&sp->np_massive_caves, seed, csize.X, csize.Y + 1, csize.Z);
-
- //// Biome noise
- noise_heat_blend = new Noise(&params->np_biome_heat_blend, seed, csize.X, csize.Z);
- noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
- noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
- noise_humidity = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
+ noise_cave1 = new Noise(&params->np_cave1, seed, csize.X, csize.Y + 1, csize.Z);
+ noise_cave2 = new Noise(&params->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
+ noise_massive_caves = new Noise(&params->np_massive_caves, seed, csize.X, csize.Y + 1, csize.Z);
this->humid_rivers = (spflags & MGVALLEYS_HUMID_RIVERS);
this->use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL);
- this->humidity_adjust = params->np_biome_humidity.offset - 50.f;
+ this->humidity_adjust = bp->np_humidity.offset - 50.f;
// a small chance of overflows if the settings are very high
this->cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50;
@@ -129,35 +111,8 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *
tcave_cache = new float[csize.Y + 2];
- //// Resolve nodes to be used
- INodeDefManager *ndef = emerge->ndef;
-
- c_cobble = ndef->getId("mapgen_cobble");
- c_desert_stone = ndef->getId("mapgen_desert_stone");
- c_dirt = ndef->getId("mapgen_dirt");
- c_lava_source = ndef->getId("mapgen_lava_source");
- c_mossycobble = ndef->getId("mapgen_mossycobble");
- c_river_water_source = ndef->getId("mapgen_river_water_source");
- c_sand = ndef->getId("mapgen_sand");
- c_sandstonebrick = ndef->getId("mapgen_sandstonebrick");
- c_sandstone = ndef->getId("mapgen_sandstone");
- c_stair_cobble = ndef->getId("mapgen_stair_cobble");
- c_stair_sandstonebrick = ndef->getId("mapgen_stair_sandstonebrick");
- c_stone = ndef->getId("mapgen_stone");
- c_water_source = ndef->getId("mapgen_water_source");
-
- if (c_mossycobble == CONTENT_IGNORE)
- c_mossycobble = c_cobble;
- if (c_river_water_source == CONTENT_IGNORE)
- c_river_water_source = c_water_source;
- if (c_sand == CONTENT_IGNORE)
- c_sand = c_stone;
- if (c_sandstonebrick == CONTENT_IGNORE)
- c_sandstonebrick = c_sandstone;
- if (c_stair_cobble == CONTENT_IGNORE)
- c_stair_cobble = c_cobble;
- if (c_stair_sandstonebrick == CONTENT_IGNORE)
- c_stair_sandstonebrick = c_sandstone;
+ // Resolve content to be used
+ c_lava_source = ndef->getId("mapgen_lava_source");
}
@@ -174,13 +129,6 @@ MapgenValleys::~MapgenValleys()
delete noise_valley_depth;
delete noise_valley_profile;
- delete noise_heat;
- delete noise_heat_blend;
- delete noise_humidity;
- delete noise_humidity_blend;
-
- delete[] biomemap;
- delete[] heightmap;
delete[] tcave_cache;
}
@@ -195,10 +143,10 @@ MapgenValleysParams::MapgenValleysParams()
river_depth = 4; // How deep to carve river channels.
river_size = 5; // How wide to make rivers.
water_features = 0; // How often water will occur in caves.
- cave_width = 0.3;
+ cave_width = 0.09;
- np_cave1 = NoiseParams(0, 12, v3f(96, 96, 96), 52534, 4, 0.5, 2.0);
- np_cave2 = NoiseParams(0, 12, v3f(96, 96, 96), 10325, 4, 0.5, 2.0);
+ np_cave1 = NoiseParams(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0);
+ np_cave2 = NoiseParams(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0);
np_filler_depth = NoiseParams(0.f, 1.2f, v3f(256, 256, 256), 1605, 3, 0.5f, 2.f);
np_inter_valley_fill = NoiseParams(0.f, 1.f, v3f(256, 512, 256), 1993, 6, 0.8f, 2.f);
np_inter_valley_slope = NoiseParams(0.5f, 0.5f, v3f(128, 128, 128), 746, 1, 1.f, 2.f);
@@ -293,62 +241,24 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
// Generate noise maps and base terrain height.
calculateNoise();
+ // Generate biome noises. Note this must be executed strictly before
+ // generateTerrain, because generateTerrain depends on intermediate
+ // biome-related noises.
+ m_bgen->calcBiomeNoise(node_min);
+
// Generate base terrain with initial heightmaps
s16 stone_surface_max_y = generateTerrain();
- // Create biomemap at heightmap surface
- bmgr->calcBiomes(csize.X, csize.Z, heatmap, humidmap, heightmap, biomemap);
-
- // Actually place the biome-specific nodes
- MgStoneType stone_type = generateBiomes(heatmap, humidmap);
+ // Place biome-specific nodes and build biomemap
+ MgStoneType stone_type = generateBiomes();
// Cave creation.
if (flags & MG_CAVES)
- generateCaves(stone_surface_max_y);
+ generateCaves(stone_surface_max_y, large_cave_depth);
// Dungeon creation
- if ((flags & MG_DUNGEONS) && node_max.Y < 50 && (stone_surface_max_y >= node_min.Y)) {
- DungeonParams dp;
-
- dp.np_rarity = nparams_dungeon_rarity;
- dp.np_density = nparams_dungeon_density;
- dp.np_wetness = nparams_dungeon_wetness;
- dp.c_water = c_water_source;
- if (stone_type == STONE) {
- dp.c_cobble = c_cobble;
- dp.c_moss = c_mossycobble;
- dp.c_stair = c_stair_cobble;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 3.f;
- dp.holesize = v3s16(1, 2, 1);
- dp.roomsize = v3s16(0, 0, 0);
- dp.notifytype = GENNOTIFY_DUNGEON;
- } else if (stone_type == DESERT_STONE) {
- dp.c_cobble = c_desert_stone;
- dp.c_moss = c_desert_stone;
- dp.c_stair = c_desert_stone;
-
- dp.diagonal_dirs = true;
- dp.mossratio = 0.f;
- dp.holesize = v3s16(2, 3, 2);
- dp.roomsize = v3s16(2, 5, 2);
- dp.notifytype = GENNOTIFY_TEMPLE;
- } else if (stone_type == SANDSTONE) {
- dp.c_cobble = c_sandstonebrick;
- dp.c_moss = c_sandstonebrick;
- dp.c_stair = c_sandstonebrick;
-
- dp.diagonal_dirs = false;
- dp.mossratio = 0.f;
- dp.holesize = v3s16(2, 2, 2);
- dp.roomsize = v3s16(2, 0, 2);
- dp.notifytype = GENNOTIFY_DUNGEON;
- }
-
- DungeonGen dgen(this, &dp);
- dgen.generate(blockseed, full_node_min, full_node_max);
- }
+ if ((flags & MG_DUNGEONS) && node_max.Y < 50)
+ generateDungeons(stone_surface_max_y, stone_type);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
@@ -390,11 +300,6 @@ void MapgenValleys::calculateNoise()
//TimeTaker tcn("actualNoise");
- noise_filler_depth->perlinMap2D(x, z);
- noise_heat_blend->perlinMap2D(x, z);
- noise_heat->perlinMap2D(x, z);
- noise_humidity_blend->perlinMap2D(x, z);
- noise_humidity->perlinMap2D(x, z);
noise_inter_valley_slope->perlinMap2D(x, z);
noise_rivers->perlinMap2D(x, z);
noise_terrain_height->perlinMap2D(x, z);
@@ -418,9 +323,8 @@ void MapgenValleys::calculateNoise()
}
for (s32 index = 0; index < csize.X * csize.Z; index++) {
- noise_heat->result[index] += noise_heat_blend->result[index] + heat_offset;
- noise_humidity->result[index] *= humidity_scale;
- noise_humidity->result[index] += noise_humidity_blend->result[index];
+ m_bgen->heatmap[index] += heat_offset;
+ m_bgen->humidmap[index] *= humidity_scale;
}
TerrainNoise tn;
@@ -450,9 +354,6 @@ void MapgenValleys::calculateNoise()
float mount = terrainLevelFromNoise(&tn);
noise_terrain_height->result[index] = mount;
}
-
- heatmap = noise_heat->result;
- humidmap = noise_humidity->result;
}
@@ -583,7 +484,6 @@ int MapgenValleys::generateTerrain()
MapNode n_air(CONTENT_AIR);
MapNode n_river_water(c_river_water_source);
- MapNode n_sand(c_sand);
MapNode n_stone(c_stone);
MapNode n_water(c_water_source);
@@ -596,7 +496,7 @@ int MapgenValleys::generateTerrain()
float river_y = noise_rivers->result[index_2d];
float surface_y = noise_terrain_height->result[index_2d];
float slope = noise_inter_valley_slope->result[index_2d];
- float t_heat = noise_heat->result[index_2d];
+ float t_heat = m_bgen->heatmap[index_2d];
heightmap[index_2d] = -MAX_MAP_GENERATION_LIMIT;
@@ -610,14 +510,14 @@ int MapgenValleys::generateTerrain()
t_heat -= alt_to_heat * MYMAX(surface_y, river_y) / altitude_chill;
// If humidity is low or heat is high, lower the water table.
- float delta = noise_humidity->result[index_2d] - 50.f;
+ float delta = m_bgen->humidmap[index_2d] - 50.f;
if (delta < 0.f) {
float t_evap = (t_heat - 32.f) / evaporation;
river_y += delta * MYMAX(t_evap, 0.08f);
}
}
- u32 index_3d = (z - node_min.Z) * zstride + (x - node_min.X);
+ u32 index_3d = (z - node_min.Z) * zstride_1u1d + (x - node_min.X);
u32 index_data = vm->m_area.index(x, node_min.Y - 1, z);
// Mapgens concern themselves with stone and water.
@@ -627,10 +527,7 @@ int MapgenValleys::generateTerrain()
float surface_delta = (float)y - surface_y;
bool river = y + 1 < river_y;
- if (fabs(surface_delta) <= 0.5f && y > water_level && river) {
- // river bottom
- vm->m_data[index_data] = n_sand;
- } else if (slope * fill > surface_delta) {
+ if (slope * fill > surface_delta) {
// ground
vm->m_data[index_data] = n_stone;
if (y > heightmap[index_2d])
@@ -643,7 +540,7 @@ int MapgenValleys::generateTerrain()
} else if (river) {
// river
vm->m_data[index_data] = n_river_water;
- } else {
+ } else { // air
vm->m_data[index_data] = n_air;
}
}
@@ -672,7 +569,7 @@ int MapgenValleys::generateTerrain()
// Use base ground (water table) in a riverbed, to
// avoid an unnatural rise in humidity.
float t_alt = MYMAX(noise_rivers->result[index_2d], (float)heightmap[index_2d]);
- float humid = noise_humidity->result[index_2d];
+ float humid = m_bgen->humidmap[index_2d];
float water_depth = (t_alt - river_y) / humidity_dropoff;
humid *= 1.f + pow(0.5f, MYMAX(water_depth, 1.f));
@@ -683,7 +580,7 @@ int MapgenValleys::generateTerrain()
if (t_alt > 0.f)
humid -= alt_to_humid * t_alt / altitude_chill;
- noise_humidity->result[index_2d] = humid;
+ m_bgen->humidmap[index_2d] = humid;
}
// Assign the heat adjusted by any changed altitudes.
@@ -693,175 +590,16 @@ int MapgenValleys::generateTerrain()
float t_alt = MYMAX(noise_rivers->result[index_2d], (float)heightmap[index_2d]);
if (humid_rivers && heightmap[index_2d] == (s16)myround(surface_y))
// The altitude hasn't changed. Use the first result.
- noise_heat->result[index_2d] = t_heat;
+ m_bgen->heatmap[index_2d] = t_heat;
else if (t_alt > 0.f)
- noise_heat->result[index_2d] -= alt_to_heat * t_alt / altitude_chill;
+ m_bgen->heatmap[index_2d] -= alt_to_heat * t_alt / altitude_chill;
}
}
return surface_max_y;
}
-
-MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map)
-{
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
- MgStoneType stone_type = STONE;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = NULL;
- u16 depth_top = 0;
- u16 base_filler = 0;
- u16 depth_water_top = 0;
- u32 vi = vm->m_area.index(x, node_max.Y, z);
-
- // Check node at base of mapchunk above, either a node of a previously
- // generated mapchunk or if not, a node of overgenerated base terrain.
- content_t c_above = vm->m_data[vi + em.X].getContent();
- bool air_above = c_above == CONTENT_AIR;
- bool water_above = (c_above == c_water_source || c_above == c_river_water_source);
-
- // If there is air or water above enable top/filler placement, otherwise force
- // nplaced to stone level by setting a number exceeding any possible filler depth.
- u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
-
- for (s16 y = node_max.Y; y >= node_min.Y; y--) {
- content_t c = vm->m_data[vi].getContent();
-
- // Biome is recalculated each time an upper surface is detected while
- // working down a column. The selected biome then remains in effect for
- // all nodes below until the next surface and biome recalculation.
- // Biome is recalculated:
- // 1. At the surface of stone below air or water.
- // 2. At the surface of water below air.
- // 3. When stone or water is detected but biome has not yet been calculated.
- if ((c == c_stone && (air_above || water_above || !biome))
- || ((c == c_water_source || c == c_river_water_source)
- && (air_above || !biome))) {
- // Both heat and humidity have already been adjusted for altitude.
- biome = bmgr->getBiome(heat_map[index], humidity_map[index], y);
-
- depth_top = biome->depth_top;
- base_filler = MYMAX(depth_top
- + biome->depth_filler
- + noise_filler_depth->result[index], 0.f);
- depth_water_top = biome->depth_water_top;
-
- // Detect stone type for dungeons during every biome calculation.
- // This is more efficient than detecting per-node and will not
- // miss any desert stone or sandstone biomes.
- if (biome->c_stone == c_desert_stone)
- stone_type = DESERT_STONE;
- else if (biome->c_stone == c_sandstone)
- stone_type = SANDSTONE;
- }
-
- if (c == c_stone) {
- content_t c_below = vm->m_data[vi - em.X].getContent();
-
- // If the node below isn't solid, make this node stone, so that
- // any top/filler nodes above are structurally supported.
- // This is done by aborting the cycle of top/filler placement
- // immediately by forcing nplaced to stone level.
- if (c_below == CONTENT_AIR
- || c_below == c_water_source
- || c_below == c_river_water_source)
- nplaced = U16_MAX;
-
- if (nplaced < depth_top) {
- vm->m_data[vi] = MapNode(biome->c_top);
- nplaced++;
- } else if (nplaced < base_filler) {
- vm->m_data[vi] = MapNode(biome->c_filler);
- nplaced++;
- } else {
- vm->m_data[vi] = MapNode(biome->c_stone);
- }
-
- air_above = false;
- water_above = false;
- } else if (c == c_water_source) {
- vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top))
- ? biome->c_water_top : biome->c_water);
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = false;
- water_above = true;
- } else if (c == c_river_water_source) {
- vm->m_data[vi] = MapNode(biome->c_river_water);
- nplaced = depth_top; // Enable filler placement for next surface
- air_above = false;
- water_above = true;
- } else if (c == CONTENT_AIR) {
- nplaced = 0; // Enable top/filler placement for next surface
- air_above = true;
- water_above = false;
- } else { // Possible various nodes overgenerated from neighbouring mapchunks
- nplaced = U16_MAX; // Disable top/filler placement
- air_above = false;
- water_above = false;
- }
-
- vm->m_area.add_y(em, vi, -1);
- }
- }
-
- return stone_type;
-}
-
-
-void MapgenValleys::dustTopNodes()
-{
- if (node_max.Y < water_level)
- return;
-
- v3s16 em = vm->m_area.getExtent();
- u32 index = 0;
-
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index]);
-
- if (biome->c_dust == CONTENT_IGNORE)
- continue;
-
- u32 vi = vm->m_area.index(x, full_node_max.Y, z);
- content_t c_full_max = vm->m_data[vi].getContent();
- s16 y_start;
-
- if (c_full_max == CONTENT_AIR) {
- y_start = full_node_max.Y - 1;
- } else if (c_full_max == CONTENT_IGNORE) {
- vi = vm->m_area.index(x, node_max.Y + 1, z);
- content_t c_max = vm->m_data[vi].getContent();
-
- if (c_max == CONTENT_AIR)
- y_start = node_max.Y;
- else
- continue;
- } else {
- continue;
- }
-
- vi = vm->m_area.index(x, y_start, z);
- for (s16 y = y_start; y >= node_min.Y - 1; y--) {
- if (vm->m_data[vi].getContent() != CONTENT_AIR)
- break;
-
- vm->m_area.add_y(em, vi, -1);
- }
-
- content_t c = vm->m_data[vi].getContent();
- if (!ndef->get(c).buildable_to && c != CONTENT_IGNORE && c != biome->c_dust) {
- vm->m_area.add_y(em, vi, 1);
- vm->m_data[vi] = MapNode(biome->c_dust);
- }
- }
-}
-
-
-void MapgenValleys::generateCaves(s16 max_stone_y)
+void MapgenValleys::generateCaves(s16 max_stone_y, s16 large_cave_depth)
{
if (max_stone_y < node_min.Y)
return;
@@ -925,8 +663,9 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
u32 index_2d = 0;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 x = node_min.X; x <= node_max.X; x++, index_2d++) {
- Biome *biome = (Biome *)bmgr->getRaw(biomemap[index_2d]);
+ Biome *biome = (Biome *)m_bmgr->getRaw(biomemap[index_2d]);
bool tunnel_air_above = false;
+ bool is_under_river = false;
bool underground = false;
u32 index_data = vm->m_area.index(x, node_max.Y, z);
u32 index_3d = (z - node_min.Z) * zstride_1d + csize.Y * ystride + (x - node_min.X);
@@ -958,14 +697,13 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
}
content_t c = vm->m_data[index_data].getContent();
+ // Detect river water to place riverbed nodes in tunnels
+ if (c == biome->c_river_water)
+ is_under_river = true;
+
float d1 = contour(noise_cave1->result[index_3d]);
float d2 = contour(noise_cave2->result[index_3d]);
- // River water is not set as ground content
- // in the default game. This can produce strange results
- // when a tunnel undercuts a river. However, that's not for
- // the mapgen to correct. Fix it in lua.
-
if (d1 * d2 > cave_width && ndef->get(c).is_ground_content) {
// in a tunnel
vm->m_data[index_data] = n_air;
@@ -978,8 +716,10 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
vm->m_area.add_y(em, j, 1);
if (sr > terrain - y) {
- // Put dirt in tunnels near the surface.
- if (underground)
+ // Put biome nodes in tunnels near the surface
+ if (is_under_river)
+ vm->m_data[index_data] = MapNode(biome->c_riverbed);
+ else if (underground)
vm->m_data[index_data] = MapNode(biome->c_filler);
else
vm->m_data[index_data] = MapNode(biome->c_top);
@@ -1010,8 +750,10 @@ void MapgenValleys::generateCaves(s16 max_stone_y)
if (node_max.Y <= large_cave_depth && !made_a_big_one) {
u32 bruises_count = ps.range(0, 2);
for (u32 i = 0; i < bruises_count; i++) {
- CaveV5 cave(this, &ps);
- cave.makeCave(node_min, node_max, max_stone_y);
+ CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
+ c_water_source, c_lava_source);
+
+ cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
}
}
}
diff --git a/src/mapgen_valleys.h b/src/mapgen_valleys.h
index 5224ea54b..6dd7ebc47 100644
--- a/src/mapgen_valleys.h
+++ b/src/mapgen_valleys.h
@@ -39,13 +39,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define MYCUBE(x) (x) * (x) * (x)
class BiomeManager;
+class BiomeGenOriginal;
// Global profiler
//class Profiler;
//extern Profiler *mapgen_profiler;
-struct MapgenValleysParams : public MapgenSpecificParams {
+struct MapgenValleysParams : public MapgenParams {
u32 spflags;
s16 large_cave_depth;
s16 massive_cave_depth;
@@ -84,24 +85,21 @@ struct TerrainNoise {
float inter_valley_fill;
};
-class MapgenValleys : public Mapgen {
+class MapgenValleys : public MapgenBasic {
public:
- MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *emerge);
+ MapgenValleys(int mapgenid, MapgenValleysParams *params, EmergeManager *emerge);
~MapgenValleys();
+ virtual MapgenType getType() const { return MAPGEN_VALLEYS; }
+
virtual void makeChunk(BlockMakeData *data);
int getSpawnLevelAtPoint(v2s16 p);
s16 large_cave_depth;
private:
- EmergeManager *m_emerge;
- BiomeManager *bmgr;
-
- int ystride;
- int zstride;
- int zstride_1d;
+ BiomeGenOriginal *m_bgen;
float map_gen_limit;
@@ -111,12 +109,6 @@ private:
s16 cave_water_max_height;
s16 lava_max_height;
- v3s16 node_min;
- v3s16 node_max;
- v3s16 full_node_min;
- v3s16 full_node_max;
-
- u32 spflags;
float altitude_chill;
s16 lava_features_lim;
s16 massive_cave_depth;
@@ -124,37 +116,17 @@ private:
float river_size_factor;
float *tcave_cache;
s16 water_features_lim;
- float cave_width;
- Noise *noise_filler_depth;
- Noise *noise_cave1;
- Noise *noise_cave2;
Noise *noise_inter_valley_fill;
Noise *noise_inter_valley_slope;
Noise *noise_rivers;
+ Noise *noise_cave1;
+ Noise *noise_cave2;
Noise *noise_massive_caves;
Noise *noise_terrain_height;
Noise *noise_valley_depth;
Noise *noise_valley_profile;
- Noise *noise_heat;
- Noise *noise_heat_blend;
- Noise *noise_humidity;
- Noise *noise_humidity_blend;
-
- content_t c_cobble;
- content_t c_desert_stone;
- content_t c_dirt;
- content_t c_ice;
content_t c_lava_source;
- content_t c_mossycobble;
- content_t c_river_water_source;
- content_t c_sand;
- content_t c_sandstone;
- content_t c_sandstonebrick;
- content_t c_stair_cobble;
- content_t c_stair_sandstonebrick;
- content_t c_stone;
- content_t c_water_source;
float terrainLevelAtPoint(s16 x, s16 z);
@@ -164,24 +136,7 @@ private:
float terrainLevelFromNoise(TerrainNoise *tn);
float adjustedTerrainLevelFromNoise(TerrainNoise *tn);
- float humidityByTerrain(float humidity_base, float mount, float rivers, float valley);
-
- MgStoneType generateBiomes(float *heat_map, float *humidity_map);
- void dustTopNodes();
-
- void generateCaves(s16 max_stone_y);
-};
-
-struct MapgenFactoryValleys : public MapgenFactory {
- Mapgen *createMapgen(int mgid, MapgenParams *params, EmergeManager *emerge)
- {
- return new MapgenValleys(mgid, params, emerge);
- };
-
- MapgenSpecificParams *createMapgenParams()
- {
- return new MapgenValleysParams();
- };
+ virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
};
#endif
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index eba47446d..5efebf3d8 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -54,10 +54,10 @@ MapNode::MapNode(INodeDefManager *ndef, const std::string &name,
param2 = a_param2;
}
-void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr)
+void MapNode::setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f)
{
// If node doesn't contain light data, ignore this
- if(nodemgr->get(*this).param_type != CPT_LIGHT)
+ if(f.param_type != CPT_LIGHT)
return;
if(bank == LIGHTBANK_DAY)
{
@@ -73,6 +73,11 @@ void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr
assert("Invalid light bank" == NULL);
}
+void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr)
+{
+ setLight(bank, a_light, nodemgr->get(*this));
+}
+
bool MapNode::isLightDayNightEq(INodeDefManager *nodemgr) const
{
const ContentFeatures &f = nodemgr->get(*this);
@@ -103,6 +108,13 @@ u8 MapNode::getLight(enum LightBank bank, INodeDefManager *nodemgr) const
return MYMAX(f.light_source, light);
}
+u8 MapNode::getLightRaw(enum LightBank bank, const ContentFeatures &f) const
+{
+ if(f.param_type == CPT_LIGHT)
+ return bank == LIGHTBANK_DAY ? param1 & 0x0f : (param1 >> 4) & 0x0f;
+ return 0;
+}
+
u8 MapNode::getLightNoChecks(enum LightBank bank, const ContentFeatures *f) const
{
return MYMAX(f->light_source,
diff --git a/src/mapnode.h b/src/mapnode.h
index 2f6224f02..0bd61c554 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -191,6 +191,8 @@ struct MapNode
param2 = p;
}
+ void setLight(enum LightBank bank, u8 a_light, const ContentFeatures &f);
+
void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr);
/**
@@ -202,6 +204,13 @@ struct MapNode
u8 getLight(enum LightBank bank, INodeDefManager *nodemgr) const;
+ /*!
+ * Returns the node's light level from param1.
+ * If the node emits light, it is ignored.
+ * \param f the ContentFeatures of this node.
+ */
+ u8 getLightRaw(enum LightBank bank, const ContentFeatures &f) const;
+
/**
* This function differs from getLight(enum LightBank bank, INodeDefManager *nodemgr)
* in that the ContentFeatures of the node in question are not retrieved by
diff --git a/src/mapsector.cpp b/src/mapsector.cpp
index 1588a5962..410689f5e 100644
--- a/src/mapsector.cpp
+++ b/src/mapsector.cpp
@@ -42,9 +42,8 @@ void MapSector::deleteBlocks()
m_block_cache = NULL;
// Delete all
- for(std::map<s16, MapBlock*>::iterator i = m_blocks.begin();
- i != m_blocks.end(); ++i)
- {
+ for (UNORDERED_MAP<s16, MapBlock*>::iterator i = m_blocks.begin();
+ i != m_blocks.end(); ++i) {
delete i->second;
}
@@ -56,20 +55,13 @@ MapBlock * MapSector::getBlockBuffered(s16 y)
{
MapBlock *block;
- if(m_block_cache != NULL && y == m_block_cache_y){
+ if (m_block_cache != NULL && y == m_block_cache_y) {
return m_block_cache;
}
// If block doesn't exist, return NULL
- std::map<s16, MapBlock*>::iterator n = m_blocks.find(y);
- if(n == m_blocks.end())
- {
- block = NULL;
- }
- // If block exists, return it
- else{
- block = n->second;
- }
+ UNORDERED_MAP<s16, MapBlock*>::iterator n = m_blocks.find(y);
+ block = (n != m_blocks.end() ? n->second : NULL);
// Cache the last result
m_block_cache_y = y;
@@ -135,18 +127,12 @@ void MapSector::deleteBlock(MapBlock *block)
void MapSector::getBlocks(MapBlockVect &dest)
{
- for(std::map<s16, MapBlock*>::iterator bi = m_blocks.begin();
- bi != m_blocks.end(); ++bi)
- {
+ for (UNORDERED_MAP<s16, MapBlock*>::iterator bi = m_blocks.begin();
+ bi != m_blocks.end(); ++bi) {
dest.push_back(bi->second);
}
}
-bool MapSector::empty()
-{
- return m_blocks.empty();
-}
-
/*
ServerMapSector
*/
diff --git a/src/mapsector.h b/src/mapsector.h
index 4c1ce86a3..c3bff3575 100644
--- a/src/mapsector.h
+++ b/src/mapsector.h
@@ -63,7 +63,7 @@ public:
void getBlocks(MapBlockVect &dest);
- bool empty();
+ bool empty() const { return m_blocks.empty(); }
// Always false at the moment, because sector contains no metadata.
bool differs_from_disk;
@@ -71,7 +71,7 @@ public:
protected:
// The pile of MapBlocks
- std::map<s16, MapBlock*> m_blocks;
+ UNORDERED_MAP<s16, MapBlock*> m_blocks;
Map *m_parent;
// Position on parent (in MapBlock widths)
diff --git a/src/mesh.cpp b/src/mesh.cpp
index b5bf8660a..b68862d22 100644
--- a/src/mesh.cpp
+++ b/src/mesh.cpp
@@ -226,7 +226,27 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
vertex->Color = colorY;
else
vertex->Color = colorZ;
+ }
+ }
+}
+
+void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
+ const video::SColor &color)
+{
+ if (!mesh)
+ return;
+ u16 mc = mesh->getMeshBufferCount();
+ for (u16 j = 0; j < mc; j++) {
+ scene::IMeshBuffer *buf = mesh->getMeshBuffer(j);
+ const u32 stride = getVertexPitchFromType(buf->getVertexType());
+ u32 vertex_count = buf->getVertexCount();
+ u8 *vertices = (u8 *)buf->getVertices();
+ for (u32 i = 0; i < vertex_count; i++) {
+ video::S3DVertex *vertex = (video::S3DVertex *)(vertices + i * stride);
+ if (normal == vertex->Normal) {
+ vertex->Color = color;
+ }
}
}
}
diff --git a/src/mesh.h b/src/mesh.h
index 8e1893773..10df97015 100644
--- a/src/mesh.h
+++ b/src/mesh.h
@@ -64,6 +64,10 @@ void setMeshColorByNormalXYZ(scene::IMesh *mesh,
const video::SColor &colorX,
const video::SColor &colorY,
const video::SColor &colorZ);
+
+void setMeshColorByNormal(scene::IMesh *mesh, const v3f &normal,
+ const video::SColor &color);
+
/*
Rotate the mesh by 6d facedir value.
Method only for meshnodes, not suitable for entities.
diff --git a/src/mg_biome.cpp b/src/mg_biome.cpp
index 9ab8d06cc..78034bf6c 100644
--- a/src/mg_biome.cpp
+++ b/src/mg_biome.cpp
@@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/numeric.h"
#include "util/mathconstants.h"
#include "porting.h"
+#include "settings.h"
///////////////////////////////////////////////////////////////////////////////
@@ -45,6 +46,7 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
b->depth_top = 0;
b->depth_filler = -MAX_MAP_GENERATION_LIMIT;
b->depth_water_top = 0;
+ b->depth_riverbed = 0;
b->y_min = -MAX_MAP_GENERATION_LIMIT;
b->y_max = MAX_MAP_GENERATION_LIMIT;
b->heat_point = 0.0;
@@ -56,6 +58,7 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
b->m_nodenames.push_back("mapgen_water_source");
b->m_nodenames.push_back("mapgen_water_source");
b->m_nodenames.push_back("mapgen_river_water_source");
+ b->m_nodenames.push_back("mapgen_stone");
b->m_nodenames.push_back("ignore");
m_ndef->pendNodeResolve(b);
@@ -63,33 +66,152 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
}
-
BiomeManager::~BiomeManager()
{
- //if (biomecache)
- // delete[] biomecache;
}
+void BiomeManager::clear()
+{
+ EmergeManager *emerge = m_gamedef->getEmergeManager();
+
+ // Remove all dangling references in Decorations
+ DecorationManager *decomgr = emerge->decomgr;
+ for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
+ Decoration *deco = (Decoration *)decomgr->getRaw(i);
+ deco->biomes.clear();
+ }
+
+ // Don't delete the first biome
+ for (size_t i = 1; i < m_objects.size(); i++)
+ delete (Biome *)m_objects[i];
+
+ m_objects.resize(1);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+
+void BiomeParamsOriginal::readParams(const Settings *settings)
+{
+ settings->getNoiseParams("mg_biome_np_heat", np_heat);
+ settings->getNoiseParams("mg_biome_np_heat_blend", np_heat_blend);
+ settings->getNoiseParams("mg_biome_np_humidity", np_humidity);
+ settings->getNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend);
+}
+
+
+void BiomeParamsOriginal::writeParams(Settings *settings) const
+{
+ settings->setNoiseParams("mg_biome_np_heat", np_heat);
+ settings->setNoiseParams("mg_biome_np_heat_blend", np_heat_blend);
+ settings->setNoiseParams("mg_biome_np_humidity", np_humidity);
+ settings->setNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+
+BiomeGenOriginal::BiomeGenOriginal(BiomeManager *biomemgr,
+ BiomeParamsOriginal *params, v3s16 chunksize)
+{
+ m_bmgr = biomemgr;
+ m_params = params;
+ m_csize = chunksize;
+
+ noise_heat = new Noise(&params->np_heat,
+ params->seed, m_csize.X, m_csize.Z);
+ noise_humidity = new Noise(&params->np_humidity,
+ params->seed, m_csize.X, m_csize.Z);
+ noise_heat_blend = new Noise(&params->np_heat_blend,
+ params->seed, m_csize.X, m_csize.Z);
+ noise_humidity_blend = new Noise(&params->np_humidity_blend,
+ params->seed, m_csize.X, m_csize.Z);
+
+ heatmap = noise_heat->result;
+ humidmap = noise_humidity->result;
+ biomemap = new biome_t[m_csize.X * m_csize.Z];
+}
+
+BiomeGenOriginal::~BiomeGenOriginal()
+{
+ delete []biomemap;
+
+ delete noise_heat;
+ delete noise_humidity;
+ delete noise_heat_blend;
+ delete noise_humidity_blend;
+}
+
+
+Biome *BiomeGenOriginal::calcBiomeAtPoint(v3s16 pos) const
+{
+ float heat =
+ NoisePerlin2D(&m_params->np_heat, pos.X, pos.Z, m_params->seed) +
+ NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z, m_params->seed);
+ float humidity =
+ NoisePerlin2D(&m_params->np_humidity, pos.X, pos.Z, m_params->seed) +
+ NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z, m_params->seed);
+
+ return calcBiomeFromNoise(heat, humidity, pos.Y);
+}
+
+
+void BiomeGenOriginal::calcBiomeNoise(v3s16 pmin)
+{
+ m_pmin = pmin;
+
+ noise_heat->perlinMap2D(pmin.X, pmin.Z);
+ noise_humidity->perlinMap2D(pmin.X, pmin.Z);
+ noise_heat_blend->perlinMap2D(pmin.X, pmin.Z);
+ noise_humidity_blend->perlinMap2D(pmin.X, pmin.Z);
+
+ for (s32 i = 0; i < m_csize.X * m_csize.Z; i++) {
+ noise_heat->result[i] += noise_heat_blend->result[i];
+ noise_humidity->result[i] += noise_humidity_blend->result[i];
+ }
+}
-// just a PoC, obviously needs optimization later on (precalculate this)
-void BiomeManager::calcBiomes(s16 sx, s16 sy, float *heat_map,
- float *humidity_map, s16 *height_map, u8 *biomeid_map)
+
+biome_t *BiomeGenOriginal::getBiomes(s16 *heightmap)
{
- for (s32 i = 0; i != sx * sy; i++) {
- Biome *biome = getBiome(heat_map[i], humidity_map[i], height_map[i]);
- biomeid_map[i] = biome->index;
+ for (s32 i = 0; i != m_csize.X * m_csize.Z; i++) {
+ Biome *biome = calcBiomeFromNoise(
+ noise_heat->result[i],
+ noise_humidity->result[i],
+ heightmap[i]);
+
+ biomemap[i] = biome->index;
}
+
+ return biomemap;
+}
+
+
+Biome *BiomeGenOriginal::getBiomeAtPoint(v3s16 pos) const
+{
+ return getBiomeAtIndex(
+ (pos.Z - m_pmin.Z) * m_csize.X + (pos.X - m_pmin.X),
+ pos.Y);
+}
+
+
+Biome *BiomeGenOriginal::getBiomeAtIndex(size_t index, s16 y) const
+{
+ return calcBiomeFromNoise(
+ noise_heat->result[index],
+ noise_humidity->result[index],
+ y);
}
-Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
+Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, s16 y) const
{
Biome *b, *biome_closest = NULL;
float dist_min = FLT_MAX;
- for (size_t i = 1; i < m_objects.size(); i++) {
- b = (Biome *)m_objects[i];
+ for (size_t i = 1; i < m_bmgr->getNumObjects(); i++) {
+ b = (Biome *)m_bmgr->getRaw(i);
if (!b || y > b->y_max || y < b->y_min)
continue;
@@ -103,32 +225,11 @@ Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
}
}
- return biome_closest ? biome_closest : (Biome *)m_objects[0];
+ return biome_closest ? biome_closest : (Biome *)m_bmgr->getRaw(BIOME_NONE);
}
-void BiomeManager::clear()
-{
- EmergeManager *emerge = m_gamedef->getEmergeManager();
-
- // Remove all dangling references in Decorations
- DecorationManager *decomgr = emerge->decomgr;
- for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
- Decoration *deco = (Decoration *)decomgr->getRaw(i);
- deco->biomes.clear();
- }
-
- // Don't delete the first biome
- for (size_t i = 1; i < m_objects.size(); i++) {
- Biome *b = (Biome *)m_objects[i];
- delete b;
- }
-
- m_objects.resize(1);
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
void Biome::resolveNodeNames()
{
@@ -138,5 +239,6 @@ void Biome::resolveNodeNames()
getIdFromNrBacklog(&c_water_top, "mapgen_water_source", CONTENT_AIR);
getIdFromNrBacklog(&c_water, "mapgen_water_source", CONTENT_AIR);
getIdFromNrBacklog(&c_river_water, "mapgen_river_water_source", CONTENT_AIR);
+ getIdFromNrBacklog(&c_riverbed, "mapgen_stone", CONTENT_AIR);
getIdFromNrBacklog(&c_dust, "ignore", CONTENT_IGNORE);
}
diff --git a/src/mg_biome.h b/src/mg_biome.h
index 8d519f808..a10193bc3 100644
--- a/src/mg_biome.h
+++ b/src/mg_biome.h
@@ -22,14 +22,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "objdef.h"
#include "nodedef.h"
+#include "noise.h"
-enum BiomeType
-{
- BIOME_NORMAL,
- BIOME_LIQUID,
- BIOME_NETHER,
- BIOME_AETHER,
- BIOME_FLAT
+class Settings;
+class BiomeManager;
+
+////
+//// Biome
+////
+
+typedef u8 biome_t;
+
+#define BIOME_NONE ((biome_t)0)
+
+// TODO(hmmmm): Decide whether this is obsolete or will be used in the future
+enum BiomeType {
+ BIOMETYPE_NORMAL,
+ BIOMETYPE_LIQUID,
+ BIOMETYPE_NETHER,
+ BIOMETYPE_AETHER,
+ BIOMETYPE_FLAT,
};
class Biome : public ObjDef, public NodeResolver {
@@ -42,11 +54,13 @@ public:
content_t c_water_top;
content_t c_water;
content_t c_river_water;
+ content_t c_riverbed;
content_t c_dust;
s16 depth_top;
s16 depth_filler;
s16 depth_water_top;
+ s16 depth_riverbed;
s16 y_min;
s16 y_max;
@@ -56,10 +70,122 @@ public:
virtual void resolveNodeNames();
};
-class BiomeManager : public ObjDefManager {
+
+////
+//// BiomeGen
+////
+
+enum BiomeGenType {
+ BIOMEGEN_ORIGINAL,
+};
+
+struct BiomeParams {
+ virtual void readParams(const Settings *settings) = 0;
+ virtual void writeParams(Settings *settings) const = 0;
+ virtual ~BiomeParams() {}
+
+ s32 seed;
+};
+
+class BiomeGen {
+public:
+ virtual ~BiomeGen() {}
+ virtual BiomeGenType getType() const = 0;
+
+ // Calculates the biome at the exact position provided. This function can
+ // be called at any time, but may be less efficient than the latter methods,
+ // depending on implementation.
+ virtual Biome *calcBiomeAtPoint(v3s16 pos) const = 0;
+
+ // Computes any intermediate results needed for biome generation. Must be
+ // called before using any of: getBiomes, getBiomeAtPoint, or getBiomeAtIndex.
+ // Calling this invalidates the previous results stored in biomemap.
+ virtual void calcBiomeNoise(v3s16 pmin) = 0;
+
+ // Gets all biomes in current chunk using each corresponding element of
+ // heightmap as the y position, then stores the results by biome index in
+ // biomemap (also returned)
+ virtual biome_t *getBiomes(s16 *heightmap) = 0;
+
+ // Gets a single biome at the specified position, which must be contained
+ // in the region formed by m_pmin and (m_pmin + m_csize - 1).
+ virtual Biome *getBiomeAtPoint(v3s16 pos) const = 0;
+
+ // Same as above, but uses a raw numeric index correlating to the (x,z) position.
+ virtual Biome *getBiomeAtIndex(size_t index, s16 y) const = 0;
+
+ // Result of calcBiomes bulk computation.
+ biome_t *biomemap;
+
+protected:
+ BiomeManager *m_bmgr;
+ v3s16 m_pmin;
+ v3s16 m_csize;
+};
+
+
+////
+//// BiomeGen implementations
+////
+
+//
+// Original biome algorithm (Whittaker's classification + surface height)
+//
+
+struct BiomeParamsOriginal : public BiomeParams {
+ BiomeParamsOriginal() :
+ np_heat(50, 50, v3f(1000.0, 1000.0, 1000.0), 5349, 3, 0.5, 2.0),
+ np_humidity(50, 50, v3f(1000.0, 1000.0, 1000.0), 842, 3, 0.5, 2.0),
+ np_heat_blend(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0),
+ np_humidity_blend(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)
+ {
+ }
+
+ virtual void readParams(const Settings *settings);
+ virtual void writeParams(Settings *settings) const;
+
+ NoiseParams np_heat;
+ NoiseParams np_humidity;
+ NoiseParams np_heat_blend;
+ NoiseParams np_humidity_blend;
+};
+
+class BiomeGenOriginal : public BiomeGen {
public:
- static const char *OBJECT_TITLE;
+ BiomeGenOriginal(BiomeManager *biomemgr,
+ BiomeParamsOriginal *params, v3s16 chunksize);
+ virtual ~BiomeGenOriginal();
+ BiomeGenType getType() const { return BIOMEGEN_ORIGINAL; }
+
+ Biome *calcBiomeAtPoint(v3s16 pos) const;
+ void calcBiomeNoise(v3s16 pmin);
+
+ biome_t *getBiomes(s16 *heightmap);
+ Biome *getBiomeAtPoint(v3s16 pos) const;
+ Biome *getBiomeAtIndex(size_t index, s16 y) const;
+
+ Biome *calcBiomeFromNoise(float heat, float humidity, s16 y) const;
+
+ float *heatmap;
+ float *humidmap;
+
+private:
+ BiomeParamsOriginal *m_params;
+
+ Noise *noise_heat;
+ Noise *noise_humidity;
+ Noise *noise_heat_blend;
+ Noise *noise_humidity_blend;
+};
+
+
+////
+//// BiomeManager
+////
+
+class BiomeManager : public ObjDefManager {
+public:
BiomeManager(IGameDef *gamedef);
virtual ~BiomeManager();
@@ -73,15 +199,33 @@ public:
return new Biome;
}
- virtual void clear();
+ BiomeGen *createBiomeGen(BiomeGenType type, BiomeParams *params, v3s16 chunksize)
+ {
+ switch (type) {
+ case BIOMEGEN_ORIGINAL:
+ return new BiomeGenOriginal(this,
+ (BiomeParamsOriginal *)params, chunksize);
+ default:
+ return NULL;
+ }
+ }
- void calcBiomes(s16 sx, s16 sy, float *heat_map, float *humidity_map,
- s16 *height_map, u8 *biomeid_map);
- Biome *getBiome(float heat, float humidity, s16 y);
+ static BiomeParams *createBiomeParams(BiomeGenType type)
+ {
+ switch (type) {
+ case BIOMEGEN_ORIGINAL:
+ return new BiomeParamsOriginal;
+ default:
+ return NULL;
+ }
+ }
+
+ virtual void clear();
private:
IGameDef *m_gamedef;
+
};
-#endif
+#endif
diff --git a/src/mg_decoration.cpp b/src/mg_decoration.cpp
index 8b6abb5d5..51e4fbbcc 100644
--- a/src/mg_decoration.cpp
+++ b/src/mg_decoration.cpp
@@ -26,12 +26,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/numeric.h"
FlagDesc flagdesc_deco[] = {
- {"place_center_x", DECO_PLACE_CENTER_X},
- {"place_center_y", DECO_PLACE_CENTER_Y},
- {"place_center_z", DECO_PLACE_CENTER_Z},
+ {"place_center_x", DECO_PLACE_CENTER_X},
+ {"place_center_y", DECO_PLACE_CENTER_Y},
+ {"place_center_z", DECO_PLACE_CENTER_Z},
{"force_placement", DECO_FORCE_PLACEMENT},
- {"liquid_surface", DECO_LIQUID_SURFACE},
- {NULL, 0}
+ {"liquid_surface", DECO_LIQUID_SURFACE},
+ {NULL, 0}
};
@@ -82,6 +82,56 @@ Decoration::~Decoration()
void Decoration::resolveNodeNames()
{
getIdsFromNrBacklog(&c_place_on);
+ getIdsFromNrBacklog(&c_spawnby);
+}
+
+
+bool Decoration::canPlaceDecoration(MMVManip *vm, v3s16 p)
+{
+ // Check if the decoration can be placed on this node
+ u32 vi = vm->m_area.index(p);
+ if (!CONTAINS(c_place_on, vm->m_data[vi].getContent()))
+ return false;
+
+ // Don't continue if there are no spawnby constraints
+ if (nspawnby == -1)
+ return true;
+
+ int nneighs = 0;
+ static const v3s16 dirs[16] = {
+ v3s16( 0, 0, 1),
+ v3s16( 0, 0, -1),
+ v3s16( 1, 0, 0),
+ v3s16(-1, 0, 0),
+ v3s16( 1, 0, 1),
+ v3s16(-1, 0, 1),
+ v3s16(-1, 0, -1),
+ v3s16( 1, 0, -1),
+
+ v3s16( 0, 1, 1),
+ v3s16( 0, 1, -1),
+ v3s16( 1, 1, 0),
+ v3s16(-1, 1, 0),
+ v3s16( 1, 1, 1),
+ v3s16(-1, 1, 1),
+ v3s16(-1, 1, -1),
+ v3s16( 1, 1, -1)
+ };
+
+ // Check these 16 neighbouring nodes for enough spawnby nodes
+ for (size_t i = 0; i != ARRLEN(dirs); i++) {
+ u32 index = vm->m_area.index(p + dirs[i]);
+ if (!vm->m_area.contains(index))
+ continue;
+
+ if (CONTAINS(c_spawnby, vm->m_data[index].getContent()))
+ nneighs++;
+ }
+
+ if (nneighs < nspawnby)
+ return false;
+
+ return true;
}
@@ -145,7 +195,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
y < y_min || y > y_max)
continue;
- if (y + getHeight() >= mg->vm->m_area.MaxEdge.Y) {
+ if (y + getHeight() > mg->vm->m_area.MaxEdge.Y) {
continue;
#if 0
printf("Decoration at (%d %d %d) cut off\n", x, y, z);
@@ -156,7 +206,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
}
if (mg->biomemap) {
- std::set<u8>::iterator iter;
+ UNORDERED_SET<u8>::iterator iter;
if (!biomes.empty()) {
iter = biomes.find(mg->biomemap[mapindex]);
@@ -236,66 +286,15 @@ void DecoSimple::resolveNodeNames()
{
Decoration::resolveNodeNames();
getIdsFromNrBacklog(&c_decos);
- getIdsFromNrBacklog(&c_spawnby);
}
-bool DecoSimple::canPlaceDecoration(MMVManip *vm, v3s16 p)
+size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
{
// Don't bother if there aren't any decorations to place
if (c_decos.size() == 0)
- return false;
-
- u32 vi = vm->m_area.index(p);
-
- // Check if the decoration can be placed on this node
- if (!CONTAINS(c_place_on, vm->m_data[vi].getContent()))
- return false;
-
- // Don't continue if there are no spawnby constraints
- if (nspawnby == -1)
- return true;
-
- int nneighs = 0;
- v3s16 dirs[16] = {
- v3s16( 0, 0, 1),
- v3s16( 0, 0, -1),
- v3s16( 1, 0, 0),
- v3s16(-1, 0, 0),
- v3s16( 1, 0, 1),
- v3s16(-1, 0, 1),
- v3s16(-1, 0, -1),
- v3s16( 1, 0, -1),
-
- v3s16( 0, 1, 1),
- v3s16( 0, 1, -1),
- v3s16( 1, 1, 0),
- v3s16(-1, 1, 0),
- v3s16( 1, 1, 1),
- v3s16(-1, 1, 1),
- v3s16(-1, 1, -1),
- v3s16( 1, 1, -1)
- };
-
- // Check a Moore neighborhood if there are enough spawnby nodes
- for (size_t i = 0; i != ARRLEN(dirs); i++) {
- u32 index = vm->m_area.index(p + dirs[i]);
- if (!vm->m_area.contains(index))
- continue;
-
- if (CONTAINS(c_spawnby, vm->m_data[index].getContent()))
- nneighs++;
- }
-
- if (nneighs < nspawnby)
- return false;
-
- return true;
-}
-
+ return 0;
-size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
-{
if (!canPlaceDecoration(vm, p))
return 0;
@@ -316,7 +315,7 @@ size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
!force_placement)
break;
- vm->m_data[vi] = MapNode(c_place);
+ vm->m_data[vi] = MapNode(c_place, 0, deco_param2);
}
return 1;
@@ -345,9 +344,7 @@ size_t DecoSchematic::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
if (schematic == NULL)
return 0;
- u32 vi = vm->m_area.index(p);
- content_t c = vm->m_data[vi].getContent();
- if (!CONTAINS(c_place_on, c))
+ if (!canPlaceDecoration(vm, p))
return 0;
if (flags & DECO_PLACE_CENTER_X)
@@ -370,5 +367,9 @@ size_t DecoSchematic::generate(MMVManip *vm, PcgRandom *pr, v3s16 p)
int DecoSchematic::getHeight()
{
- return schematic->size.Y;
+ // Account for a schematic being sunk into the ground by flag.
+ // When placed normally account for how a schematic is placed
+ // sunk 1 node into the ground.
+ return (flags & DECO_PLACE_CENTER_Y) ?
+ (schematic->size.Y - 1) / 2 : schematic->size.Y - 1;
}
diff --git a/src/mg_decoration.h b/src/mg_decoration.h
index ba3e9d3b2..986328ec3 100644
--- a/src/mg_decoration.h
+++ b/src/mg_decoration.h
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef MG_DECORATION_HEADER
#define MG_DECORATION_HEADER
-#include <set>
+#include "util/cpp11_container.h"
#include "objdef.h"
#include "noise.h"
#include "nodedef.h"
@@ -68,6 +68,7 @@ public:
virtual void resolveNodeNames();
+ bool canPlaceDecoration(MMVManip *vm, v3s16 p);
size_t placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
//size_t placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
@@ -82,25 +83,24 @@ public:
s16 y_max;
float fill_ratio;
NoiseParams np;
+ std::vector<content_t> c_spawnby;
+ s16 nspawnby;
- std::set<u8> biomes;
+ UNORDERED_SET<u8> biomes;
//std::list<CutoffData> cutoffs;
//Mutex cutoff_mutex;
};
class DecoSimple : public Decoration {
public:
+ virtual void resolveNodeNames();
virtual size_t generate(MMVManip *vm, PcgRandom *pr, v3s16 p);
- bool canPlaceDecoration(MMVManip *vm, v3s16 p);
virtual int getHeight();
- virtual void resolveNodeNames();
-
std::vector<content_t> c_decos;
- std::vector<content_t> c_spawnby;
s16 deco_height;
s16 deco_height_max;
- s16 nspawnby;
+ u8 deco_param2;
};
class DecoSchematic : public Decoration {
diff --git a/src/mg_ore.cpp b/src/mg_ore.cpp
index 257901614..d840d745a 100644
--- a/src/mg_ore.cpp
+++ b/src/mg_ore.cpp
@@ -148,7 +148,7 @@ void OreScatter::generate(MMVManip *vm, int mapseed, u32 blockseed,
if (biomemap && !biomes.empty()) {
u32 index = sizex * (z0 - nmin.Z) + (x0 - nmin.X);
- std::set<u8>::iterator it = biomes.find(biomemap[index]);
+ UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[index]);
if (it == biomes.end())
continue;
}
@@ -202,7 +202,7 @@ void OreSheet::generate(MMVManip *vm, int mapseed, u32 blockseed,
continue;
if (biomemap && !biomes.empty()) {
- std::set<u8>::iterator it = biomes.find(biomemap[index]);
+ UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[index]);
if (it == biomes.end())
continue;
}
@@ -270,7 +270,7 @@ void OrePuff::generate(MMVManip *vm, int mapseed, u32 blockseed,
continue;
if (biomemap && !biomes.empty()) {
- std::set<u8>::iterator it = biomes.find(biomemap[index]);
+ UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[index]);
if (it == biomes.end())
continue;
}
@@ -338,7 +338,7 @@ void OreBlob::generate(MMVManip *vm, int mapseed, u32 blockseed,
if (biomemap && !biomes.empty()) {
u32 bmapidx = sizex * (z0 - nmin.Z) + (x0 - nmin.X);
- std::set<u8>::iterator it = biomes.find(biomemap[bmapidx]);
+ UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[bmapidx]);
if (it == biomes.end())
continue;
}
@@ -422,7 +422,7 @@ void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed,
if (biomemap && !biomes.empty()) {
u32 bmapidx = sizex * (z - nmin.Z) + (x - nmin.X);
- std::set<u8>::iterator it = biomes.find(biomemap[bmapidx]);
+ UNORDERED_SET<u8>::iterator it = biomes.find(biomemap[bmapidx]);
if (it == biomes.end())
continue;
}
diff --git a/src/mg_ore.h b/src/mg_ore.h
index 2e065cee3..e95fdd330 100644
--- a/src/mg_ore.h
+++ b/src/mg_ore.h
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef MG_ORE_HEADER
#define MG_ORE_HEADER
+#include "util/cpp11_container.h"
#include "objdef.h"
#include "noise.h"
#include "nodedef.h"
@@ -64,7 +65,7 @@ public:
float nthresh; // threshold for noise at which an ore is placed
NoiseParams np; // noise for distribution of clusters (NULL for uniform scattering)
Noise *noise;
- std::set<u8> biomes;
+ UNORDERED_SET<u8> biomes;
Ore();
virtual ~Ore();
diff --git a/src/mg_schematic.cpp b/src/mg_schematic.cpp
index 0b95fa267..e028215dc 100644
--- a/src/mg_schematic.cpp
+++ b/src/mg_schematic.cpp
@@ -564,14 +564,14 @@ void Schematic::applyProbabilities(v3s16 p0,
void generate_nodelist_and_update_ids(MapNode *nodes, size_t nodecount,
std::vector<std::string> *usednodes, INodeDefManager *ndef)
{
- std::map<content_t, content_t> nodeidmap;
+ UNORDERED_MAP<content_t, content_t> nodeidmap;
content_t numids = 0;
for (size_t i = 0; i != nodecount; i++) {
content_t id;
content_t c = nodes[i].getContent();
- std::map<content_t, content_t>::const_iterator it = nodeidmap.find(c);
+ UNORDERED_MAP<content_t, content_t>::const_iterator it = nodeidmap.find(c);
if (it == nodeidmap.end()) {
id = numids;
numids++;
diff --git a/src/mods.h b/src/mods.h
index 12576516d..af7777d18 100644
--- a/src/mods.h
+++ b/src/mods.h
@@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <vector>
#include <string>
#include <map>
-#include "json/json.h"
+#include <json/json.h>
#include "config.h"
#define MODNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyz0123456789_"
diff --git a/src/nameidmapping.cpp b/src/nameidmapping.cpp
index ed59ddd16..2af8befff 100644
--- a/src/nameidmapping.cpp
+++ b/src/nameidmapping.cpp
@@ -25,7 +25,7 @@ void NameIdMapping::serialize(std::ostream &os) const
{
writeU8(os, 0); // version
writeU16(os, m_id_to_name.size());
- for(std::map<u16, std::string>::const_iterator
+ for(UNORDERED_MAP<u16, std::string>::const_iterator
i = m_id_to_name.begin();
i != m_id_to_name.end(); ++i){
writeU16(os, i->first);
diff --git a/src/nameidmapping.h b/src/nameidmapping.h
index 417c441d2..23838c8ff 100644
--- a/src/nameidmapping.h
+++ b/src/nameidmapping.h
@@ -23,15 +23,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <string>
#include <iostream>
#include <set>
-#include <map>
#include "irrlichttypes_bloated.h"
+#include "util/cpp11_container.h"
class NameIdMapping
{
public:
void serialize(std::ostream &os) const;
void deSerialize(std::istream &is);
-
+
void clear(){
m_id_to_name.clear();
m_name_to_id.clear();
@@ -55,7 +55,7 @@ public:
m_name_to_id.erase(name);
}
bool getName(u16 id, std::string &result) const{
- std::map<u16, std::string>::const_iterator i;
+ UNORDERED_MAP<u16, std::string>::const_iterator i;
i = m_id_to_name.find(id);
if(i == m_id_to_name.end())
return false;
@@ -63,7 +63,7 @@ public:
return true;
}
bool getId(const std::string &name, u16 &result) const{
- std::map<std::string, u16>::const_iterator i;
+ UNORDERED_MAP<std::string, u16>::const_iterator i;
i = m_name_to_id.find(name);
if(i == m_name_to_id.end())
return false;
@@ -74,8 +74,8 @@ public:
return m_id_to_name.size();
}
private:
- std::map<u16, std::string> m_id_to_name;
- std::map<std::string, u16> m_name_to_id;
+ UNORDERED_MAP<u16, std::string> m_id_to_name;
+ UNORDERED_MAP<std::string, u16> m_name_to_id;
};
#endif
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 0498f4048..411982f69 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -110,7 +110,7 @@ void Client::handleCommand_AuthAccept(NetworkPacket* pkt)
playerpos -= v3f(0, BS / 2, 0);
// Set player position
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
player->setPosition(playerpos);
@@ -176,7 +176,7 @@ void Client::handleCommand_InitLegacy(NetworkPacket* pkt)
// Set player position
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
player->setPosition(playerpos_f);
@@ -333,7 +333,7 @@ void Client::handleCommand_Inventory(NetworkPacket* pkt)
std::string datastring(pkt->getString(0), pkt->getSize());
std::istringstream is(datastring, std::ios_base::binary);
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
player->inventory.deSerialize(is);
@@ -486,7 +486,7 @@ void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt)
void Client::handleCommand_Movement(NetworkPacket* pkt)
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
float mad, maa, maf, msw, mscr, msf, mscl, msj, lf, lfs, ls, g;
@@ -511,7 +511,7 @@ void Client::handleCommand_Movement(NetworkPacket* pkt)
void Client::handleCommand_HP(NetworkPacket* pkt)
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
u8 oldhp = player->hp;
@@ -532,7 +532,7 @@ void Client::handleCommand_HP(NetworkPacket* pkt)
void Client::handleCommand_Breath(NetworkPacket* pkt)
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
u16 breath;
@@ -544,7 +544,7 @@ void Client::handleCommand_Breath(NetworkPacket* pkt)
void Client::handleCommand_MovePlayer(NetworkPacket* pkt)
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
v3f pos;
@@ -634,7 +634,6 @@ void Client::handleCommand_AnnounceMedia(NetworkPacket* pkt)
m_media_downloader->addFile(name, sha1_raw);
}
- std::vector<std::string> remote_media;
try {
std::string str;
@@ -812,9 +811,7 @@ void Client::handleCommand_StopSound(NetworkPacket* pkt)
*pkt >> server_id;
- std::map<s32, int>::iterator i =
- m_sounds_server_to_client.find(server_id);
-
+ UNORDERED_MAP<s32, int>::iterator i = m_sounds_server_to_client.find(server_id);
if (i != m_sounds_server_to_client.end()) {
int client_id = i->second;
m_sound->stopSound(client_id);
@@ -842,7 +839,7 @@ void Client::handleCommand_Privileges(NetworkPacket* pkt)
void Client::handleCommand_InventoryFormSpec(NetworkPacket* pkt)
{
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
// Store formspec in LocalPlayer
@@ -898,8 +895,10 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt)
bool collisiondetection = readU8(is);
std::string texture = deSerializeLongString(is);
bool vertical = false;
+ bool collision_removal = false;
try {
vertical = readU8(is);
+ collision_removal = readU8(is);
} catch (...) {}
ClientEvent event;
@@ -910,6 +909,7 @@ void Client::handleCommand_SpawnParticle(NetworkPacket* pkt)
event.spawn_particle.expirationtime = expirationtime;
event.spawn_particle.size = size;
event.spawn_particle.collisiondetection = collisiondetection;
+ event.spawn_particle.collision_removal = collision_removal;
event.spawn_particle.vertical = vertical;
event.spawn_particle.texture = new std::string(texture);
@@ -942,8 +942,13 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt)
*pkt >> id;
bool vertical = false;
+ bool collision_removal = false;
+ u16 attached_id = 0;
try {
*pkt >> vertical;
+ *pkt >> collision_removal;
+ *pkt >> attached_id;
+
} catch (...) {}
ClientEvent event;
@@ -961,6 +966,8 @@ void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt)
event.add_particlespawner.minsize = minsize;
event.add_particlespawner.maxsize = maxsize;
event.add_particlespawner.collisiondetection = collisiondetection;
+ event.add_particlespawner.collision_removal = collision_removal;
+ event.add_particlespawner.attached_id = attached_id;
event.add_particlespawner.vertical = vertical;
event.add_particlespawner.texture = new std::string(texture);
event.add_particlespawner.id = id;
@@ -1093,7 +1100,7 @@ void Client::handleCommand_HudSetFlags(NetworkPacket* pkt)
*pkt >> flags >> mask;
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
bool was_minimap_visible = player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE;
@@ -1117,7 +1124,7 @@ void Client::handleCommand_HudSetParam(NetworkPacket* pkt)
*pkt >> param >> value;
- Player *player = m_env.getLocalPlayer();
+ LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
if (param == HUD_PARAM_HOTBAR_ITEMCOUNT && value.size() == 4) {
@@ -1126,10 +1133,10 @@ void Client::handleCommand_HudSetParam(NetworkPacket* pkt)
player->hud_hotbar_itemcount = hotbar_itemcount;
}
else if (param == HUD_PARAM_HOTBAR_IMAGE) {
- ((LocalPlayer *) player)->hotbar_image = value;
+ player->hotbar_image = value;
}
else if (param == HUD_PARAM_HOTBAR_SELECTED_IMAGE) {
- ((LocalPlayer *) player)->hotbar_selected_image = value;
+ player->hotbar_selected_image = value;
}
}
diff --git a/src/network/connection.cpp b/src/network/connection.cpp
index f7452d8e4..b711cae11 100644
--- a/src/network/connection.cpp
+++ b/src/network/connection.cpp
@@ -71,6 +71,9 @@ static inline float CALC_DTIME(unsigned int lasttime, unsigned int curtime) {
#define PING_TIMEOUT 5.0
+/* maximum number of retries for reliable packets */
+#define MAX_RELIABLE_RETRY 5
+
static u16 readPeerId(u8 *packetdata)
{
return readU16(&packetdata[4]);
@@ -1399,6 +1402,7 @@ void ConnectionSendThread::runTimeouts(float dtime)
}
float resend_timeout = dynamic_cast<UDPPeer*>(&peer)->getResendTimeout();
+ bool retry_count_exceeded = false;
for(u16 i=0; i<CHANNEL_COUNT; i++)
{
std::list<BufferedPacket> timed_outs;
@@ -1438,6 +1442,13 @@ void ConnectionSendThread::runTimeouts(float dtime)
channel->UpdateBytesLost(k->data.getSize());
k->resend_count++;
+ if (k-> resend_count > MAX_RELIABLE_RETRY) {
+ retry_count_exceeded = true;
+ timeouted_peers.push_back(peer->id);
+ /* no need to check additional packets if a single one did timeout*/
+ break;
+ }
+
LOG(derr_con<<m_connection->getDesc()
<<"RE-SENDING timed-out RELIABLE to "
<< k->address.serializeString()
@@ -1452,9 +1463,18 @@ void ConnectionSendThread::runTimeouts(float dtime)
// do not handle rtt here as we can't decide if this packet was
// lost or really takes more time to transmit
}
+
+ if (retry_count_exceeded) {
+ break; /* no need to check other channels if we already did timeout */
+ }
+
channel->UpdateTimers(dtime,dynamic_cast<UDPPeer*>(&peer)->getLegacyPeer());
}
+ /* skip to next peer if we did timeout */
+ if (retry_count_exceeded)
+ continue;
+
/* send ping if necessary */
if (dynamic_cast<UDPPeer*>(&peer)->Ping(dtime,data)) {
LOG(dout_con<<m_connection->getDesc()
@@ -2167,12 +2187,12 @@ void ConnectionReceiveThread::receive()
throw InvalidIncomingDataException("Channel doesn't exist");
}
- /* preserve original peer_id for later usage */
- u16 packet_peer_id = peer_id;
-
/* Try to identify peer by sender address (may happen on join) */
if (peer_id == PEER_ID_INEXISTENT) {
peer_id = m_connection->lookupPeer(sender);
+ // We do not have to remind the peer of its
+ // peer id as the CONTROLTYPE_SET_PEER_ID
+ // command was sent reliably.
}
/* The peer was not found in our lists. Add it. */
@@ -2214,11 +2234,6 @@ void ConnectionReceiveThread::receive()
}
}
-
- /* mark peer as seen with id */
- if (!(packet_peer_id == PEER_ID_INEXISTENT))
- peer->setSentWithID();
-
peer->ResetTimeout();
Channel *channel = 0;
@@ -2756,7 +2771,7 @@ u16 Connection::lookupPeer(Address& sender)
for(; j != m_peers.end(); ++j)
{
Peer *peer = j->second;
- if (peer->isActive())
+ if (peer->isPendingDeletion())
continue;
Address tocheck;
diff --git a/src/network/connection.h b/src/network/connection.h
index fe2c9819d..5ee53b9d4 100644
--- a/src/network/connection.h
+++ b/src/network/connection.h
@@ -663,8 +663,7 @@ class Peer {
m_last_rtt(-1.0),
m_usage(0),
m_timeout_counter(0.0),
- m_last_timeout_check(porting::getTimeMs()),
- m_has_sent_with_id(false)
+ m_last_timeout_check(porting::getTimeMs())
{
m_rtt.avg_rtt = -1.0;
m_rtt.jitter_avg = -1.0;
@@ -687,21 +686,16 @@ class Peer {
virtual void PutReliableSendCommand(ConnectionCommand &c,
unsigned int max_packet_size) {};
- virtual bool isActive() { return false; };
-
virtual bool getAddress(MTProtocols type, Address& toset) = 0;
+ bool isPendingDeletion()
+ { MutexAutoLock lock(m_exclusive_access_mutex); return m_pending_deletion; };
+
void ResetTimeout()
{MutexAutoLock lock(m_exclusive_access_mutex); m_timeout_counter=0.0; };
bool isTimedOut(float timeout);
- void setSentWithID()
- { MutexAutoLock lock(m_exclusive_access_mutex); m_has_sent_with_id = true; };
-
- bool hasSentWithID()
- { MutexAutoLock lock(m_exclusive_access_mutex); return m_has_sent_with_id; };
-
unsigned int m_increment_packets_remaining;
unsigned int m_increment_bytes_remaining;
@@ -776,8 +770,6 @@ class Peer {
float m_timeout_counter;
u32 m_last_timeout_check;
-
- bool m_has_sent_with_id;
};
class UDPPeer : public Peer
@@ -795,9 +787,6 @@ public:
void PutReliableSendCommand(ConnectionCommand &c,
unsigned int max_packet_size);
- bool isActive()
- { return ((hasSentWithID()) && (!m_pending_deletion)); };
-
bool getAddress(MTProtocols type, Address& toset);
void setNonLegacyPeer();
diff --git a/src/network/networkpacket.h b/src/network/networkpacket.h
index 72f8cabe2..524470999 100644
--- a/src/network/networkpacket.h
+++ b/src/network/networkpacket.h
@@ -40,6 +40,7 @@ public:
u32 getSize() { return m_datasize; }
u16 getPeerId() { return m_peer_id; }
u16 getCommand() { return m_command; }
+ const u32 getRemainingBytes() const { return m_datasize - m_read_offset; }
// Returns a c-string without copying.
// A better name for this would be getRawString()
diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h
index 177b97680..018b392b6 100644
--- a/src/network/networkprotocol.h
+++ b/src/network/networkprotocol.h
@@ -136,9 +136,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
backface_culling: backwards compatibility for playing with
newer client on pre-27 servers.
Add nodedef v3 - connected nodeboxes
+ PROTOCOL_VERSION 28:
+ CPT2_MESHOPTIONS
*/
-#define LATEST_PROTOCOL_VERSION 27
+#define LATEST_PROTOCOL_VERSION 28
// Server's supported network protocol range
#define SERVER_PROTOCOL_VERSION_MIN 13
@@ -474,6 +476,7 @@ enum ToClientCommand
u8 bool vertical
u32 len
u8[len] texture
+ u8 collision_removal
*/
TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
@@ -495,6 +498,7 @@ enum ToClientCommand
u32 len
u8[len] texture
u32 id
+ u8 collision_removal
*/
TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48,
@@ -647,6 +651,8 @@ enum ToServerCommand
[2+12+12] s32 pitch*100
[2+12+12+4] s32 yaw*100
[2+12+12+4+4] u32 keyPressed
+ [2+12+12+4+4+1] u8 fov*80
+ [2+12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE)
*/
TOSERVER_GOTBLOCKS = 0x24,
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index 1bcb78a8a..dca9aabc4 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -774,13 +774,15 @@ void Server::handleCommand_GotBlocks(NetworkPacket* pkt)
}
}
-void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
+void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
+ NetworkPacket *pkt)
{
- if (pkt->getSize() < 12 + 12 + 4 + 4)
+ if (pkt->getRemainingBytes() < 12 + 12 + 4 + 4)
return;
v3s32 ps, ss;
s32 f32pitch, f32yaw;
+ u8 f32fov;
*pkt >> ps;
*pkt >> ss;
@@ -791,8 +793,18 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
f32 yaw = (f32)f32yaw / 100.0;
u32 keyPressed = 0;
- if (pkt->getSize() >= 12 + 12 + 4 + 4 + 4)
+ // default behavior (in case an old client doesn't send these)
+ f32 fov = 0;
+ u8 wanted_range = 0;
+
+ if (pkt->getRemainingBytes() >= 4)
*pkt >> keyPressed;
+ if (pkt->getRemainingBytes() >= 1) {
+ *pkt >> f32fov;
+ fov = (f32)f32fov / 80.0;
+ }
+ if (pkt->getRemainingBytes() >= 1)
+ *pkt >> wanted_range;
v3f position((f32)ps.X / 100.0, (f32)ps.Y / 100.0, (f32)ps.Z / 100.0);
v3f speed((f32)ss.X / 100.0, (f32)ss.Y / 100.0, (f32)ss.Z / 100.0);
@@ -800,7 +812,33 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
pitch = modulo360f(pitch);
yaw = modulo360f(yaw);
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ playersao->setBasePosition(position);
+ player->setSpeed(speed);
+ playersao->setPitch(pitch);
+ playersao->setYaw(yaw);
+ playersao->setFov(fov);
+ playersao->setWantedRange(wanted_range);
+ player->keyPressed = keyPressed;
+ player->control.up = (keyPressed & 1);
+ player->control.down = (keyPressed & 2);
+ player->control.left = (keyPressed & 4);
+ player->control.right = (keyPressed & 8);
+ player->control.jump = (keyPressed & 16);
+ player->control.aux1 = (keyPressed & 32);
+ player->control.sneak = (keyPressed & 64);
+ player->control.LMB = (keyPressed & 128);
+ player->control.RMB = (keyPressed & 256);
+
+ if (playersao->checkMovementCheat()) {
+ // Call callbacks
+ m_script->on_cheat(playersao, "moved_too_fast");
+ SendMovePlayer(pkt->getPeerId());
+ }
+}
+
+void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
+{
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -809,13 +847,6 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
return;
}
- // If player is dead we don't care of this packet
- if (player->isDead()) {
- verbosestream << "TOSERVER_PLAYERPOS: " << player->getName()
- << " is dead. Ignoring packet";
- return;
- }
-
PlayerSAO *playersao = player->getPlayerSAO();
if (playersao == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
@@ -825,26 +856,14 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
return;
}
- player->setPosition(position);
- player->setSpeed(speed);
- player->setPitch(pitch);
- player->setYaw(yaw);
- player->keyPressed = keyPressed;
- player->control.up = (keyPressed & 1);
- player->control.down = (keyPressed & 2);
- player->control.left = (keyPressed & 4);
- player->control.right = (keyPressed & 8);
- player->control.jump = (keyPressed & 16);
- player->control.aux1 = (keyPressed & 32);
- player->control.sneak = (keyPressed & 64);
- player->control.LMB = (keyPressed & 128);
- player->control.RMB = (keyPressed & 256);
-
- if (playersao->checkMovementCheat()) {
- // Call callbacks
- m_script->on_cheat(playersao, "moved_too_fast");
- SendMovePlayer(pkt->getPeerId());
+ // If player is dead we don't care of this packet
+ if (playersao->isDead()) {
+ verbosestream << "TOSERVER_PLAYERPOS: " << player->getName()
+ << " is dead. Ignoring packet";
+ return;
}
+
+ process_PlayerPos(player, playersao, pkt);
}
void Server::handleCommand_DeletedBlocks(NetworkPacket* pkt)
@@ -879,7 +898,8 @@ void Server::handleCommand_DeletedBlocks(NetworkPacket* pkt)
void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
{
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1051,7 +1071,7 @@ void Server::handleCommand_ChatMessage(NetworkPacket* pkt)
message += (wchar_t)tmp_wchar;
}
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1065,7 +1085,7 @@ void Server::handleCommand_ChatMessage(NetworkPacket* pkt)
std::wstring wname = narrow_to_wide(name);
std::wstring answer_to_sender = handleChat(name, wname, message,
- true, pkt->getPeerId());
+ true, dynamic_cast<RemotePlayer *>(player));
if (!answer_to_sender.empty()) {
// Send the answer to sender
SendChatMessage(pkt->getPeerId(), answer_to_sender);
@@ -1078,7 +1098,8 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
*pkt >> damage;
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1098,7 +1119,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
if (g_settings->getBool("enable_damage")) {
actionstream << player->getName() << " damaged by "
- << (int)damage << " hp at " << PP(player->getPosition() / BS)
+ << (int)damage << " hp at " << PP(playersao->getBasePosition() / BS)
<< std::endl;
playersao->setHP(playersao->getHP() - damage);
@@ -1112,7 +1133,8 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
*pkt >> breath;
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1121,16 +1143,6 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
return;
}
- /*
- * If player is dead, we don't need to update the breath
- * He is dead !
- */
- if (player->isDead()) {
- verbosestream << "TOSERVER_BREATH: " << player->getName()
- << " is dead. Ignoring packet";
- return;
- }
-
PlayerSAO *playersao = player->getPlayerSAO();
if (playersao == NULL) {
@@ -1141,6 +1153,16 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
return;
}
+ /*
+ * If player is dead, we don't need to update the breath
+ * He is dead !
+ */
+ if (playersao->isDead()) {
+ verbosestream << "TOSERVER_BREATH: " << player->getName()
+ << " is dead. Ignoring packet";
+ return;
+ }
+
playersao->setBreath(breath);
SendPlayerBreath(pkt->getPeerId());
}
@@ -1176,7 +1198,7 @@ void Server::handleCommand_Password(NetworkPacket* pkt)
newpwd += c;
}
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1224,7 +1246,8 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
if (pkt->getSize() < 2)
return;
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1251,7 +1274,7 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
void Server::handleCommand_Respawn(NetworkPacket* pkt)
{
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1260,13 +1283,16 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)
return;
}
- if (!player->isDead())
+ PlayerSAO *playersao = player->getPlayerSAO();
+ assert(playersao);
+
+ if (!playersao->isDead())
return;
RespawnPlayer(pkt->getPeerId());
actionstream << player->getName() << " respawns at "
- << PP(player->getPosition()/BS) << std::endl;
+ << PP(playersao->getBasePosition() / BS) << std::endl;
// ActiveObject is added to environment in AsyncRunStep after
// the previous addition has been successfully removed
@@ -1274,15 +1300,13 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)
void Server::handleCommand_Interact(NetworkPacket* pkt)
{
- std::string datastring(pkt->getString(0), pkt->getSize());
- std::istringstream is(datastring, std::ios_base::binary);
-
/*
[0] u16 command
[2] u8 action
[3] u16 item
- [5] u32 length of the next item
+ [5] u32 length of the next item (plen)
[9] serialized PointedThing
+ [9 + plen] player position information
actions:
0: start digging (from undersurface) or use
1: stop digging (all parameters ignored)
@@ -1290,16 +1314,19 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
3: place block or item (to abovesurface)
4: use item
*/
- u8 action = readU8(is);
- u16 item_i = readU16(is);
- std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary);
+ u8 action;
+ u16 item_i;
+ *pkt >> action;
+ *pkt >> item_i;
+ std::istringstream tmp_is(pkt->readLongString(), std::ios::binary);
PointedThing pointed;
pointed.deSerialize(tmp_is);
verbosestream << "TOSERVER_INTERACT: action=" << (int)action << ", item="
<< item_i << ", pointed=" << pointed.dump() << std::endl;
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1317,12 +1344,14 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
return;
}
- if (player->isDead()) {
+ if (playersao->isDead()) {
verbosestream << "TOSERVER_INTERACT: " << player->getName()
- << " is dead. Ignoring packet";
+ << " is dead. Ignoring packet";
return;
}
+ process_PlayerPos(player, playersao, pkt);
+
v3f player_pos = playersao->getLastGoodPosition();
// Update wielded item
@@ -1450,7 +1479,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
ToolCapabilities toolcap =
punchitem.getToolCapabilities(m_itemdef);
v3f dir = (pointed_object->getBasePosition() -
- (player->getPosition() + player->getEyeOffset())
+ (playersao->getBasePosition() + playersao->getEyeOffset())
).normalize();
float time_from_last_punch =
playersao->resetTimeFromLastPunch();
@@ -1513,10 +1542,7 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
m_script->on_cheat(playersao, "finished_unknown_dig");
}
// Get player's wielded item
- ItemStack playeritem;
- InventoryList *mlist = playersao->getInventory()->getList("main");
- if (mlist != NULL)
- playeritem = mlist->getItem(playersao->getWieldIndex());
+ ItemStack playeritem = playersao->getWieldedItem();
ToolCapabilities playeritem_toolcap =
playeritem.getToolCapabilities(m_itemdef);
// Get diggability and expected digging time
@@ -1656,16 +1682,16 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
}
} // action == 4
-
+
/*
5: rightclick air
*/
else if (action == 5) {
ItemStack item = playersao->getWieldedItem();
-
- actionstream << player->getName() << " activates "
+
+ actionstream << player->getName() << " activates "
<< item.name << std::endl;
-
+
if (m_script->item_OnSecondaryUse(
item, playersao)) {
if( playersao->setWieldedItem(item)) {
@@ -1693,9 +1719,7 @@ void Server::handleCommand_RemovedSounds(NetworkPacket* pkt)
*pkt >> id;
- std::map<s32, ServerPlayingSound>::iterator i =
- m_playing_sounds.find(id);
-
+ UNORDERED_MAP<s32, ServerPlayingSound>::iterator i = m_playing_sounds.find(id);
if (i == m_playing_sounds.end())
continue;
@@ -1721,7 +1745,8 @@ void Server::handleCommand_NodeMetaFields(NetworkPacket* pkt)
fields[fieldname] = pkt->readLongString();
}
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
@@ -1771,7 +1796,8 @@ void Server::handleCommand_InventoryFields(NetworkPacket* pkt)
fields[fieldname] = pkt->readLongString();
}
- Player *player = m_env->getPlayer(pkt->getPeerId());
+ RemotePlayer *player = m_env->getPlayer(pkt->getPeerId());
+
if (player == NULL) {
errorstream << "Server::ProcessData(): Canceling: "
"No player for peer_id=" << pkt->getPeerId()
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 3a2cb00b1..ccbb42c66 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -247,6 +247,28 @@ static void deSerializeSimpleSoundSpec(SimpleSoundSpec &ss, std::istream &is)
ss.gain = readF1000(is);
}
+void TextureSettings::readSettings()
+{
+ connected_glass = g_settings->getBool("connected_glass");
+ opaque_water = g_settings->getBool("opaque_water");
+ bool enable_shaders = g_settings->getBool("enable_shaders");
+ bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
+ bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion");
+ enable_mesh_cache = g_settings->getBool("enable_mesh_cache");
+ enable_minimap = g_settings->getBool("enable_minimap");
+ std::string leaves_style_str = g_settings->get("leaves_style");
+
+ use_normal_texture = enable_shaders &&
+ (enable_bumpmapping || enable_parallax_occlusion);
+ if (leaves_style_str == "fancy") {
+ leaves_style = LEAVES_FANCY;
+ } else if (leaves_style_str == "simple") {
+ leaves_style = LEAVES_SIMPLE;
+ } else {
+ leaves_style = LEAVES_OPAQUE;
+ }
+}
+
/*
ContentFeatures
*/
@@ -365,7 +387,10 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version) const
writeU8(os, post_effect_color.getGreen());
writeU8(os, post_effect_color.getBlue());
writeU8(os, param_type);
- writeU8(os, param_type_2);
+ if ((protocol_version < 28) && (param_type_2 == CPT2_MESHOPTIONS))
+ writeU8(os, CPT2_NONE);
+ else
+ writeU8(os, param_type_2);
writeU8(os, is_ground_content);
writeU8(os, light_propagates);
writeU8(os, sunlight_propagates);
@@ -457,6 +482,7 @@ void ContentFeatures::deSerialize(std::istream &is)
liquid_viscosity = readU8(is);
liquid_renewable = readU8(is);
light_source = readU8(is);
+ light_source = MYMIN(light_source, LIGHT_MAX);
damage_per_second = readU32(is);
node_box.deSerialize(is);
selection_box.deSerialize(is);
@@ -486,6 +512,254 @@ void ContentFeatures::deSerialize(std::istream &is)
}catch(SerializationError &e) {};
}
+#ifndef SERVER
+void ContentFeatures::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile,
+ TileDef *tiledef, u32 shader_id, bool use_normal_texture,
+ bool backface_culling, u8 alpha, u8 material_type)
+{
+ tile->shader_id = shader_id;
+ tile->texture = tsrc->getTextureForMesh(tiledef->name, &tile->texture_id);
+ tile->alpha = alpha;
+ tile->material_type = material_type;
+
+ // Normal texture and shader flags texture
+ if (use_normal_texture) {
+ tile->normal_texture = tsrc->getNormalTexture(tiledef->name);
+ }
+ tile->flags_texture = tsrc->getShaderFlagsTexture(tile->normal_texture ? true : false);
+
+ // Material flags
+ tile->material_flags = 0;
+ if (backface_culling)
+ tile->material_flags |= MATERIAL_FLAG_BACKFACE_CULLING;
+ if (tiledef->animation.type == TAT_VERTICAL_FRAMES)
+ tile->material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
+ if (tiledef->tileable_horizontal)
+ tile->material_flags |= MATERIAL_FLAG_TILEABLE_HORIZONTAL;
+ if (tiledef->tileable_vertical)
+ tile->material_flags |= MATERIAL_FLAG_TILEABLE_VERTICAL;
+
+ // Animation parameters
+ int frame_count = 1;
+ if (tile->material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) {
+ // Get texture size to determine frame count by aspect ratio
+ v2u32 size = tile->texture->getOriginalSize();
+ int frame_height = (float)size.X /
+ (float)tiledef->animation.aspect_w *
+ (float)tiledef->animation.aspect_h;
+ frame_count = size.Y / frame_height;
+ int frame_length_ms = 1000.0 * tiledef->animation.length / frame_count;
+ tile->animation_frame_count = frame_count;
+ tile->animation_frame_length_ms = frame_length_ms;
+ }
+
+ if (frame_count == 1) {
+ tile->material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
+ } else {
+ std::ostringstream os(std::ios::binary);
+ tile->frames.resize(frame_count);
+
+ for (int i = 0; i < frame_count; i++) {
+
+ FrameSpec frame;
+
+ os.str("");
+ os << tiledef->name << "^[verticalframe:"
+ << frame_count << ":" << i;
+
+ frame.texture = tsrc->getTextureForMesh(os.str(), &frame.texture_id);
+ if (tile->normal_texture)
+ frame.normal_texture = tsrc->getNormalTexture(os.str());
+ frame.flags_texture = tile->flags_texture;
+ tile->frames[i] = frame;
+ }
+ }
+}
+#endif
+
+#ifndef SERVER
+void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc,
+ scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip,
+ IGameDef *gamedef, const TextureSettings &tsettings)
+{
+ // minimap pixel color - the average color of a texture
+ if (tsettings.enable_minimap && tiledef[0].name != "")
+ minimap_color = tsrc->getTextureAverageColor(tiledef[0].name);
+
+ // Figure out the actual tiles to use
+ TileDef tdef[6];
+ for (u32 j = 0; j < 6; j++) {
+ tdef[j] = tiledef[j];
+ if (tdef[j].name == "")
+ tdef[j].name = "unknown_node.png";
+ }
+
+ bool is_liquid = false;
+ bool is_water_surface = false;
+
+ u8 material_type = (alpha == 255) ?
+ TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA;
+
+ switch (drawtype) {
+ default:
+ case NDT_NORMAL:
+ solidness = 2;
+ break;
+ case NDT_AIRLIKE:
+ solidness = 0;
+ break;
+ case NDT_LIQUID:
+ assert(liquid_type == LIQUID_SOURCE);
+ if (tsettings.opaque_water)
+ alpha = 255;
+ solidness = 1;
+ is_liquid = true;
+ break;
+ case NDT_FLOWINGLIQUID:
+ assert(liquid_type == LIQUID_FLOWING);
+ solidness = 0;
+ if (tsettings.opaque_water)
+ alpha = 255;
+ is_liquid = true;
+ break;
+ case NDT_GLASSLIKE:
+ solidness = 0;
+ visual_solidness = 1;
+ break;
+ case NDT_GLASSLIKE_FRAMED:
+ solidness = 0;
+ visual_solidness = 1;
+ break;
+ case NDT_GLASSLIKE_FRAMED_OPTIONAL:
+ solidness = 0;
+ visual_solidness = 1;
+ drawtype = tsettings.connected_glass ? NDT_GLASSLIKE_FRAMED : NDT_GLASSLIKE;
+ break;
+ case NDT_ALLFACES:
+ solidness = 0;
+ visual_solidness = 1;
+ break;
+ case NDT_ALLFACES_OPTIONAL:
+ if (tsettings.leaves_style == LEAVES_FANCY) {
+ drawtype = NDT_ALLFACES;
+ solidness = 0;
+ visual_solidness = 1;
+ } else if (tsettings.leaves_style == LEAVES_SIMPLE) {
+ for (u32 j = 0; j < 6; j++) {
+ if (tiledef_special[j].name != "")
+ tdef[j].name = tiledef_special[j].name;
+ }
+ drawtype = NDT_GLASSLIKE;
+ solidness = 0;
+ visual_solidness = 1;
+ } else {
+ drawtype = NDT_NORMAL;
+ solidness = 2;
+ for (u32 i = 0; i < 6; i++)
+ tdef[i].name += std::string("^[noalpha");
+ }
+ if (waving == 1)
+ material_type = TILE_MATERIAL_WAVING_LEAVES;
+ break;
+ case NDT_PLANTLIKE:
+ solidness = 0;
+ if (waving == 1)
+ material_type = TILE_MATERIAL_WAVING_PLANTS;
+ break;
+ case NDT_FIRELIKE:
+ solidness = 0;
+ break;
+ case NDT_MESH:
+ solidness = 0;
+ break;
+ case NDT_TORCHLIKE:
+ case NDT_SIGNLIKE:
+ case NDT_FENCELIKE:
+ case NDT_RAILLIKE:
+ case NDT_NODEBOX:
+ solidness = 0;
+ break;
+ }
+
+ if (is_liquid) {
+ material_type = (alpha == 255) ?
+ TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
+ if (name == "default:water_source")
+ is_water_surface = true;
+ }
+
+ u32 tile_shader[6];
+ for (u16 j = 0; j < 6; j++) {
+ tile_shader[j] = shdsrc->getShader("nodes_shader",
+ material_type, drawtype);
+ }
+
+ if (is_water_surface) {
+ tile_shader[0] = shdsrc->getShader("water_surface_shader",
+ material_type, drawtype);
+ }
+
+ // Tiles (fill in f->tiles[])
+ for (u16 j = 0; j < 6; j++) {
+ fillTileAttribs(tsrc, &tiles[j], &tdef[j], tile_shader[j],
+ tsettings.use_normal_texture,
+ tiledef[j].backface_culling, alpha, material_type);
+ }
+
+ // Special tiles (fill in f->special_tiles[])
+ for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
+ fillTileAttribs(tsrc, &special_tiles[j], &tiledef_special[j],
+ tile_shader[j], tsettings.use_normal_texture,
+ tiledef_special[j].backface_culling, alpha, material_type);
+ }
+
+ if ((drawtype == NDT_MESH) && (mesh != "")) {
+ // Meshnode drawtype
+ // Read the mesh and apply scale
+ mesh_ptr[0] = gamedef->getMesh(mesh);
+ if (mesh_ptr[0]){
+ v3f scale = v3f(1.0, 1.0, 1.0) * BS * visual_scale;
+ scaleMesh(mesh_ptr[0], scale);
+ recalculateBoundingBox(mesh_ptr[0]);
+ meshmanip->recalculateNormals(mesh_ptr[0], true, false);
+ }
+ } else if ((drawtype == NDT_NODEBOX) &&
+ ((node_box.type == NODEBOX_REGULAR) ||
+ (node_box.type == NODEBOX_FIXED)) &&
+ (!node_box.fixed.empty())) {
+ //Convert regular nodebox nodes to meshnodes
+ //Change the drawtype and apply scale
+ drawtype = NDT_MESH;
+ mesh_ptr[0] = convertNodeboxesToMesh(node_box.fixed);
+ v3f scale = v3f(1.0, 1.0, 1.0) * visual_scale;
+ scaleMesh(mesh_ptr[0], scale);
+ recalculateBoundingBox(mesh_ptr[0]);
+ meshmanip->recalculateNormals(mesh_ptr[0], true, false);
+ }
+
+ //Cache 6dfacedir and wallmounted rotated clones of meshes
+ if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_FACEDIR)) {
+ for (u16 j = 1; j < 24; j++) {
+ mesh_ptr[j] = cloneMesh(mesh_ptr[0]);
+ rotateMeshBy6dFacedir(mesh_ptr[j], j);
+ recalculateBoundingBox(mesh_ptr[j]);
+ meshmanip->recalculateNormals(mesh_ptr[j], true, false);
+ }
+ } else if (tsettings.enable_mesh_cache && mesh_ptr[0] && (param_type_2 == CPT2_WALLMOUNTED)) {
+ static const u8 wm_to_6d[6] = {20, 0, 16+1, 12+3, 8, 4+2};
+ for (u16 j = 1; j < 6; j++) {
+ mesh_ptr[j] = cloneMesh(mesh_ptr[0]);
+ rotateMeshBy6dFacedir(mesh_ptr[j], wm_to_6d[j]);
+ recalculateBoundingBox(mesh_ptr[j]);
+ meshmanip->recalculateNormals(mesh_ptr[j], true, false);
+ }
+ rotateMeshBy6dFacedir(mesh_ptr[0], wm_to_6d[0]);
+ recalculateBoundingBox(mesh_ptr[0]);
+ meshmanip->recalculateNormals(mesh_ptr[0], true, false);
+ }
+}
+#endif
+
/*
CNodeDefManager
*/
@@ -505,6 +779,7 @@ public:
content_t allocateId();
virtual content_t set(const std::string &name, const ContentFeatures &def);
virtual content_t allocateDummy(const std::string &name);
+ virtual void removeNode(const std::string &name);
virtual void updateAliases(IItemDefManager *idef);
virtual void applyTextureOverrides(const std::string &override_filepath);
virtual void updateTextures(IGameDef *gamedef,
@@ -525,11 +800,6 @@ public:
private:
void addNameIdMapping(content_t i, std::string name);
-#ifndef SERVER
- void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
- u32 shader_id, bool use_normal_texture, bool backface_culling,
- u8 alpha, u8 material_type);
-#endif
// Features indexed by id
std::vector<ContentFeatures> m_content_features;
@@ -541,12 +811,12 @@ private:
// item aliases too. Updated by updateAliases()
// Note: Not serialized.
- std::map<std::string, content_t> m_name_id_mapping_with_aliases;
+ UNORDERED_MAP<std::string, content_t> m_name_id_mapping_with_aliases;
// A mapping from groups to a list of content_ts (and their levels)
// that belong to it. Necessary for a direct lookup in getIds().
// Note: Not serialized.
- std::map<std::string, GroupItems> m_group_to_items;
+ UNORDERED_MAP<std::string, GroupItems> m_group_to_items;
// Next possibly free id
content_t m_next_id;
@@ -669,7 +939,7 @@ inline const ContentFeatures& CNodeDefManager::get(const MapNode &n) const
bool CNodeDefManager::getId(const std::string &name, content_t &result) const
{
- std::map<std::string, content_t>::const_iterator
+ UNORDERED_MAP<std::string, content_t>::const_iterator
i = m_name_id_mapping_with_aliases.find(name);
if(i == m_name_id_mapping_with_aliases.end())
return false;
@@ -699,7 +969,7 @@ bool CNodeDefManager::getIds(const std::string &name,
}
std::string group = name.substr(6);
- std::map<std::string, GroupItems>::const_iterator
+ UNORDERED_MAP<std::string, GroupItems>::const_iterator
i = m_group_to_items.find(group);
if (i == m_group_to_items.end())
return true;
@@ -781,7 +1051,7 @@ content_t CNodeDefManager::set(const std::string &name, const ContentFeatures &d
i != def.groups.end(); ++i) {
std::string group_name = i->first;
- std::map<std::string, GroupItems>::iterator
+ UNORDERED_MAP<std::string, GroupItems>::iterator
j = m_group_to_items.find(group_name);
if (j == m_group_to_items.end()) {
m_group_to_items[group_name].push_back(
@@ -804,6 +1074,40 @@ content_t CNodeDefManager::allocateDummy(const std::string &name)
}
+void CNodeDefManager::removeNode(const std::string &name)
+{
+ // Pre-condition
+ assert(name != "");
+
+ // Erase name from name ID mapping
+ content_t id = CONTENT_IGNORE;
+ if (m_name_id_mapping.getId(name, id)) {
+ m_name_id_mapping.eraseName(name);
+ m_name_id_mapping_with_aliases.erase(name);
+ }
+
+ // Erase node content from all groups it belongs to
+ for (UNORDERED_MAP<std::string, GroupItems>::iterator iter_groups =
+ m_group_to_items.begin();
+ iter_groups != m_group_to_items.end();) {
+ GroupItems &items = iter_groups->second;
+ for (GroupItems::iterator iter_groupitems = items.begin();
+ iter_groupitems != items.end();) {
+ if (iter_groupitems->first == id)
+ items.erase(iter_groupitems++);
+ else
+ iter_groupitems++;
+ }
+
+ // Check if group is empty
+ if (items.size() == 0)
+ m_group_to_items.erase(iter_groups++);
+ else
+ iter_groups++;
+ }
+}
+
+
void CNodeDefManager::updateAliases(IItemDefManager *idef)
{
std::set<std::string> all = idef->getAll();
@@ -841,13 +1145,8 @@ void CNodeDefManager::applyTextureOverrides(const std::string &override_filepath
}
content_t id;
- if (!getId(splitted[0], id)) {
- errorstream << override_filepath
- << ":" << line_c << " Could not apply texture override \""
- << line << "\": Unknown node \""
- << splitted[0] << "\"" << std::endl;
- continue;
- }
+ if (!getId(splitted[0], id))
+ continue; // Ignore unknown node
ContentFeatures &nodedef = m_content_features[id];
@@ -890,271 +1189,18 @@ void CNodeDefManager::updateTextures(IGameDef *gamedef,
IShaderSource *shdsrc = gamedef->getShaderSource();
scene::ISceneManager* smgr = gamedef->getSceneManager();
scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
-
- bool connected_glass = g_settings->getBool("connected_glass");
- bool opaque_water = g_settings->getBool("opaque_water");
- bool enable_shaders = g_settings->getBool("enable_shaders");
- bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
- bool enable_parallax_occlusion = g_settings->getBool("enable_parallax_occlusion");
- bool enable_mesh_cache = g_settings->getBool("enable_mesh_cache");
- bool enable_minimap = g_settings->getBool("enable_minimap");
- std::string leaves_style = g_settings->get("leaves_style");
-
- bool use_normal_texture = enable_shaders &&
- (enable_bumpmapping || enable_parallax_occlusion);
+ TextureSettings tsettings;
+ tsettings.readSettings();
u32 size = m_content_features.size();
for (u32 i = 0; i < size; i++) {
- ContentFeatures *f = &m_content_features[i];
-
- // minimap pixel color - the average color of a texture
- if (enable_minimap && f->tiledef[0].name != "")
- f->minimap_color = tsrc->getTextureAverageColor(f->tiledef[0].name);
-
- // Figure out the actual tiles to use
- TileDef tiledef[6];
- for (u32 j = 0; j < 6; j++) {
- tiledef[j] = f->tiledef[j];
- if (tiledef[j].name == "")
- tiledef[j].name = "unknown_node.png";
- }
-
- bool is_liquid = false;
- bool is_water_surface = false;
-
- u8 material_type = (f->alpha == 255) ?
- TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA;
-
- switch (f->drawtype) {
- default:
- case NDT_NORMAL:
- f->solidness = 2;
- break;
- case NDT_AIRLIKE:
- f->solidness = 0;
- break;
- case NDT_LIQUID:
- assert(f->liquid_type == LIQUID_SOURCE);
- if (opaque_water)
- f->alpha = 255;
- f->solidness = 1;
- is_liquid = true;
- break;
- case NDT_FLOWINGLIQUID:
- assert(f->liquid_type == LIQUID_FLOWING);
- f->solidness = 0;
- if (opaque_water)
- f->alpha = 255;
- is_liquid = true;
- break;
- case NDT_GLASSLIKE:
- f->solidness = 0;
- f->visual_solidness = 1;
- break;
- case NDT_GLASSLIKE_FRAMED:
- f->solidness = 0;
- f->visual_solidness = 1;
- break;
- case NDT_GLASSLIKE_FRAMED_OPTIONAL:
- f->solidness = 0;
- f->visual_solidness = 1;
- f->drawtype = connected_glass ? NDT_GLASSLIKE_FRAMED : NDT_GLASSLIKE;
- break;
- case NDT_ALLFACES:
- f->solidness = 0;
- f->visual_solidness = 1;
- break;
- case NDT_ALLFACES_OPTIONAL:
- if (leaves_style == "fancy") {
- f->drawtype = NDT_ALLFACES;
- f->solidness = 0;
- f->visual_solidness = 1;
- } else if (leaves_style == "simple") {
- for (u32 j = 0; j < 6; j++) {
- if (f->tiledef_special[j].name != "")
- tiledef[j].name = f->tiledef_special[j].name;
- }
- f->drawtype = NDT_GLASSLIKE;
- f->solidness = 0;
- f->visual_solidness = 1;
- } else {
- f->drawtype = NDT_NORMAL;
- f->solidness = 2;
- for (u32 i = 0; i < 6; i++)
- tiledef[i].name += std::string("^[noalpha");
- }
- if (f->waving == 1)
- material_type = TILE_MATERIAL_WAVING_LEAVES;
- break;
- case NDT_PLANTLIKE:
- f->solidness = 0;
- if (f->waving == 1)
- material_type = TILE_MATERIAL_WAVING_PLANTS;
- break;
- case NDT_FIRELIKE:
- f->solidness = 0;
- break;
- case NDT_MESH:
- f->solidness = 0;
- break;
- case NDT_TORCHLIKE:
- case NDT_SIGNLIKE:
- case NDT_FENCELIKE:
- case NDT_RAILLIKE:
- case NDT_NODEBOX:
- f->solidness = 0;
- break;
- }
-
- if (is_liquid) {
- material_type = (f->alpha == 255) ?
- TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
- if (f->name == "default:water_source")
- is_water_surface = true;
- }
-
- u32 tile_shader[6];
- for (u16 j = 0; j < 6; j++) {
- tile_shader[j] = shdsrc->getShader("nodes_shader",
- material_type, f->drawtype);
- }
-
- if (is_water_surface) {
- tile_shader[0] = shdsrc->getShader("water_surface_shader",
- material_type, f->drawtype);
- }
-
- // Tiles (fill in f->tiles[])
- for (u16 j = 0; j < 6; j++) {
- fillTileAttribs(tsrc, &f->tiles[j], &tiledef[j], tile_shader[j],
- use_normal_texture, f->tiledef[j].backface_culling, f->alpha, material_type);
- }
-
- // Special tiles (fill in f->special_tiles[])
- for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
- fillTileAttribs(tsrc, &f->special_tiles[j], &f->tiledef_special[j],
- tile_shader[j], use_normal_texture,
- f->tiledef_special[j].backface_culling, f->alpha, material_type);
- }
-
- if ((f->drawtype == NDT_MESH) && (f->mesh != "")) {
- // Meshnode drawtype
- // Read the mesh and apply scale
- f->mesh_ptr[0] = gamedef->getMesh(f->mesh);
- if (f->mesh_ptr[0]){
- v3f scale = v3f(1.0, 1.0, 1.0) * BS * f->visual_scale;
- scaleMesh(f->mesh_ptr[0], scale);
- recalculateBoundingBox(f->mesh_ptr[0]);
- meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
- }
- } else if ((f->drawtype == NDT_NODEBOX) &&
- ((f->node_box.type == NODEBOX_REGULAR) ||
- (f->node_box.type == NODEBOX_FIXED)) &&
- (!f->node_box.fixed.empty())) {
- //Convert regular nodebox nodes to meshnodes
- //Change the drawtype and apply scale
- f->drawtype = NDT_MESH;
- f->mesh_ptr[0] = convertNodeboxesToMesh(f->node_box.fixed);
- v3f scale = v3f(1.0, 1.0, 1.0) * f->visual_scale;
- scaleMesh(f->mesh_ptr[0], scale);
- recalculateBoundingBox(f->mesh_ptr[0]);
- meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
- }
-
- //Cache 6dfacedir and wallmounted rotated clones of meshes
- if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_FACEDIR)) {
- for (u16 j = 1; j < 24; j++) {
- f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
- rotateMeshBy6dFacedir(f->mesh_ptr[j], j);
- recalculateBoundingBox(f->mesh_ptr[j]);
- meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
- }
- } else if (enable_mesh_cache && f->mesh_ptr[0] && (f->param_type_2 == CPT2_WALLMOUNTED)) {
- static const u8 wm_to_6d[6] = {20, 0, 16+1, 12+3, 8, 4+2};
- for (u16 j = 1; j < 6; j++) {
- f->mesh_ptr[j] = cloneMesh(f->mesh_ptr[0]);
- rotateMeshBy6dFacedir(f->mesh_ptr[j], wm_to_6d[j]);
- recalculateBoundingBox(f->mesh_ptr[j]);
- meshmanip->recalculateNormals(f->mesh_ptr[j], true, false);
- }
- rotateMeshBy6dFacedir(f->mesh_ptr[0], wm_to_6d[0]);
- recalculateBoundingBox(f->mesh_ptr[0]);
- meshmanip->recalculateNormals(f->mesh_ptr[0], true, false);
- }
-
+ m_content_features[i].updateTextures(tsrc, shdsrc, smgr, meshmanip, gamedef, tsettings);
progress_callback(progress_callback_args, i, size);
}
#endif
}
-
-#ifndef SERVER
-void CNodeDefManager::fillTileAttribs(ITextureSource *tsrc, TileSpec *tile,
- TileDef *tiledef, u32 shader_id, bool use_normal_texture,
- bool backface_culling, u8 alpha, u8 material_type)
-{
- tile->shader_id = shader_id;
- tile->texture = tsrc->getTextureForMesh(tiledef->name, &tile->texture_id);
- tile->alpha = alpha;
- tile->material_type = material_type;
-
- // Normal texture and shader flags texture
- if (use_normal_texture) {
- tile->normal_texture = tsrc->getNormalTexture(tiledef->name);
- }
- tile->flags_texture = tsrc->getShaderFlagsTexture(tile->normal_texture ? true : false);
-
- // Material flags
- tile->material_flags = 0;
- if (backface_culling)
- tile->material_flags |= MATERIAL_FLAG_BACKFACE_CULLING;
- if (tiledef->animation.type == TAT_VERTICAL_FRAMES)
- tile->material_flags |= MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
- if (tiledef->tileable_horizontal)
- tile->material_flags |= MATERIAL_FLAG_TILEABLE_HORIZONTAL;
- if (tiledef->tileable_vertical)
- tile->material_flags |= MATERIAL_FLAG_TILEABLE_VERTICAL;
-
- // Animation parameters
- int frame_count = 1;
- if (tile->material_flags & MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES) {
- // Get texture size to determine frame count by aspect ratio
- v2u32 size = tile->texture->getOriginalSize();
- int frame_height = (float)size.X /
- (float)tiledef->animation.aspect_w *
- (float)tiledef->animation.aspect_h;
- frame_count = size.Y / frame_height;
- int frame_length_ms = 1000.0 * tiledef->animation.length / frame_count;
- tile->animation_frame_count = frame_count;
- tile->animation_frame_length_ms = frame_length_ms;
- }
-
- if (frame_count == 1) {
- tile->material_flags &= ~MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES;
- } else {
- std::ostringstream os(std::ios::binary);
- tile->frames.resize(frame_count);
-
- for (int i = 0; i < frame_count; i++) {
-
- FrameSpec frame;
-
- os.str("");
- os << tiledef->name << "^[verticalframe:"
- << frame_count << ":" << i;
-
- frame.texture = tsrc->getTextureForMesh(os.str(), &frame.texture_id);
- if (tile->normal_texture)
- frame.normal_texture = tsrc->getNormalTexture(os.str());
- frame.flags_texture = tile->flags_texture;
- tile->frames[i] = frame;
- }
- }
-}
-#endif
-
-
void CNodeDefManager::serialize(std::ostream &os, u16 protocol_version) const
{
writeU8(os, 1); // version
@@ -1397,6 +1443,7 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
liquid_alternative_source = deSerializeString(is);
liquid_viscosity = readU8(is);
light_source = readU8(is);
+ light_source = MYMIN(light_source, LIGHT_MAX);
damage_per_second = readU32(is);
node_box.deSerialize(is);
selection_box.deSerialize(is);
diff --git a/src/nodedef.h b/src/nodedef.h
index 58d0faffa..80396f992 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -65,6 +65,8 @@ enum ContentParamType2
CPT2_LEVELED,
// 2D rotation for things like plants
CPT2_DEGROTATE,
+ // Mesh options for plants
+ CPT2_MESHOPTIONS
};
enum LiquidType
@@ -112,6 +114,26 @@ struct NodeBox
struct MapNode;
class NodeMetadata;
+enum LeavesStyle {
+ LEAVES_FANCY,
+ LEAVES_SIMPLE,
+ LEAVES_OPAQUE,
+};
+
+class TextureSettings {
+public:
+ LeavesStyle leaves_style;
+ bool opaque_water;
+ bool connected_glass;
+ bool use_normal_texture;
+ bool enable_mesh_cache;
+ bool enable_minimap;
+
+ TextureSettings() {}
+
+ void readSettings();
+};
+
enum NodeDrawType
{
NDT_NORMAL, // A basic solid block
@@ -304,6 +326,15 @@ struct ContentFeatures
if(!isLiquid() || !f.isLiquid()) return false;
return (liquid_alternative_flowing == f.liquid_alternative_flowing);
}
+
+#ifndef SERVER
+ void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
+ u32 shader_id, bool use_normal_texture, bool backface_culling,
+ u8 alpha, u8 material_type);
+ void updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc,
+ scene::ISceneManager *smgr, scene::IMeshManipulator *meshmanip,
+ IGameDef *gamedef, const TextureSettings &tsettings);
+#endif
};
class INodeDefManager {
@@ -353,6 +384,8 @@ public:
const ContentFeatures &def)=0;
// If returns CONTENT_IGNORE, could not allocate id
virtual content_t allocateDummy(const std::string &name)=0;
+ // Remove a node
+ virtual void removeNode(const std::string &name)=0;
/*
Update item alias mapping.
diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp
index 126889ecf..0801a028b 100644
--- a/src/nodemetadata.cpp
+++ b/src/nodemetadata.cpp
@@ -74,6 +74,11 @@ void NodeMetadata::clear()
m_inventory->clear();
}
+bool NodeMetadata::empty() const
+{
+ return m_stringvars.size() == 0 && m_inventory->getLists().size() == 0;
+}
+
/*
NodeMetadataList
*/
@@ -84,14 +89,13 @@ void NodeMetadataList::serialize(std::ostream &os) const
Version 0 is a placeholder for "nothing to see here; go away."
*/
- if(m_data.empty()){
+ u16 count = countNonEmpty();
+ if (count == 0) {
writeU8(os, 0); // version
return;
}
writeU8(os, 1); // version
-
- u16 count = m_data.size();
writeU16(os, count);
for(std::map<v3s16, NodeMetadata*>::const_iterator
@@ -100,6 +104,8 @@ void NodeMetadataList::serialize(std::ostream &os) const
{
v3s16 p = i->first;
NodeMetadata *data = i->second;
+ if (data->empty())
+ continue;
u16 p16 = p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE + p.Y * MAP_BLOCKSIZE + p.X;
writeU16(os, p16);
@@ -200,6 +206,17 @@ void NodeMetadataList::clear()
m_data.clear();
}
+int NodeMetadataList::countNonEmpty() const
+{
+ int n = 0;
+ std::map<v3s16, NodeMetadata*>::const_iterator it;
+ for (it = m_data.begin(); it != m_data.end(); ++it) {
+ if (!it->second->empty())
+ n++;
+ }
+ return n;
+}
+
std::string NodeMetadata::getString(const std::string &name,
unsigned short recursion) const
{
diff --git a/src/nodemetadata.h b/src/nodemetadata.h
index 8d1298212..da1bf595d 100644
--- a/src/nodemetadata.h
+++ b/src/nodemetadata.h
@@ -47,6 +47,7 @@ public:
void deSerialize(std::istream &is);
void clear();
+ bool empty() const;
// Generic key/value store
std::string getString(const std::string &name, unsigned short recursion = 0) const;
@@ -94,6 +95,8 @@ public:
void clear();
private:
+ int countNonEmpty() const;
+
std::map<v3s16, NodeMetadata *> m_data;
};
diff --git a/src/nodetimer.cpp b/src/nodetimer.cpp
index 350940546..003d08782 100644
--- a/src/nodetimer.cpp
+++ b/src/nodetimer.cpp
@@ -47,36 +47,38 @@ void NodeTimerList::serialize(std::ostream &os, u8 map_format_version) const
{
if (map_format_version == 24) {
// Version 0 is a placeholder for "nothing to see here; go away."
- if (m_data.empty()) {
+ if (m_timers.empty()) {
writeU8(os, 0); // version
return;
}
writeU8(os, 1); // version
- writeU16(os, m_data.size());
+ writeU16(os, m_timers.size());
}
if (map_format_version >= 25) {
writeU8(os, 2 + 4 + 4); // length of the data for a single timer
- writeU16(os, m_data.size());
+ writeU16(os, m_timers.size());
}
- for (std::map<v3s16, NodeTimer>::const_iterator
- i = m_data.begin();
- i != m_data.end(); ++i) {
- v3s16 p = i->first;
+ for (std::multimap<double, NodeTimer>::const_iterator
+ i = m_timers.begin();
+ i != m_timers.end(); ++i) {
NodeTimer t = i->second;
+ NodeTimer nt = NodeTimer(t.timeout,
+ t.timeout - (f32)(i->first - m_time), t.position);
+ v3s16 p = t.position;
u16 p16 = p.Z * MAP_BLOCKSIZE * MAP_BLOCKSIZE + p.Y * MAP_BLOCKSIZE + p.X;
writeU16(os, p16);
- t.serialize(os);
+ nt.serialize(os);
}
}
void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
{
- m_data.clear();
+ clear();
- if(map_format_version == 24){
+ if (map_format_version == 24) {
u8 timer_version = readU8(is);
if(timer_version == 0)
return;
@@ -84,7 +86,7 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
throw SerializationError("unsupported NodeTimerList version");
}
- if(map_format_version >= 25){
+ if (map_format_version >= 25) {
u8 timer_data_len = readU8(is);
if(timer_data_len != 2+4+4)
throw SerializationError("unsupported NodeTimer data length");
@@ -92,8 +94,7 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
u16 count = readU16(is);
- for(u16 i=0; i<count; i++)
- {
+ for (u16 i = 0; i < count; i++) {
u16 p16 = readU16(is);
v3s16 p;
@@ -103,11 +104,10 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
p16 &= MAP_BLOCKSIZE - 1;
p.X = p16;
- NodeTimer t;
+ NodeTimer t(p);
t.deSerialize(is);
- if(t.timeout <= 0)
- {
+ if (t.timeout <= 0) {
warningstream<<"NodeTimerList::deSerialize(): "
<<"invalid data at position"
<<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring."
@@ -115,8 +115,7 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
continue;
}
- if(m_data.find(p) != m_data.end())
- {
+ if (m_iterators.find(p) != m_iterators.end()) {
warningstream<<"NodeTimerList::deSerialize(): "
<<"already set data at position"
<<"("<<p.X<<","<<p.Y<<","<<p.Z<<"): Ignoring."
@@ -124,31 +123,30 @@ void NodeTimerList::deSerialize(std::istream &is, u8 map_format_version)
continue;
}
- m_data.insert(std::make_pair(p, t));
+ insert(t);
}
}
-std::map<v3s16, NodeTimer> NodeTimerList::step(float dtime)
+std::vector<NodeTimer> NodeTimerList::step(float dtime)
{
- std::map<v3s16, NodeTimer> elapsed_timers;
- // Increment timers
- for(std::map<v3s16, NodeTimer>::iterator
- i = m_data.begin();
- i != m_data.end(); ++i){
- v3s16 p = i->first;
+ std::vector<NodeTimer> elapsed_timers;
+ m_time += dtime;
+ if (m_next_trigger_time == -1. || m_time < m_next_trigger_time) {
+ return elapsed_timers;
+ }
+ std::multimap<double, NodeTimer>::iterator i = m_timers.begin();
+ // Process timers
+ for (; i != m_timers.end() && i->first <= m_time; ++i) {
NodeTimer t = i->second;
- t.elapsed += dtime;
- if(t.elapsed >= t.timeout)
- elapsed_timers.insert(std::make_pair(p, t));
- else
- i->second = t;
+ t.elapsed = t.timeout + (f32)(m_time - i->first);
+ elapsed_timers.push_back(t);
+ m_iterators.erase(t.position);
}
// Delete elapsed timers
- for(std::map<v3s16, NodeTimer>::const_iterator
- i = elapsed_timers.begin();
- i != elapsed_timers.end(); ++i){
- v3s16 p = i->first;
- m_data.erase(p);
- }
+ m_timers.erase(m_timers.begin(), i);
+ if (m_timers.empty())
+ m_next_trigger_time = -1.;
+ else
+ m_next_trigger_time = m_timers.begin()->first;
return elapsed_timers;
}
diff --git a/src/nodetimer.h b/src/nodetimer.h
index 9fb56edec..0fd43b2a8 100644
--- a/src/nodetimer.h
+++ b/src/nodetimer.h
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irr_v3d.h"
#include <iostream>
#include <map>
+#include <vector>
/*
NodeTimer provides per-node timed callback functionality.
@@ -36,8 +37,10 @@ class NodeTimer
{
public:
NodeTimer(): timeout(0.), elapsed(0.) {}
- NodeTimer(f32 timeout_, f32 elapsed_):
- timeout(timeout_), elapsed(elapsed_) {}
+ NodeTimer(const v3s16 &position_):
+ timeout(0.), elapsed(0.), position(position_) {}
+ NodeTimer(f32 timeout_, f32 elapsed_, v3s16 position_):
+ timeout(timeout_), elapsed(elapsed_), position(position_) {}
~NodeTimer() {}
void serialize(std::ostream &os) const;
@@ -45,6 +48,7 @@ public:
f32 timeout;
f32 elapsed;
+ v3s16 position;
};
/*
@@ -54,37 +58,78 @@ public:
class NodeTimerList
{
public:
- NodeTimerList() {}
+ NodeTimerList(): m_next_trigger_time(-1.), m_time(0.) {}
~NodeTimerList() {}
void serialize(std::ostream &os, u8 map_format_version) const;
void deSerialize(std::istream &is, u8 map_format_version);
// Get timer
- NodeTimer get(v3s16 p){
- std::map<v3s16, NodeTimer>::iterator n = m_data.find(p);
- if(n == m_data.end())
+ NodeTimer get(const v3s16 &p) {
+ std::map<v3s16, std::multimap<double, NodeTimer>::iterator>::iterator n =
+ m_iterators.find(p);
+ if (n == m_iterators.end())
return NodeTimer();
- return n->second;
+ NodeTimer t = n->second->second;
+ t.elapsed = t.timeout - (n->second->first - m_time);
+ return t;
}
// Deletes timer
- void remove(v3s16 p){
- m_data.erase(p);
+ void remove(v3s16 p) {
+ std::map<v3s16, std::multimap<double, NodeTimer>::iterator>::iterator n =
+ m_iterators.find(p);
+ if(n != m_iterators.end()) {
+ double removed_time = n->second->first;
+ m_timers.erase(n->second);
+ m_iterators.erase(n);
+ // Yes, this is float equality, but it is not a problem
+ // since we only test equality of floats as an ordered type
+ // and thus we never lose precision
+ if (removed_time == m_next_trigger_time) {
+ if (m_timers.empty())
+ m_next_trigger_time = -1.;
+ else
+ m_next_trigger_time = m_timers.begin()->first;
+ }
+ }
+ }
+ // Undefined behaviour if there already is a timer
+ void insert(NodeTimer timer) {
+ v3s16 p = timer.position;
+ double trigger_time = m_time + (double)(timer.timeout - timer.elapsed);
+ std::multimap<double, NodeTimer>::iterator it =
+ m_timers.insert(std::pair<double, NodeTimer>(
+ trigger_time, timer
+ ));
+ m_iterators.insert(
+ std::pair<v3s16, std::multimap<double, NodeTimer>::iterator>(p, it));
+ if (m_next_trigger_time == -1. || trigger_time < m_next_trigger_time)
+ m_next_trigger_time = trigger_time;
}
// Deletes old timer and sets a new one
- void set(v3s16 p, NodeTimer t){
- m_data[p] = t;
+ inline void set(const NodeTimer &timer) {
+ remove(timer.position);
+ insert(timer);
}
// Deletes all timers
- void clear(){
- m_data.clear();
+ void clear() {
+ m_timers.clear();
+ m_iterators.clear();
+ m_next_trigger_time = -1.;
+ }
+
+ inline double getNextTriggerTime() {
+ return m_next_trigger_time;
}
- // A step in time. Returns map of elapsed timers.
- std::map<v3s16, NodeTimer> step(float dtime);
+ // Move forward in time, returns elapsed timers
+ std::vector<NodeTimer> step(float dtime);
private:
- std::map<v3s16, NodeTimer> m_data;
+ std::multimap<double, NodeTimer> m_timers;
+ std::map<v3s16, std::multimap<double, NodeTimer>::iterator> m_iterators;
+ double m_next_trigger_time;
+ double m_time;
};
#endif
diff --git a/src/noise.cpp b/src/noise.cpp
index 2ddc3926f..b918c9936 100644
--- a/src/noise.cpp
+++ b/src/noise.cpp
@@ -93,22 +93,31 @@ u32 PcgRandom::range(u32 bound)
// If the bound is 0, we cover the whole RNG's range
if (bound == 0)
return next();
+
/*
- If the bound is not a multiple of the RNG's range, it may cause bias,
- e.g. a RNG has a range from 0 to 3 and we take want a number 0 to 2.
- Using rand() % 3, the number 0 would be twice as likely to appear.
- With a very large RNG range, the effect becomes less prevalent but
- still present. This can be solved by modifying the range of the RNG
- to become a multiple of bound by dropping values above the a threshold.
- In our example, threshold == 4 - 3 = 1 % 3 == 1, so reject 0, thus
- making the range 3 with no bias.
-
- This loop looks dangerous, but will always terminate due to the
- RNG's property of uniformity.
+ This is an optimization of the expression:
+ 0x100000000ull % bound
+ since 64-bit modulo operations typically much slower than 32.
*/
u32 threshold = -bound % bound;
u32 r;
+ /*
+ If the bound is not a multiple of the RNG's range, it may cause bias,
+ e.g. a RNG has a range from 0 to 3 and we take want a number 0 to 2.
+ Using rand() % 3, the number 0 would be twice as likely to appear.
+ With a very large RNG range, the effect becomes less prevalent but
+ still present.
+
+ This can be solved by modifying the range of the RNG to become a
+ multiple of bound by dropping values above the a threshold.
+
+ In our example, threshold == 4 % 3 == 1, so reject values < 1
+ (that is, 0), thus making the range == 3 with no bias.
+
+ This loop may look dangerous, but will always terminate due to the
+ RNG's property of uniformity.
+ */
while ((r = next()) < threshold)
;
@@ -156,7 +165,7 @@ s32 PcgRandom::randNormalDist(s32 min, s32 max, int num_trials)
///////////////////////////////////////////////////////////////////////////////
-float noise2d(int x, int y, int seed)
+float noise2d(int x, int y, s32 seed)
{
unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y
+ NOISE_MAGIC_SEED * seed) & 0x7fffffff;
@@ -166,7 +175,7 @@ float noise2d(int x, int y, int seed)
}
-float noise3d(int x, int y, int z, int seed)
+float noise3d(int x, int y, int z, s32 seed)
{
unsigned int n = (NOISE_MAGIC_X * x + NOISE_MAGIC_Y * y + NOISE_MAGIC_Z * z
+ NOISE_MAGIC_SEED * seed) & 0x7fffffff;
@@ -235,7 +244,7 @@ float triLinearInterpolationNoEase(
return linearInterpolation(u, v, z);
}
-float noise2d_gradient(float x, float y, int seed, bool eased)
+float noise2d_gradient(float x, float y, s32 seed, bool eased)
{
// Calculate the integer coordinates
int x0 = myfloor(x);
@@ -256,7 +265,7 @@ float noise2d_gradient(float x, float y, int seed, bool eased)
}
-float noise3d_gradient(float x, float y, float z, int seed, bool eased)
+float noise3d_gradient(float x, float y, float z, s32 seed, bool eased)
{
// Calculate the integer coordinates
int x0 = myfloor(x);
@@ -290,7 +299,7 @@ float noise3d_gradient(float x, float y, float z, int seed, bool eased)
}
-float noise2d_perlin(float x, float y, int seed,
+float noise2d_perlin(float x, float y, s32 seed,
int octaves, float persistence, bool eased)
{
float a = 0;
@@ -306,7 +315,7 @@ float noise2d_perlin(float x, float y, int seed,
}
-float noise2d_perlin_abs(float x, float y, int seed,
+float noise2d_perlin_abs(float x, float y, s32 seed,
int octaves, float persistence, bool eased)
{
float a = 0;
@@ -321,7 +330,7 @@ float noise2d_perlin_abs(float x, float y, int seed,
}
-float noise3d_perlin(float x, float y, float z, int seed,
+float noise3d_perlin(float x, float y, float z, s32 seed,
int octaves, float persistence, bool eased)
{
float a = 0;
@@ -336,7 +345,7 @@ float noise3d_perlin(float x, float y, float z, int seed,
}
-float noise3d_perlin_abs(float x, float y, float z, int seed,
+float noise3d_perlin_abs(float x, float y, float z, s32 seed,
int octaves, float persistence, bool eased)
{
float a = 0;
@@ -363,7 +372,7 @@ float contour(float v)
///////////////////////// [ New noise ] ////////////////////////////
-float NoisePerlin2D(NoiseParams *np, float x, float y, int seed)
+float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed)
{
float a = 0;
float f = 1.0;
@@ -389,7 +398,7 @@ float NoisePerlin2D(NoiseParams *np, float x, float y, int seed)
}
-float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed)
+float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed)
{
float a = 0;
float f = 1.0;
@@ -416,7 +425,7 @@ float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed)
}
-Noise::Noise(NoiseParams *np_, int seed, u32 sx, u32 sy, u32 sz)
+Noise::Noise(NoiseParams *np_, s32 seed, u32 sx, u32 sy, u32 sz)
{
memcpy(&np, np_, sizeof(np));
this->seed = seed;
@@ -543,7 +552,7 @@ void Noise::resizeNoiseBuf(bool is3d)
void Noise::gradientMap2D(
float x, float y,
float step_x, float step_y,
- int seed)
+ s32 seed)
{
float v00, v01, v10, v11, u, v, orig_u;
u32 index, i, j, noisex, noisey;
@@ -607,7 +616,7 @@ void Noise::gradientMap2D(
void Noise::gradientMap3D(
float x, float y, float z,
float step_x, float step_y, float step_z,
- int seed)
+ s32 seed)
{
float v000, v010, v100, v110;
float v001, v011, v101, v111;
diff --git a/src/noise.h b/src/noise.h
index 0e4252dd4..41b93ae01 100644
--- a/src/noise.h
+++ b/src/noise.h
@@ -148,7 +148,7 @@ struct NoiseParams {
class Noise {
public:
NoiseParams np;
- int seed;
+ s32 seed;
u32 sx;
u32 sy;
u32 sz;
@@ -157,7 +157,7 @@ public:
float *persist_buf;
float *result;
- Noise(NoiseParams *np, int seed, u32 sx, u32 sy, u32 sz=1);
+ Noise(NoiseParams *np, s32 seed, u32 sx, u32 sy, u32 sz=1);
~Noise();
void setSize(u32 sx, u32 sy, u32 sz=1);
@@ -167,11 +167,11 @@ public:
void gradientMap2D(
float x, float y,
float step_x, float step_y,
- int seed);
+ s32 seed);
void gradientMap3D(
float x, float y, float z,
float step_x, float step_y, float step_z,
- int seed);
+ s32 seed);
float *perlinMap2D(float x, float y, float *persistence_map=NULL);
float *perlinMap3D(float x, float y, float z, float *persistence_map=NULL);
@@ -202,11 +202,11 @@ private:
};
-float NoisePerlin2D(NoiseParams *np, float x, float y, int seed);
-float NoisePerlin3D(NoiseParams *np, float x, float y, float z, int seed);
+float NoisePerlin2D(NoiseParams *np, float x, float y, s32 seed);
+float NoisePerlin3D(NoiseParams *np, float x, float y, float z, s32 seed);
inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff,
- float y, float yoff, int seed)
+ float y, float yoff, s32 seed)
{
return NoisePerlin2D(np,
x + xoff * np->spread.X,
@@ -215,7 +215,7 @@ inline float NoisePerlin2D_PO(NoiseParams *np, float x, float xoff,
}
inline float NoisePerlin3D_PO(NoiseParams *np, float x, float xoff,
- float y, float yoff, float z, float zoff, int seed)
+ float y, float yoff, float z, float zoff, s32 seed)
{
return NoisePerlin3D(np,
x + xoff * np->spread.X,
@@ -225,22 +225,22 @@ inline float NoisePerlin3D_PO(NoiseParams *np, float x, float xoff,
}
// Return value: -1 ... 1
-float noise2d(int x, int y, int seed);
-float noise3d(int x, int y, int z, int seed);
+float noise2d(int x, int y, s32 seed);
+float noise3d(int x, int y, int z, s32 seed);
-float noise2d_gradient(float x, float y, int seed, bool eased=true);
-float noise3d_gradient(float x, float y, float z, int seed, bool eased=false);
+float noise2d_gradient(float x, float y, s32 seed, bool eased=true);
+float noise3d_gradient(float x, float y, float z, s32 seed, bool eased=false);
-float noise2d_perlin(float x, float y, int seed,
+float noise2d_perlin(float x, float y, s32 seed,
int octaves, float persistence, bool eased=true);
-float noise2d_perlin_abs(float x, float y, int seed,
+float noise2d_perlin_abs(float x, float y, s32 seed,
int octaves, float persistence, bool eased=true);
-float noise3d_perlin(float x, float y, float z, int seed,
+float noise3d_perlin(float x, float y, float z, s32 seed,
int octaves, float persistence, bool eased=false);
-float noise3d_perlin_abs(float x, float y, float z, int seed,
+float noise3d_perlin_abs(float x, float y, float z, s32 seed,
int octaves, float persistence, bool eased=false);
inline float easeCurve(float t)
diff --git a/src/particles.cpp b/src/particles.cpp
index 525258a25..acf9cc815 100644
--- a/src/particles.cpp
+++ b/src/particles.cpp
@@ -54,6 +54,7 @@ Particle::Particle(
float expirationtime,
float size,
bool collisiondetection,
+ bool collision_removal,
bool vertical,
video::ITexture *texture,
v2f texpos,
@@ -85,6 +86,7 @@ Particle::Particle(
m_player = player;
m_size = size;
m_collisiondetection = collisiondetection;
+ m_collision_removal = collision_removal;
m_vertical = vertical;
// Irrlicht stuff
@@ -126,20 +128,21 @@ void Particle::render()
void Particle::step(float dtime)
{
m_time += dtime;
- if (m_collisiondetection)
- {
+ if (m_collisiondetection) {
aabb3f box = m_collisionbox;
- v3f p_pos = m_pos*BS;
- v3f p_velocity = m_velocity*BS;
- collisionMoveSimple(m_env, m_gamedef,
- BS*0.5, box,
- 0, dtime,
- &p_pos, &p_velocity, m_acceleration * BS);
- m_pos = p_pos/BS;
- m_velocity = p_velocity/BS;
- }
- else
- {
+ v3f p_pos = m_pos * BS;
+ v3f p_velocity = m_velocity * BS;
+ collisionMoveResult r = collisionMoveSimple(m_env,
+ m_gamedef, BS * 0.5, box, 0, dtime, &p_pos,
+ &p_velocity, m_acceleration * BS);
+ if (m_collision_removal && r.collides) {
+ // force expiration of the particle
+ m_expiration = -1.0;
+ } else {
+ m_pos = p_pos / BS;
+ m_velocity = p_velocity / BS;
+ }
+ } else {
m_velocity += m_acceleration * dtime;
m_pos += m_velocity * dtime;
}
@@ -210,8 +213,8 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
u16 amount, float time,
v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minsize, float maxsize,
- bool collisiondetection, bool vertical, video::ITexture *texture, u32 id,
- ParticleManager *p_manager) :
+ bool collisiondetection, bool collision_removal, u16 attached_id, bool vertical,
+ video::ITexture *texture, u32 id, ParticleManager *p_manager) :
m_particlemanager(p_manager)
{
m_gamedef = gamedef;
@@ -230,6 +233,8 @@ ParticleSpawner::ParticleSpawner(IGameDef* gamedef, scene::ISceneManager *smgr,
m_minsize = minsize;
m_maxsize = maxsize;
m_collisiondetection = collisiondetection;
+ m_collision_removal = collision_removal;
+ m_attached_id = attached_id;
m_vertical = vertical;
m_texture = texture;
m_time = 0;
@@ -247,6 +252,20 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
{
m_time += dtime;
+ bool unloaded = false;
+ bool is_attached = false;
+ v3f attached_pos = v3f(0,0,0);
+ float attached_yaw = 0;
+ if (m_attached_id != 0) {
+ if (ClientActiveObject *attached = env->getActiveObject(m_attached_id)) {
+ attached_pos = attached->getPosition() / BS;
+ attached_yaw = attached->getYaw();
+ is_attached = true;
+ } else {
+ unloaded = true;
+ }
+ }
+
if (m_spawntime != 0) // Spawner exists for a predefined timespan
{
for(std::vector<float>::iterator i = m_spawntimes.begin();
@@ -256,32 +275,47 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
{
m_amount--;
- v3f pos = random_v3f(m_minpos, m_maxpos);
- v3f vel = random_v3f(m_minvel, m_maxvel);
- v3f acc = random_v3f(m_minacc, m_maxacc);
- float exptime = rand()/(float)RAND_MAX
- *(m_maxexptime-m_minexptime)
- +m_minexptime;
- float size = rand()/(float)RAND_MAX
- *(m_maxsize-m_minsize)
- +m_minsize;
-
- Particle* toadd = new Particle(
- m_gamedef,
- m_smgr,
- m_player,
- env,
- pos,
- vel,
- acc,
- exptime,
- size,
- m_collisiondetection,
- m_vertical,
- m_texture,
- v2f(0.0, 0.0),
- v2f(1.0, 1.0));
- m_particlemanager->addParticle(toadd);
+ // Pretend to, but don't actually spawn a
+ // particle if it is attached to an unloaded
+ // object.
+ if (!unloaded) {
+ v3f pos = random_v3f(m_minpos, m_maxpos);
+ v3f vel = random_v3f(m_minvel, m_maxvel);
+ v3f acc = random_v3f(m_minacc, m_maxacc);
+
+ if (is_attached) {
+ // Apply attachment yaw and position
+ pos.rotateXZBy(attached_yaw);
+ pos += attached_pos;
+ vel.rotateXZBy(attached_yaw);
+ acc.rotateXZBy(attached_yaw);
+ }
+
+ float exptime = rand()/(float)RAND_MAX
+ *(m_maxexptime-m_minexptime)
+ +m_minexptime;
+ float size = rand()/(float)RAND_MAX
+ *(m_maxsize-m_minsize)
+ +m_minsize;
+
+ Particle* toadd = new Particle(
+ m_gamedef,
+ m_smgr,
+ m_player,
+ env,
+ pos,
+ vel,
+ acc,
+ exptime,
+ size,
+ m_collisiondetection,
+ m_collision_removal,
+ m_vertical,
+ m_texture,
+ v2f(0.0, 0.0),
+ v2f(1.0, 1.0));
+ m_particlemanager->addParticle(toadd);
+ }
i = m_spawntimes.erase(i);
}
else
@@ -292,6 +326,9 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
}
else // Spawner exists for an infinity timespan, spawn on a per-second base
{
+ // Skip this step if attached to an unloaded object
+ if (unloaded)
+ return;
for (int i = 0; i <= m_amount; i++)
{
if (rand()/(float)RAND_MAX < dtime)
@@ -299,6 +336,15 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
v3f pos = random_v3f(m_minpos, m_maxpos);
v3f vel = random_v3f(m_minvel, m_maxvel);
v3f acc = random_v3f(m_minacc, m_maxacc);
+
+ if (is_attached) {
+ // Apply attachment yaw and position
+ pos.rotateXZBy(attached_yaw);
+ pos += attached_pos;
+ vel.rotateXZBy(attached_yaw);
+ acc.rotateXZBy(attached_yaw);
+ }
+
float exptime = rand()/(float)RAND_MAX
*(m_maxexptime-m_minexptime)
+m_minexptime;
@@ -317,6 +363,7 @@ void ParticleSpawner::step(float dtime, ClientEnvironment* env)
exptime,
size,
m_collisiondetection,
+ m_collision_removal,
m_vertical,
m_texture,
v2f(0.0, 0.0),
@@ -446,6 +493,8 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef,
event->add_particlespawner.minsize,
event->add_particlespawner.maxsize,
event->add_particlespawner.collisiondetection,
+ event->add_particlespawner.collision_removal,
+ event->add_particlespawner.attached_id,
event->add_particlespawner.vertical,
texture,
event->add_particlespawner.id,
@@ -480,6 +529,7 @@ void ParticleManager::handleParticleEvent(ClientEvent *event, IGameDef *gamedef,
event->spawn_particle.expirationtime,
event->spawn_particle.size,
event->spawn_particle.collisiondetection,
+ event->spawn_particle.collision_removal,
event->spawn_particle.vertical,
texture,
v2f(0.0, 0.0),
@@ -555,6 +605,7 @@ void ParticleManager::addNodeParticle(IGameDef* gamedef, scene::ISceneManager* s
visual_size,
true,
false,
+ false,
texture,
texpos,
texsize);
diff --git a/src/particles.h b/src/particles.h
index dda84385c..eb8c6665d 100644
--- a/src/particles.h
+++ b/src/particles.h
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
struct ClientEvent;
class ParticleManager;
+class ClientEnvironment;
class Particle : public scene::ISceneNode
{
@@ -45,6 +46,7 @@ class Particle : public scene::ISceneNode
float expirationtime,
float size,
bool collisiondetection,
+ bool collision_removal,
bool vertical,
video::ITexture *texture,
v2f texpos,
@@ -97,6 +99,7 @@ private:
float m_size;
u8 m_light;
bool m_collisiondetection;
+ bool m_collision_removal;
bool m_vertical;
v3s16 m_camera_offset;
};
@@ -115,6 +118,8 @@ class ParticleSpawner
float minexptime, float maxexptime,
float minsize, float maxsize,
bool collisiondetection,
+ bool collision_removal,
+ u16 attached_id,
bool vertical,
video::ITexture *texture,
u32 id,
@@ -148,8 +153,9 @@ class ParticleSpawner
video::ITexture *m_texture;
std::vector<float> m_spawntimes;
bool m_collisiondetection;
+ bool m_collision_removal;
bool m_vertical;
-
+ u16 m_attached_id;
};
/**
diff --git a/src/player.cpp b/src/player.cpp
index 5949712a5..85bc639ec 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -19,49 +19,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "player.h"
-#include <fstream>
#include "threading/mutex_auto_lock.h"
#include "util/numeric.h"
#include "hud.h"
#include "constants.h"
#include "gamedef.h"
#include "settings.h"
-#include "content_sao.h"
-#include "filesys.h"
#include "log.h"
#include "porting.h" // strlcpy
-Player::Player(IGameDef *gamedef, const char *name):
- got_teleported(false),
- touching_ground(false),
- in_liquid(false),
- in_liquid_stable(false),
- liquid_viscosity(0),
- is_climbing(false),
- swimming_vertical(false),
- camera_barely_in_ceiling(false),
- inventory(gamedef->idef()),
- hp(PLAYER_MAX_HP),
- hurt_tilt_timer(0),
- hurt_tilt_strength(0),
- protocol_version(0),
+Player::Player(const char *name, IItemDefManager *idef):
+ inventory(idef),
peer_id(PEER_ID_INEXISTENT),
keyPressed(0),
// protected
- m_gamedef(gamedef),
- m_breath(PLAYER_MAX_BREATH),
- m_pitch(0),
- m_yaw(0),
- m_speed(0,0,0),
- m_position(0,0,0),
- m_collisionbox(-BS*0.30,0.0,-BS*0.30,BS*0.30,BS*1.75,BS*0.30),
- m_dirty(false)
+ m_speed(0,0,0)
{
strlcpy(m_name, name, PLAYERNAME_SIZE);
inventory.clear();
inventory.addList("main", PLAYER_INVENTORY_SIZE);
+ inventory.addList("hand", 1);
InventoryList *craft = inventory.addList("craft", 9);
craft->setWidth(3);
inventory.addList("craftpreview", 1);
@@ -92,13 +71,6 @@ Player::Player(IGameDef *gamedef, const char *name):
movement_gravity = 9.81 * BS;
local_animation_speed = 0.0;
- // Movement overrides are multipliers and must be 1 by default
- physics_override_speed = 1;
- physics_override_jump = 1;
- physics_override_gravity = 1;
- physics_override_sneak = true;
- physics_override_sneak_glitch = true;
-
hud_flags =
HUD_FLAG_HOTBAR_VISIBLE | HUD_FLAG_HEALTHBAR_VISIBLE |
HUD_FLAG_CROSSHAIR_VISIBLE | HUD_FLAG_WIELDITEM_VISIBLE |
@@ -112,75 +84,6 @@ Player::~Player()
clearHud();
}
-v3s16 Player::getLightPosition() const
-{
- return floatToInt(m_position + v3f(0,BS+BS/2,0), BS);
-}
-
-void Player::serialize(std::ostream &os)
-{
- // Utilize a Settings object for storing values
- Settings args;
- args.setS32("version", 1);
- args.set("name", m_name);
- //args.set("password", m_password);
- args.setFloat("pitch", m_pitch);
- args.setFloat("yaw", m_yaw);
- args.setV3F("position", m_position);
- args.setS32("hp", hp);
- args.setS32("breath", m_breath);
-
- args.writeLines(os);
-
- os<<"PlayerArgsEnd\n";
-
- inventory.serialize(os);
-}
-
-void Player::deSerialize(std::istream &is, std::string playername)
-{
- Settings args;
-
- if (!args.parseConfigLines(is, "PlayerArgsEnd")) {
- throw SerializationError("PlayerArgsEnd of player " +
- playername + " not found!");
- }
-
- m_dirty = true;
- //args.getS32("version"); // Version field value not used
- std::string name = args.get("name");
- strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE);
- setPitch(args.getFloat("pitch"));
- setYaw(args.getFloat("yaw"));
- setPosition(args.getV3F("position"));
- try{
- hp = args.getS32("hp");
- }catch(SettingNotFoundException &e) {
- hp = PLAYER_MAX_HP;
- }
- try{
- m_breath = args.getS32("breath");
- }catch(SettingNotFoundException &e) {
- m_breath = PLAYER_MAX_BREATH;
- }
-
- inventory.deSerialize(is);
-
- if(inventory.getList("craftpreview") == NULL) {
- // Convert players without craftpreview
- inventory.addList("craftpreview", 1);
-
- bool craftresult_is_preview = true;
- if(args.exists("craftresult_is_preview"))
- craftresult_is_preview = args.getBool("craftresult_is_preview");
- if(craftresult_is_preview)
- {
- // Clear craftresult
- inventory.getList("craftresult")->changeItem(0, ItemStack());
- }
- }
-}
-
u32 Player::addHud(HudElement *toadd)
{
MutexAutoLock lock(m_mutex);
@@ -226,81 +129,3 @@ void Player::clearHud()
hud.pop_back();
}
}
-
-RemotePlayer::RemotePlayer(IGameDef *gamedef, const char *name):
- Player(gamedef, name),
- m_sao(NULL)
-{
- movement_acceleration_default = g_settings->getFloat("movement_acceleration_default") * BS;
- movement_acceleration_air = g_settings->getFloat("movement_acceleration_air") * BS;
- movement_acceleration_fast = g_settings->getFloat("movement_acceleration_fast") * BS;
- movement_speed_walk = g_settings->getFloat("movement_speed_walk") * BS;
- movement_speed_crouch = g_settings->getFloat("movement_speed_crouch") * BS;
- movement_speed_fast = g_settings->getFloat("movement_speed_fast") * BS;
- movement_speed_climb = g_settings->getFloat("movement_speed_climb") * BS;
- movement_speed_jump = g_settings->getFloat("movement_speed_jump") * BS;
- movement_liquid_fluidity = g_settings->getFloat("movement_liquid_fluidity") * BS;
- movement_liquid_fluidity_smooth = g_settings->getFloat("movement_liquid_fluidity_smooth") * BS;
- movement_liquid_sink = g_settings->getFloat("movement_liquid_sink") * BS;
- movement_gravity = g_settings->getFloat("movement_gravity") * BS;
-}
-
-void RemotePlayer::save(std::string savedir)
-{
- /*
- * We have to open all possible player files in the players directory
- * and check their player names because some file systems are not
- * case-sensitive and player names are case-sensitive.
- */
-
- // A player to deserialize files into to check their names
- RemotePlayer testplayer(m_gamedef, "");
-
- savedir += DIR_DELIM;
- std::string path = savedir + m_name;
- for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) {
- if (!fs::PathExists(path)) {
- // Open file and serialize
- std::ostringstream ss(std::ios_base::binary);
- serialize(ss);
- if (!fs::safeWriteToFile(path, ss.str())) {
- infostream << "Failed to write " << path << std::endl;
- }
- setModified(false);
- return;
- }
- // Open file and deserialize
- std::ifstream is(path.c_str(), std::ios_base::binary);
- if (!is.good()) {
- infostream << "Failed to open " << path << std::endl;
- return;
- }
- testplayer.deSerialize(is, path);
- is.close();
- if (strcmp(testplayer.getName(), m_name) == 0) {
- // Open file and serialize
- std::ostringstream ss(std::ios_base::binary);
- serialize(ss);
- if (!fs::safeWriteToFile(path, ss.str())) {
- infostream << "Failed to write " << path << std::endl;
- }
- setModified(false);
- return;
- }
- path = savedir + m_name + itos(i);
- }
-
- infostream << "Didn't find free file for player " << m_name << std::endl;
- return;
-}
-
-/*
- RemotePlayer
-*/
-void RemotePlayer::setPosition(const v3f &position)
-{
- Player::setPosition(position);
- if(m_sao)
- m_sao->setBasePosition(position);
-}
-
diff --git a/src/player.h b/src/player.h
index b317cda4f..5f9bb7ec9 100644
--- a/src/player.h
+++ b/src/player.h
@@ -46,7 +46,10 @@ struct PlayerControl
RMB = false;
pitch = 0;
yaw = 0;
+ sidew_move_joystick_axis = .0f;
+ forw_move_joystick_axis = .0f;
}
+
PlayerControl(
bool a_up,
bool a_down,
@@ -55,10 +58,13 @@ struct PlayerControl
bool a_jump,
bool a_aux1,
bool a_sneak,
+ bool a_zoom,
bool a_LMB,
bool a_RMB,
float a_pitch,
- float a_yaw
+ float a_yaw,
+ float a_sidew_move_joystick_axis,
+ float a_forw_move_joystick_axis
)
{
up = a_up;
@@ -68,10 +74,13 @@ struct PlayerControl
jump = a_jump;
aux1 = a_aux1;
sneak = a_sneak;
+ zoom = a_zoom;
LMB = a_LMB;
RMB = a_RMB;
pitch = a_pitch;
yaw = a_yaw;
+ sidew_move_joystick_axis = a_sidew_move_joystick_axis;
+ forw_move_joystick_axis = a_forw_move_joystick_axis;
}
bool up;
bool down;
@@ -80,16 +89,17 @@ struct PlayerControl
bool jump;
bool aux1;
bool sneak;
+ bool zoom;
bool LMB;
bool RMB;
float pitch;
float yaw;
+ float sidew_move_joystick_axis;
+ float forw_move_joystick_axis;
};
class Map;
-class IGameDef;
struct CollisionInfo;
-class PlayerSAO;
struct HudElement;
class Environment;
@@ -100,7 +110,7 @@ class Player
{
public:
- Player(IGameDef *gamedef, const char *name);
+ Player(const char *name, IItemDefManager *idef);
virtual ~Player() = 0;
virtual void move(f32 dtime, Environment *env, f32 pos_max_d)
@@ -119,88 +129,10 @@ public:
m_speed = speed;
}
- v3f getPosition()
- {
- return m_position;
- }
-
- v3s16 getLightPosition() const;
-
- v3f getEyeOffset()
- {
- float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f;
- return v3f(0, BS * eye_height, 0);
- }
-
- v3f getEyePosition()
- {
- return m_position + getEyeOffset();
- }
-
- virtual void setPosition(const v3f &position)
- {
- if (position != m_position)
- m_dirty = true;
- m_position = position;
- }
-
- void setPitch(f32 pitch)
- {
- if (pitch != m_pitch)
- m_dirty = true;
- m_pitch = pitch;
- }
-
- virtual void setYaw(f32 yaw)
- {
- if (yaw != m_yaw)
- m_dirty = true;
- m_yaw = yaw;
- }
-
- f32 getPitch()
- {
- return m_pitch;
- }
-
- f32 getYaw()
- {
- return m_yaw;
- }
-
- u16 getBreath()
- {
- return m_breath;
- }
-
- virtual void setBreath(u16 breath)
- {
- if (breath != m_breath)
- m_dirty = true;
- m_breath = breath;
- }
-
- f32 getRadPitch()
- {
- return -1.0 * m_pitch * core::DEGTORAD;
- }
-
- f32 getRadYaw()
- {
- return (m_yaw + 90.) * core::DEGTORAD;
- }
+ const char *getName() const { return m_name; }
- const char *getName() const
+ u32 getFreeHudID()
{
- return m_name;
- }
-
- aabb3f getCollisionbox()
- {
- return m_collisionbox;
- }
-
- u32 getFreeHudID() {
size_t size = hud.size();
for (size_t i = 0; i != size; i++) {
if (!hud[i])
@@ -209,126 +141,6 @@ public:
return size;
}
- void setHotbarItemcount(s32 hotbar_itemcount)
- {
- hud_hotbar_itemcount = hotbar_itemcount;
- }
-
- s32 getHotbarItemcount()
- {
- return hud_hotbar_itemcount;
- }
-
- void setHotbarImage(const std::string &name)
- {
- hud_hotbar_image = name;
- }
-
- std::string getHotbarImage()
- {
- return hud_hotbar_image;
- }
-
- void setHotbarSelectedImage(const std::string &name)
- {
- hud_hotbar_selected_image = name;
- }
-
- std::string getHotbarSelectedImage() {
- return hud_hotbar_selected_image;
- }
-
- void setSky(const video::SColor &bgcolor, const std::string &type,
- const std::vector<std::string> &params)
- {
- m_sky_bgcolor = bgcolor;
- m_sky_type = type;
- m_sky_params = params;
- }
-
- void getSky(video::SColor *bgcolor, std::string *type,
- std::vector<std::string> *params)
- {
- *bgcolor = m_sky_bgcolor;
- *type = m_sky_type;
- *params = m_sky_params;
- }
-
- void overrideDayNightRatio(bool do_override, float ratio)
- {
- m_day_night_ratio_do_override = do_override;
- m_day_night_ratio = ratio;
- }
-
- void getDayNightRatio(bool *do_override, float *ratio)
- {
- *do_override = m_day_night_ratio_do_override;
- *ratio = m_day_night_ratio;
- }
-
- void setLocalAnimations(v2s32 frames[4], float frame_speed)
- {
- for (int i = 0; i < 4; i++)
- local_animations[i] = frames[i];
- local_animation_speed = frame_speed;
- }
-
- void getLocalAnimations(v2s32 *frames, float *frame_speed)
- {
- for (int i = 0; i < 4; i++)
- frames[i] = local_animations[i];
- *frame_speed = local_animation_speed;
- }
-
- virtual bool isLocal() const
- {
- return false;
- }
-
- virtual PlayerSAO *getPlayerSAO()
- {
- return NULL;
- }
-
- virtual void setPlayerSAO(PlayerSAO *sao)
- {
- FATAL_ERROR("FIXME");
- }
-
- /*
- serialize() writes a bunch of text that can contain
- any characters except a '\0', and such an ending that
- deSerialize stops reading exactly at the right point.
- */
- void serialize(std::ostream &os);
- void deSerialize(std::istream &is, std::string playername);
-
- bool checkModified() const
- {
- return m_dirty || inventory.checkModified();
- }
-
- void setModified(const bool x)
- {
- m_dirty = x;
- if (x == false)
- inventory.setModified(x);
- }
-
- // Use a function, if isDead can be defined by other conditions
- bool isDead() { return hp == 0; }
-
- bool got_teleported;
- bool touching_ground;
- // This oscillates so that the player jumps a bit above the surface
- bool in_liquid;
- // This is more stable and defines the maximum speed of the player
- bool in_liquid_stable;
- // Gets the viscosity of water to calculate friction
- u8 liquid_viscosity;
- bool is_climbing;
- bool swimming_vertical;
- bool camera_barely_in_ceiling;
v3f eye_offset_first;
v3f eye_offset_third;
@@ -347,67 +159,30 @@ public:
f32 movement_liquid_sink;
f32 movement_gravity;
- float physics_override_speed;
- float physics_override_jump;
- float physics_override_gravity;
- bool physics_override_sneak;
- bool physics_override_sneak_glitch;
-
v2s32 local_animations[4];
float local_animation_speed;
- u16 hp;
-
- float hurt_tilt_timer;
- float hurt_tilt_strength;
-
- u16 protocol_version;
u16 peer_id;
std::string inventory_formspec;
PlayerControl control;
- PlayerControl getPlayerControl()
- {
- return control;
- }
+ const PlayerControl& getPlayerControl() { return control; }
u32 keyPressed;
-
HudElement* getHud(u32 id);
u32 addHud(HudElement* hud);
HudElement* removeHud(u32 id);
void clearHud();
- u32 maxHudId() {
- return hud.size();
- }
u32 hud_flags;
s32 hud_hotbar_itemcount;
- std::string hud_hotbar_image;
- std::string hud_hotbar_selected_image;
protected:
- IGameDef *m_gamedef;
-
char m_name[PLAYERNAME_SIZE];
- u16 m_breath;
- f32 m_pitch;
- f32 m_yaw;
v3f m_speed;
- v3f m_position;
- aabb3f m_collisionbox;
-
- bool m_dirty;
std::vector<HudElement *> hud;
-
- std::string m_sky_type;
- video::SColor m_sky_bgcolor;
- std::vector<std::string> m_sky_params;
-
- bool m_day_night_ratio_do_override;
- float m_day_night_ratio;
private:
// Protect some critical areas
// hud for example can be modified by EmergeThread
@@ -415,27 +190,5 @@ private:
Mutex m_mutex;
};
-
-/*
- Player on the server
-*/
-class RemotePlayer : public Player
-{
-public:
- RemotePlayer(IGameDef *gamedef, const char *name);
- virtual ~RemotePlayer() {}
-
- void save(std::string savedir);
-
- PlayerSAO *getPlayerSAO()
- { return m_sao; }
- void setPlayerSAO(PlayerSAO *sao)
- { m_sao = sao; }
- void setPosition(const v3f &position);
-
-private:
- PlayerSAO *m_sao;
-};
-
#endif
diff --git a/src/porting.cpp b/src/porting.cpp
index 98b85b7d0..023f0cca7 100644
--- a/src/porting.cpp
+++ b/src/porting.cpp
@@ -75,11 +75,16 @@ bool * signal_handler_killstatus(void)
#if !defined(_WIN32) // POSIX
#include <signal.h>
-void sigint_handler(int sig)
+void signal_handler(int sig)
{
if (!g_killed) {
- dstream << "INFO: sigint_handler(): "
- << "Ctrl-C pressed, shutting down." << std::endl;
+ if (sig == SIGINT) {
+ dstream << "INFO: signal_handler(): "
+ << "Ctrl-C pressed, shutting down." << std::endl;
+ } else if (sig == SIGTERM) {
+ dstream << "INFO: signal_handler(): "
+ << "got SIGTERM, shutting down." << std::endl;
+ }
// Comment out for less clutter when testing scripts
/*dstream << "INFO: sigint_handler(): "
@@ -88,13 +93,14 @@ void sigint_handler(int sig)
g_killed = true;
} else {
- (void)signal(SIGINT, SIG_DFL);
+ (void)signal(sig, SIG_DFL);
}
}
void signal_handler_init(void)
{
- (void)signal(SIGINT, sigint_handler);
+ (void)signal(SIGINT, signal_handler);
+ (void)signal(SIGTERM, signal_handler);
}
#else // _WIN32
@@ -252,7 +258,7 @@ bool getCurrentExecPath(char *buf, size_t len)
//// Linux
-#elif defined(linux) || defined(__linux) || defined(__linux__)
+#elif defined(__linux__)
bool getCurrentExecPath(char *buf, size_t len)
{
@@ -368,7 +374,7 @@ bool setSystemPaths()
//// Linux
-#elif defined(linux) || defined(__linux)
+#elif defined(__linux__)
bool setSystemPaths()
{
@@ -605,6 +611,115 @@ void setXorgClassHint(const video::SExposedVideoData &video_data,
#endif
}
+bool setXorgWindowIcon(IrrlichtDevice *device)
+{
+#ifdef XORG_USED
+# if RUN_IN_PLACE
+ return setXorgWindowIconFromPath(device,
+ path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png");
+# else
+ // We have semi-support for reading in-place data if we are
+ // compiled with RUN_IN_PLACE. Don't break with this and
+ // also try the path_share location.
+ return
+ setXorgWindowIconFromPath(device,
+ ICON_DIR "/hicolor/128x128/apps/" PROJECT_NAME ".png") ||
+ setXorgWindowIconFromPath(device,
+ path_share + "/misc/" PROJECT_NAME "-xorg-icon-128.png");
+# endif
+#else
+ return false;
+#endif
+}
+
+bool setXorgWindowIconFromPath(IrrlichtDevice *device,
+ const std::string &icon_file)
+{
+#ifdef XORG_USED
+
+ video::IVideoDriver *v_driver = device->getVideoDriver();
+
+ video::IImageLoader *image_loader = NULL;
+ u32 cnt = v_driver->getImageLoaderCount();
+ for (u32 i = 0; i < cnt; i++) {
+ if (v_driver->getImageLoader(i)->isALoadableFileExtension(icon_file.c_str())) {
+ image_loader = v_driver->getImageLoader(i);
+ break;
+ }
+ }
+
+ if (!image_loader) {
+ warningstream << "Could not find image loader for file '"
+ << icon_file << "'" << std::endl;
+ return false;
+ }
+
+ io::IReadFile *icon_f = device->getFileSystem()->createAndOpenFile(icon_file.c_str());
+
+ if (!icon_f) {
+ warningstream << "Could not load icon file '"
+ << icon_file << "'" << std::endl;
+ return false;
+ }
+
+ video::IImage *img = image_loader->loadImage(icon_f);
+
+ if (!img) {
+ warningstream << "Could not load icon file '"
+ << icon_file << "'" << std::endl;
+ icon_f->drop();
+ return false;
+ }
+
+ u32 height = img->getDimension().Height;
+ u32 width = img->getDimension().Width;
+
+ size_t icon_buffer_len = 2 + height * width;
+ long *icon_buffer = new long[icon_buffer_len];
+
+ icon_buffer[0] = width;
+ icon_buffer[1] = height;
+
+ for (u32 x = 0; x < width; x++) {
+ for (u32 y = 0; y < height; y++) {
+ video::SColor col = img->getPixel(x, y);
+ long pixel_val = 0;
+ pixel_val |= (u8)col.getAlpha() << 24;
+ pixel_val |= (u8)col.getRed() << 16;
+ pixel_val |= (u8)col.getGreen() << 8;
+ pixel_val |= (u8)col.getBlue();
+ icon_buffer[2 + x + y * width] = pixel_val;
+ }
+ }
+
+ img->drop();
+ icon_f->drop();
+
+ const video::SExposedVideoData &video_data = v_driver->getExposedVideoData();
+
+ Display *x11_dpl = (Display *)video_data.OpenGLLinux.X11Display;
+
+ if (x11_dpl == NULL) {
+ warningstream << "Could not find x11 display for setting its icon."
+ << std::endl;
+ delete [] icon_buffer;
+ return false;
+ }
+
+ Window x11_win = (Window)video_data.OpenGLLinux.X11Window;
+
+ Atom net_wm_icon = XInternAtom(x11_dpl, "_NET_WM_ICON", False);
+ Atom cardinal = XInternAtom(x11_dpl, "CARDINAL", False);
+ XChangeProperty(x11_dpl, x11_win,
+ net_wm_icon, cardinal, 32,
+ PropModeReplace, (const unsigned char *)icon_buffer,
+ icon_buffer_len);
+
+ delete [] icon_buffer;
+
+#endif
+ return true;
+}
////
//// Video/Display Information (Client-only)
diff --git a/src/porting.h b/src/porting.h
index 4d51c5058..f5c7efcb2 100644
--- a/src/porting.h
+++ b/src/porting.h
@@ -60,7 +60,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <unistd.h>
#include <stdint.h> //for uintptr_t
- #if (defined(linux) || defined(__linux) || defined(__GNU__)) && !defined(_GNU_SOURCE)
+ // Use standard Posix macro for Linux
+ #if (defined(linux) || defined(__linux)) && !defined(__linux__)
+ #define __linux__
+ #endif
+ #if (defined(__linux__) || defined(__GNU__)) && !defined(_GNU_SOURCE)
#define _GNU_SOURCE
#endif
@@ -321,7 +325,7 @@ inline const char *getPlatformName()
return
#if defined(ANDROID)
"Android"
-#elif defined(linux) || defined(__linux) || defined(__linux__)
+#elif defined(__linux__)
"Linux"
#elif defined(_WIN32) || defined(_WIN64)
"Windows"
@@ -363,6 +367,11 @@ inline const char *getPlatformName()
void setXorgClassHint(const video::SExposedVideoData &video_data,
const std::string &name);
+bool setXorgWindowIcon(IrrlichtDevice *device);
+
+bool setXorgWindowIconFromPath(IrrlichtDevice *device,
+ const std::string &icon_file);
+
// This only needs to be called at the start of execution, since all future
// threads in the process inherit this exception handler
void setWin32ExceptionHandler();
diff --git a/src/reflowscan.cpp b/src/reflowscan.cpp
new file mode 100644
index 000000000..49b9406d7
--- /dev/null
+++ b/src/reflowscan.cpp
@@ -0,0 +1,206 @@
+/*
+Minetest
+Copyright (C) 2016 MillersMan <millersman@users.noreply.github.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "reflowscan.h"
+#include "map.h"
+#include "mapblock.h"
+#include "nodedef.h"
+#include "util/timetaker.h"
+
+
+ReflowScan::ReflowScan(Map *map, INodeDefManager *ndef) :
+ m_map(map),
+ m_ndef(ndef),
+ m_liquid_queue(NULL)
+{
+}
+
+void ReflowScan::scan(MapBlock *block, UniqueQueue<v3s16> *liquid_queue)
+{
+ m_block_pos = block->getPos();
+ m_rel_block_pos = block->getPosRelative();
+ m_liquid_queue = liquid_queue;
+
+ // Prepare the lookup which is a 3x3x3 array of the blocks surrounding the
+ // scanned block. Blocks are only added to the lookup if they are really
+ // needed. The lookup is indexed manually to use the same index in a
+ // bit-array (of uint32 type) which stores for unloaded blocks that they
+ // were already fetched from Map but were actually NULL.
+ memset(m_lookup, 0, sizeof(m_lookup));
+ int block_idx = 1 + (1 * 9) + (1 * 3);
+ m_lookup[block_idx] = block;
+ m_lookup_state_bitset = 1 << block_idx;
+
+ // Scan the columns in the block
+ for (s16 z = 0; z < MAP_BLOCKSIZE; z++)
+ for (s16 x = 0; x < MAP_BLOCKSIZE; x++) {
+ scanColumn(x, z);
+ }
+
+ // Scan neighbouring columns from the nearby blocks as they might contain
+ // liquid nodes that weren't allowed to flow to prevent gaps.
+ for (s16 i = 0; i < MAP_BLOCKSIZE; i++) {
+ scanColumn(i, -1);
+ scanColumn(i, MAP_BLOCKSIZE);
+ scanColumn(-1, i);
+ scanColumn(MAP_BLOCKSIZE, i);
+ }
+}
+
+inline MapBlock *ReflowScan::lookupBlock(int x, int y, int z)
+{
+ // Gets the block that contains (x,y,z) relativ to the scanned block.
+ // This uses a lookup as there might be many lookups into the same
+ // neighbouring block which makes fetches from Map costly.
+ int bx = (MAP_BLOCKSIZE + x) / MAP_BLOCKSIZE;
+ int by = (MAP_BLOCKSIZE + y) / MAP_BLOCKSIZE;
+ int bz = (MAP_BLOCKSIZE + z) / MAP_BLOCKSIZE;
+ int idx = (bx + (by * 9) + (bz * 3));
+ MapBlock *result = m_lookup[idx];
+ if (!result && (m_lookup_state_bitset & (1 << idx)) == 0) {
+ // The block wasn't requested yet so fetch it from Map and store it
+ // in the lookup
+ v3s16 pos = m_block_pos + v3s16(bx - 1, by - 1, bz - 1);
+ m_lookup[idx] = result = m_map->getBlockNoCreateNoEx(pos);
+ m_lookup_state_bitset |= (1 << idx);
+ }
+ return result;
+}
+
+inline bool ReflowScan::isLiquidFlowableTo(int x, int y, int z)
+{
+ // Tests whether (x,y,z) is a node to which liquid might flow.
+ bool valid_position;
+ MapBlock *block = lookupBlock(x, y, z);
+ if (block) {
+ int dx = (MAP_BLOCKSIZE + x) % MAP_BLOCKSIZE;
+ int dy = (MAP_BLOCKSIZE + y) % MAP_BLOCKSIZE;
+ int dz = (MAP_BLOCKSIZE + z) % MAP_BLOCKSIZE;
+ MapNode node = block->getNodeNoCheck(dx, dy, dz, &valid_position);
+ if (node.getContent() != CONTENT_IGNORE) {
+ const ContentFeatures &f = m_ndef->get(node);
+ // NOTE: No need to check for flowing nodes with lower liquid level
+ // as they should only occur on top of other columns where they
+ // will be added to the queue themselves.
+ return f.floodable;
+ }
+ }
+ return false;
+}
+
+inline bool ReflowScan::isLiquidHorizontallyFlowable(int x, int y, int z)
+{
+ // Check if the (x,y,z) might spread to one of the horizontally
+ // neighbouring nodes
+ return isLiquidFlowableTo(x - 1, y, z) ||
+ isLiquidFlowableTo(x + 1, y, z) ||
+ isLiquidFlowableTo(x, y, z - 1) ||
+ isLiquidFlowableTo(x, y, z + 1);
+}
+
+void ReflowScan::scanColumn(int x, int z)
+{
+ bool valid_position;
+
+ // Is the column inside a loaded block?
+ MapBlock *block = lookupBlock(x, 0, z);
+ if (!block)
+ return;
+
+ MapBlock *above = lookupBlock(x, MAP_BLOCKSIZE, z);
+ int dx = (MAP_BLOCKSIZE + x) % MAP_BLOCKSIZE;
+ int dz = (MAP_BLOCKSIZE + z) % MAP_BLOCKSIZE;
+
+ // Get the state from the node above the scanned block
+ bool was_ignore, was_liquid;
+ if (above) {
+ MapNode node = above->getNodeNoCheck(dx, 0, dz, &valid_position);
+ was_ignore = node.getContent() == CONTENT_IGNORE;
+ was_liquid = m_ndef->get(node).isLiquid();
+ } else {
+ was_ignore = true;
+ was_liquid = false;
+ }
+ bool was_checked = false;
+ bool was_pushed = false;
+
+ // Scan through the whole block
+ for (s16 y = MAP_BLOCKSIZE - 1; y >= 0; y--) {
+ MapNode node = block->getNodeNoCheck(dx, y, dz, &valid_position);
+ const ContentFeatures &f = m_ndef->get(node);
+ bool is_ignore = node.getContent() == CONTENT_IGNORE;
+ bool is_liquid = f.isLiquid();
+
+ if (is_ignore || was_ignore || is_liquid == was_liquid) {
+ // Neither topmost node of liquid column nor topmost node below column
+ was_checked = false;
+ was_pushed = false;
+ } else if (is_liquid) {
+ // This is the topmost node in the column
+ bool is_pushed = false;
+ if (f.liquid_type == LIQUID_FLOWING ||
+ isLiquidHorizontallyFlowable(x, y, z)) {
+ m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, y, z));
+ is_pushed = true;
+ }
+ // Remember waschecked and waspushed to avoid repeated
+ // checks/pushes in case the column consists of only this node
+ was_checked = true;
+ was_pushed = is_pushed;
+ } else {
+ // This is the topmost node below a liquid column
+ if (!was_pushed && (f.floodable ||
+ (!was_checked && isLiquidHorizontallyFlowable(x, y + 1, z)))) {
+ // Activate the lowest node in the column which is one
+ // node above this one
+ m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, y + 1, z));
+ }
+ }
+
+ was_liquid = is_liquid;
+ was_ignore = is_ignore;
+ }
+
+ // Check the node below the current block
+ MapBlock *below = lookupBlock(x, -1, z);
+ if (below) {
+ MapNode node = below->getNodeNoCheck(dx, MAP_BLOCKSIZE - 1, dz, &valid_position);
+ const ContentFeatures &f = m_ndef->get(node);
+ bool is_ignore = node.getContent() == CONTENT_IGNORE;
+ bool is_liquid = f.isLiquid();
+
+ if (is_ignore || was_ignore || is_liquid == was_liquid) {
+ // Neither topmost node of liquid column nor topmost node below column
+ } else if (is_liquid) {
+ // This is the topmost node in the column and might want to flow away
+ if (f.liquid_type == LIQUID_FLOWING ||
+ isLiquidHorizontallyFlowable(x, -1, z)) {
+ m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, -1, z));
+ }
+ } else {
+ // This is the topmost node below a liquid column
+ if (!was_pushed && (f.floodable ||
+ (!was_checked && isLiquidHorizontallyFlowable(x, 0, z)))) {
+ // Activate the lowest node in the column which is one
+ // node above this one
+ m_liquid_queue->push_back(m_rel_block_pos + v3s16(x, 0, z));
+ }
+ }
+ }
+}
diff --git a/src/reflowscan.h b/src/reflowscan.h
new file mode 100644
index 000000000..a6d289ad5
--- /dev/null
+++ b/src/reflowscan.h
@@ -0,0 +1,50 @@
+/*
+Minetest
+Copyright (C) 2016 MillersMan <millersman@users.noreply.github.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef REFLOWSCAN_H
+#define REFLOWSCAN_H
+
+#include "util/container.h"
+#include "irrlichttypes_bloated.h"
+
+class INodeDefManager;
+class Map;
+class MapBlock;
+
+class ReflowScan {
+public:
+ ReflowScan(Map *map, INodeDefManager *ndef);
+ void scan(MapBlock *block, UniqueQueue<v3s16> *liquid_queue);
+
+private:
+ MapBlock *lookupBlock(int x, int y, int z);
+ bool isLiquidFlowableTo(int x, int y, int z);
+ bool isLiquidHorizontallyFlowable(int x, int y, int z);
+ void scanColumn(int x, int z);
+
+private:
+ Map *m_map;
+ INodeDefManager *m_ndef;
+ v3s16 m_block_pos, m_rel_block_pos;
+ UniqueQueue<v3s16> *m_liquid_queue;
+ MapBlock *m_lookup[3 * 3 * 3];
+ u32 m_lookup_state_bitset;
+};
+
+#endif // REFLOWSCAN_H
diff --git a/src/remoteplayer.cpp b/src/remoteplayer.cpp
new file mode 100644
index 000000000..67ab89113
--- /dev/null
+++ b/src/remoteplayer.cpp
@@ -0,0 +1,232 @@
+/*
+Minetest
+Copyright (C) 2010-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2014-2016 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "remoteplayer.h"
+#include "content_sao.h"
+#include "filesys.h"
+#include "gamedef.h"
+#include "porting.h" // strlcpy
+#include "settings.h"
+
+
+/*
+ RemotePlayer
+*/
+// static config cache for remoteplayer
+bool RemotePlayer::m_setting_cache_loaded = false;
+float RemotePlayer::m_setting_chat_message_limit_per_10sec = 0.0f;
+u16 RemotePlayer::m_setting_chat_message_limit_trigger_kick = 0;
+
+RemotePlayer::RemotePlayer(const char *name, IItemDefManager *idef):
+ Player(name, idef),
+ protocol_version(0),
+ m_sao(NULL),
+ m_dirty(false),
+ m_last_chat_message_sent(time(NULL)),
+ m_chat_message_allowance(5.0f),
+ m_message_rate_overhead(0),
+ hud_hotbar_image(""),
+ hud_hotbar_selected_image("")
+{
+ if (!RemotePlayer::m_setting_cache_loaded) {
+ RemotePlayer::m_setting_chat_message_limit_per_10sec =
+ g_settings->getFloat("chat_message_limit_per_10sec");
+ RemotePlayer::m_setting_chat_message_limit_trigger_kick =
+ g_settings->getU16("chat_message_limit_trigger_kick");
+ RemotePlayer::m_setting_cache_loaded = true;
+ }
+ movement_acceleration_default = g_settings->getFloat("movement_acceleration_default") * BS;
+ movement_acceleration_air = g_settings->getFloat("movement_acceleration_air") * BS;
+ movement_acceleration_fast = g_settings->getFloat("movement_acceleration_fast") * BS;
+ movement_speed_walk = g_settings->getFloat("movement_speed_walk") * BS;
+ movement_speed_crouch = g_settings->getFloat("movement_speed_crouch") * BS;
+ movement_speed_fast = g_settings->getFloat("movement_speed_fast") * BS;
+ movement_speed_climb = g_settings->getFloat("movement_speed_climb") * BS;
+ movement_speed_jump = g_settings->getFloat("movement_speed_jump") * BS;
+ movement_liquid_fluidity = g_settings->getFloat("movement_liquid_fluidity") * BS;
+ movement_liquid_fluidity_smooth = g_settings->getFloat("movement_liquid_fluidity_smooth") * BS;
+ movement_liquid_sink = g_settings->getFloat("movement_liquid_sink") * BS;
+ movement_gravity = g_settings->getFloat("movement_gravity") * BS;
+}
+
+void RemotePlayer::save(std::string savedir, IGameDef *gamedef)
+{
+ /*
+ * We have to open all possible player files in the players directory
+ * and check their player names because some file systems are not
+ * case-sensitive and player names are case-sensitive.
+ */
+
+ // A player to deserialize files into to check their names
+ RemotePlayer testplayer("", gamedef->idef());
+
+ savedir += DIR_DELIM;
+ std::string path = savedir + m_name;
+ for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) {
+ if (!fs::PathExists(path)) {
+ // Open file and serialize
+ std::ostringstream ss(std::ios_base::binary);
+ serialize(ss);
+ if (!fs::safeWriteToFile(path, ss.str())) {
+ infostream << "Failed to write " << path << std::endl;
+ }
+ setModified(false);
+ return;
+ }
+ // Open file and deserialize
+ std::ifstream is(path.c_str(), std::ios_base::binary);
+ if (!is.good()) {
+ infostream << "Failed to open " << path << std::endl;
+ return;
+ }
+ testplayer.deSerialize(is, path, NULL);
+ is.close();
+ if (strcmp(testplayer.getName(), m_name) == 0) {
+ // Open file and serialize
+ std::ostringstream ss(std::ios_base::binary);
+ serialize(ss);
+ if (!fs::safeWriteToFile(path, ss.str())) {
+ infostream << "Failed to write " << path << std::endl;
+ }
+ setModified(false);
+ return;
+ }
+ path = savedir + m_name + itos(i);
+ }
+
+ infostream << "Didn't find free file for player " << m_name << std::endl;
+ return;
+}
+
+void RemotePlayer::deSerialize(std::istream &is, const std::string &playername,
+ PlayerSAO *sao)
+{
+ Settings args;
+
+ if (!args.parseConfigLines(is, "PlayerArgsEnd")) {
+ throw SerializationError("PlayerArgsEnd of player " + playername + " not found!");
+ }
+
+ m_dirty = true;
+ //args.getS32("version"); // Version field value not used
+ std::string name = args.get("name");
+ strlcpy(m_name, name.c_str(), PLAYERNAME_SIZE);
+
+ if (sao) {
+ try {
+ sao->setHPRaw(args.getS32("hp"));
+ } catch(SettingNotFoundException &e) {
+ sao->setHPRaw(PLAYER_MAX_HP);
+ }
+
+ try {
+ sao->setBasePosition(args.getV3F("position"));
+ } catch (SettingNotFoundException &e) {}
+
+ try {
+ sao->setPitch(args.getFloat("pitch"));
+ } catch (SettingNotFoundException &e) {}
+ try {
+ sao->setYaw(args.getFloat("yaw"));
+ } catch (SettingNotFoundException &e) {}
+
+ try {
+ sao->setBreath(args.getS32("breath"));
+ } catch (SettingNotFoundException &e) {}
+ }
+
+ inventory.deSerialize(is);
+
+ if (inventory.getList("craftpreview") == NULL) {
+ // Convert players without craftpreview
+ inventory.addList("craftpreview", 1);
+
+ bool craftresult_is_preview = true;
+ if(args.exists("craftresult_is_preview"))
+ craftresult_is_preview = args.getBool("craftresult_is_preview");
+ if(craftresult_is_preview)
+ {
+ // Clear craftresult
+ inventory.getList("craftresult")->changeItem(0, ItemStack());
+ }
+ }
+}
+
+void RemotePlayer::serialize(std::ostream &os)
+{
+ // Utilize a Settings object for storing values
+ Settings args;
+ args.setS32("version", 1);
+ args.set("name", m_name);
+ //args.set("password", m_password);
+
+ // This should not happen
+ assert(m_sao);
+ args.setS32("hp", m_sao->getHP());
+ args.setV3F("position", m_sao->getBasePosition());
+ args.setFloat("pitch", m_sao->getPitch());
+ args.setFloat("yaw", m_sao->getYaw());
+ args.setS32("breath", m_sao->getBreath());
+
+ args.writeLines(os);
+
+ os<<"PlayerArgsEnd\n";
+
+ inventory.serialize(os);
+}
+
+const RemotePlayerChatResult RemotePlayer::canSendChatMessage()
+{
+ // Rate limit messages
+ u32 now = time(NULL);
+ float time_passed = now - m_last_chat_message_sent;
+ m_last_chat_message_sent = now;
+
+ // If this feature is disabled
+ if (m_setting_chat_message_limit_per_10sec <= 0.0) {
+ return RPLAYER_CHATRESULT_OK;
+ }
+
+ m_chat_message_allowance += time_passed * (m_setting_chat_message_limit_per_10sec / 8.0f);
+ if (m_chat_message_allowance > m_setting_chat_message_limit_per_10sec) {
+ m_chat_message_allowance = m_setting_chat_message_limit_per_10sec;
+ }
+
+ if (m_chat_message_allowance < 1.0f) {
+ infostream << "Player " << m_name
+ << " chat limited due to excessive message amount." << std::endl;
+
+ // Kick player if flooding is too intensive
+ m_message_rate_overhead++;
+ if (m_message_rate_overhead > RemotePlayer::m_setting_chat_message_limit_trigger_kick) {
+ return RPLAYER_CHATRESULT_KICK;
+ }
+
+ return RPLAYER_CHATRESULT_FLOODING;
+ }
+
+ // Reinit message overhead
+ if (m_message_rate_overhead > 0) {
+ m_message_rate_overhead = 0;
+ }
+
+ m_chat_message_allowance -= 1.0f;
+ return RPLAYER_CHATRESULT_OK;
+}
diff --git a/src/remoteplayer.h b/src/remoteplayer.h
new file mode 100644
index 000000000..61b5a23de
--- /dev/null
+++ b/src/remoteplayer.h
@@ -0,0 +1,160 @@
+/*
+Minetest
+Copyright (C) 2010-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2014-2016 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef REMOTEPLAYER_HEADER
+#define REMOTEPLAYER_HEADER
+
+#include "player.h"
+
+class PlayerSAO;
+
+enum RemotePlayerChatResult {
+ RPLAYER_CHATRESULT_OK,
+ RPLAYER_CHATRESULT_FLOODING,
+ RPLAYER_CHATRESULT_KICK,
+};
+/*
+ Player on the server
+*/
+class RemotePlayer : public Player
+{
+public:
+ RemotePlayer(const char *name, IItemDefManager *idef);
+ virtual ~RemotePlayer() {}
+
+ void save(std::string savedir, IGameDef *gamedef);
+ void deSerialize(std::istream &is, const std::string &playername, PlayerSAO *sao);
+
+ PlayerSAO *getPlayerSAO() { return m_sao; }
+ void setPlayerSAO(PlayerSAO *sao) { m_sao = sao; }
+
+ const RemotePlayerChatResult canSendChatMessage();
+
+ void setHotbarItemcount(s32 hotbar_itemcount)
+ {
+ hud_hotbar_itemcount = hotbar_itemcount;
+ }
+
+ s32 getHotbarItemcount() const { return hud_hotbar_itemcount; }
+
+ void overrideDayNightRatio(bool do_override, float ratio)
+ {
+ m_day_night_ratio_do_override = do_override;
+ m_day_night_ratio = ratio;
+ }
+
+ void getDayNightRatio(bool *do_override, float *ratio)
+ {
+ *do_override = m_day_night_ratio_do_override;
+ *ratio = m_day_night_ratio;
+ }
+
+ void setHotbarImage(const std::string &name)
+ {
+ hud_hotbar_image = name;
+ }
+
+ std::string getHotbarImage() const
+ {
+ return hud_hotbar_image;
+ }
+
+ void setHotbarSelectedImage(const std::string &name)
+ {
+ hud_hotbar_selected_image = name;
+ }
+
+ const std::string &getHotbarSelectedImage() const
+ {
+ return hud_hotbar_selected_image;
+ }
+
+ void setSky(const video::SColor &bgcolor, const std::string &type,
+ const std::vector<std::string> &params)
+ {
+ m_sky_bgcolor = bgcolor;
+ m_sky_type = type;
+ m_sky_params = params;
+ }
+
+ void getSky(video::SColor *bgcolor, std::string *type,
+ std::vector<std::string> *params)
+ {
+ *bgcolor = m_sky_bgcolor;
+ *type = m_sky_type;
+ *params = m_sky_params;
+ }
+
+ bool checkModified() const { return m_dirty || inventory.checkModified(); }
+
+ void setModified(const bool x)
+ {
+ m_dirty = x;
+ if (!x)
+ inventory.setModified(x);
+ }
+
+ void setLocalAnimations(v2s32 frames[4], float frame_speed)
+ {
+ for (int i = 0; i < 4; i++)
+ local_animations[i] = frames[i];
+ local_animation_speed = frame_speed;
+ }
+
+ void getLocalAnimations(v2s32 *frames, float *frame_speed)
+ {
+ for (int i = 0; i < 4; i++)
+ frames[i] = local_animations[i];
+ *frame_speed = local_animation_speed;
+ }
+
+ void setDirty(bool dirty) { m_dirty = true; }
+
+ u16 protocol_version;
+private:
+ /*
+ serialize() writes a bunch of text that can contain
+ any characters except a '\0', and such an ending that
+ deSerialize stops reading exactly at the right point.
+ */
+ void serialize(std::ostream &os);
+
+ PlayerSAO *m_sao;
+ bool m_dirty;
+
+ static bool m_setting_cache_loaded;
+ static float m_setting_chat_message_limit_per_10sec;
+ static u16 m_setting_chat_message_limit_trigger_kick;
+
+ u32 m_last_chat_message_sent;
+ float m_chat_message_allowance;
+ u16 m_message_rate_overhead;
+
+ bool m_day_night_ratio_do_override;
+ float m_day_night_ratio;
+ std::string hud_hotbar_image;
+ std::string hud_hotbar_selected_image;
+
+ std::string m_sky_type;
+ video::SColor m_sky_bgcolor;
+ std::vector<std::string> m_sky_params;
+};
+
+#endif
diff --git a/src/rollback.cpp b/src/rollback.cpp
index 2367c3a21..4d34decf3 100644
--- a/src/rollback.cpp
+++ b/src/rollback.cpp
@@ -42,6 +42,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
}
#define SQLOK(f) SQLRES(f, SQLITE_OK)
+#define SQLOK_ERRSTREAM(s, m) \
+ if ((s) != SQLITE_OK) { \
+ errorstream << "RollbackManager: " << (m) << ": " \
+ << sqlite3_errmsg(db) << std::endl; \
+ }
+
+#define FINALIZE_STATEMENT(statement) \
+ SQLOK_ERRSTREAM(sqlite3_finalize(statement), "Failed to finalize " #statement)
class ItemStackRow : public ItemStack {
public:
@@ -93,10 +101,10 @@ RollbackManager::RollbackManager(const std::string & world_path,
std::string migrating_flag = txt_filename + ".migrating";
database_path = world_path + DIR_DELIM "rollback.sqlite";
- initDatabase();
+ bool created = initDatabase();
- if (fs::PathExists(txt_filename) && (fs::PathExists(migrating_flag) ||
- !fs::PathExists(database_path))) {
+ if (fs::PathExists(txt_filename) && (created ||
+ fs::PathExists(migrating_flag))) {
std::ofstream of(migrating_flag.c_str());
of.close();
migrate(txt_filename);
@@ -109,17 +117,17 @@ RollbackManager::~RollbackManager()
{
flush();
- SQLOK(sqlite3_finalize(stmt_insert));
- SQLOK(sqlite3_finalize(stmt_replace));
- SQLOK(sqlite3_finalize(stmt_select));
- SQLOK(sqlite3_finalize(stmt_select_range));
- SQLOK(sqlite3_finalize(stmt_select_withActor));
- SQLOK(sqlite3_finalize(stmt_knownActor_select));
- SQLOK(sqlite3_finalize(stmt_knownActor_insert));
- SQLOK(sqlite3_finalize(stmt_knownNode_select));
- SQLOK(sqlite3_finalize(stmt_knownNode_insert));
-
- SQLOK(sqlite3_close(db));
+ FINALIZE_STATEMENT(stmt_insert);
+ FINALIZE_STATEMENT(stmt_replace);
+ FINALIZE_STATEMENT(stmt_select);
+ FINALIZE_STATEMENT(stmt_select_range);
+ FINALIZE_STATEMENT(stmt_select_withActor);
+ FINALIZE_STATEMENT(stmt_knownActor_select);
+ FINALIZE_STATEMENT(stmt_knownActor_insert);
+ FINALIZE_STATEMENT(stmt_knownNode_select);
+ FINALIZE_STATEMENT(stmt_knownNode_insert);
+
+ SQLOK_ERRSTREAM(sqlite3_close(db), "Could not close db");
}
@@ -250,15 +258,15 @@ bool RollbackManager::createTables()
}
-void RollbackManager::initDatabase()
+bool RollbackManager::initDatabase()
{
verbosestream << "RollbackManager: Database connection setup" << std::endl;
- bool needsCreate = !fs::PathExists(database_path);
+ bool needs_create = !fs::PathExists(database_path);
SQLOK(sqlite3_open_v2(database_path.c_str(), &db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL));
- if (needsCreate) {
+ if (needs_create) {
createTables();
}
@@ -374,6 +382,8 @@ void RollbackManager::initDatabase()
);
}
SQLOK(sqlite3_reset(stmt_knownNode_select));
+
+ return needs_create;
}
@@ -672,23 +682,27 @@ void RollbackManager::migrate(const std::string & file_path)
std::streampos file_size = fh.tellg();
- if (file_size > 10) {
+ if (file_size < 10) {
errorstream << "Empty rollback log." << std::endl;
return;
}
fh.seekg(0);
+ sqlite3_stmt *stmt_begin;
+ sqlite3_stmt *stmt_commit;
+ SQLOK(sqlite3_prepare_v2(db, "BEGIN", -1, &stmt_begin, NULL));
+ SQLOK(sqlite3_prepare_v2(db, "COMMIT", -1, &stmt_commit, NULL));
+
std::string bit;
int i = 0;
- int id = 1;
time_t start = time(0);
time_t t = start;
- sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
+ SQLRES(sqlite3_step(stmt_begin), SQLITE_DONE);
+ sqlite3_reset(stmt_begin);
do {
ActionRow row;
-
- row.id = id;
+ row.id = 0;
// Get the timestamp
std::getline(fh, bit, ' ');
@@ -758,17 +772,24 @@ void RollbackManager::migrate(const std::string & file_path)
++i;
if (time(0) - t >= 1) {
- sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
+ SQLRES(sqlite3_step(stmt_commit), SQLITE_DONE);
+ sqlite3_reset(stmt_commit);
t = time(0);
std::cout
<< " Done: " << static_cast<int>((static_cast<float>(fh.tellg()) / static_cast<float>(file_size)) * 100) << "%"
<< " Speed: " << i / (t - start) << "/second \r" << std::flush;
- sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
+ SQLRES(sqlite3_step(stmt_begin), SQLITE_DONE);
+ sqlite3_reset(stmt_begin);
}
} while (fh.good());
+ SQLRES(sqlite3_step(stmt_commit), SQLITE_DONE);
+ sqlite3_reset(stmt_commit);
+
+ SQLOK(sqlite3_finalize(stmt_begin));
+ SQLOK(sqlite3_finalize(stmt_commit));
std::cout
- << " Done: 100% " << std::endl
+ << " Done: 100% " << std::endl
<< "Now you can delete the old rollback.txt file." << std::endl;
}
diff --git a/src/rollback.h b/src/rollback.h
index c57e38ab0..a05ef8b78 100644
--- a/src/rollback.h
+++ b/src/rollback.h
@@ -61,7 +61,7 @@ private:
const char * getActorName(const int id);
const char * getNodeName(const int id);
bool createTables();
- void initDatabase();
+ bool initDatabase();
bool registerRow(const ActionRow & row);
const std::list<ActionRow> actionRowsFromSelect(sqlite3_stmt * stmt);
ActionRow actionRowFromRollbackAction(const RollbackAction & action);
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 06e20c2a0..541744895 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -33,7 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "porting.h"
#include "mg_schematic.h"
#include "noise.h"
-#include "json/json.h"
+#include <json/json.h>
struct EnumString es_TileAnimationType[] =
{
@@ -65,9 +65,8 @@ ItemDefinition read_item_definition(lua_State* L,int index,
}
lua_pop(L, 1);
- def.stack_max = getintfield_default(L, index, "stack_max", def.stack_max);
- if(def.stack_max == 0)
- def.stack_max = 1;
+ int stack_max = getintfield_default(L, index, "stack_max", def.stack_max);
+ def.stack_max = rangelim(stack_max, 1, U16_MAX);
lua_getfield(L, index, "on_use");
def.usable = lua_isfunction(L, -1);
@@ -527,6 +526,12 @@ ContentFeatures read_content_features(lua_State *L, int index)
// Amount of light the node emits
f.light_source = getintfield_default(L, index,
"light_source", f.light_source);
+ if (f.light_source > LIGHT_MAX) {
+ warningstream << "Node " << f.name.c_str()
+ << " had greater light_source than " << LIGHT_MAX
+ << ", it was reduced." << std::endl;
+ f.light_source = LIGHT_MAX;
+ }
f.damage_per_second = getintfield_default(L, index,
"damage_per_second", f.damage_per_second);
@@ -830,20 +835,18 @@ void push_tool_capabilities(lua_State *L,
// Create groupcaps table
lua_newtable(L);
// For each groupcap
- for(std::map<std::string, ToolGroupCap>::const_iterator
- i = toolcap.groupcaps.begin(); i != toolcap.groupcaps.end(); i++){
+ for (ToolGCMap::const_iterator i = toolcap.groupcaps.begin();
+ i != toolcap.groupcaps.end(); i++) {
// Create groupcap table
lua_newtable(L);
const std::string &name = i->first;
const ToolGroupCap &groupcap = i->second;
// Create subtable "times"
lua_newtable(L);
- for(std::map<int, float>::const_iterator
- i = groupcap.times.begin(); i != groupcap.times.end(); i++){
- int rating = i->first;
- float time = i->second;
- lua_pushinteger(L, rating);
- lua_pushnumber(L, time);
+ for (UNORDERED_MAP<int, float>::const_iterator
+ i = groupcap.times.begin(); i != groupcap.times.end(); i++) {
+ lua_pushinteger(L, i->first);
+ lua_pushnumber(L, i->second);
lua_settable(L, -3);
}
// Set subtable "times"
@@ -859,8 +862,8 @@ void push_tool_capabilities(lua_State *L,
//Create damage_groups table
lua_newtable(L);
// For each damage group
- for(std::map<std::string, s16>::const_iterator
- i = toolcap.damageGroups.begin(); i != toolcap.damageGroups.end(); i++){
+ for (DamageGroup::const_iterator i = toolcap.damageGroups.begin();
+ i != toolcap.damageGroups.end(); i++) {
// Create damage group table
lua_pushinteger(L, i->second);
lua_setfield(L, -2, i->first.c_str());
@@ -1066,8 +1069,7 @@ void push_flags_string(lua_State *L, FlagDesc *flagdesc, u32 flags, u32 flagmask
/******************************************************************************/
/******************************************************************************/
-void read_groups(lua_State *L, int index,
- std::map<std::string, int> &result)
+void read_groups(lua_State *L, int index, ItemGroupList &result)
{
if (!lua_istable(L,index))
return;
@@ -1086,11 +1088,10 @@ void read_groups(lua_State *L, int index,
}
/******************************************************************************/
-void push_groups(lua_State *L, const std::map<std::string, int> &groups)
+void push_groups(lua_State *L, const ItemGroupList &groups)
{
lua_newtable(L);
- std::map<std::string, int>::const_iterator it;
- for (it = groups.begin(); it != groups.end(); ++it) {
+ for (ItemGroupList::const_iterator it = groups.begin(); it != groups.end(); ++it) {
lua_pushnumber(L, it->second);
lua_setfield(L, -2, it->first.c_str());
}
@@ -1250,8 +1251,13 @@ static bool push_json_value_helper(lua_State *L, const Json::Value &value,
lua_newtable(L);
for (Json::Value::const_iterator it = value.begin();
it != value.end(); ++it) {
+#ifndef JSONCPP_STRING
const char *str = it.memberName();
lua_pushstring(L, str ? str : "");
+#else
+ std::string str = it.name();
+ lua_pushstring(L, str.c_str());
+#endif
push_json_value_helper(L, *it, nullindex);
lua_rawset(L, -3);
}
diff --git a/src/script/common/c_content.h b/src/script/common/c_content.h
index 46416ad8e..2a2228b6d 100644
--- a/src/script/common/c_content.h
+++ b/src/script/common/c_content.h
@@ -33,11 +33,11 @@ extern "C" {
}
#include <iostream>
-#include <map>
#include <vector>
#include "irrlichttypes_bloated.h"
#include "util/string.h"
+#include "itemgroup.h"
namespace Json { class Value; }
@@ -106,10 +106,10 @@ void pushnode (lua_State *L, const MapNode &n,
NodeBox read_nodebox (lua_State *L, int index);
void read_groups (lua_State *L, int index,
- std::map<std::string, int> &result);
+ ItemGroupList &result);
void push_groups (lua_State *L,
- const std::map<std::string, int> &groups);
+ const ItemGroupList &groups);
//TODO rename to "read_enum_field"
int getenumfield (lua_State *L, int table,
diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp
index 55c4a5f5a..f36298915 100644
--- a/src/script/common/c_converter.cpp
+++ b/src/script/common/c_converter.cpp
@@ -23,6 +23,7 @@ extern "C" {
}
#include "util/numeric.h"
+#include "util/serialize.h"
#include "util/string.h"
#include "common/c_converter.h"
#include "constants.h"
@@ -37,6 +38,14 @@ extern "C" {
} \
} while(0)
#define CHECK_POS_COORD(name) CHECK_TYPE(-1, "position coordinate '" name "'", LUA_TNUMBER)
+#define CHECK_FLOAT_RANGE(value, name) \
+if (value < F1000_MIN || value > F1000_MAX) { \
+ std::ostringstream error_text; \
+ error_text << "Invalid float vector dimension range '" name "' " << \
+ "(expected " << F1000_MIN << " < " name " < " << F1000_MAX << \
+ " got " << value << ")." << std::endl; \
+ throw LuaError(error_text.str()); \
+}
#define CHECK_POS_TAB(index) CHECK_TYPE(index, "position", LUA_TTABLE)
@@ -170,14 +179,17 @@ v3f check_v3f(lua_State *L, int index)
lua_getfield(L, index, "x");
CHECK_POS_COORD("x");
pos.X = lua_tonumber(L, -1);
+ CHECK_FLOAT_RANGE(pos.X, "x")
lua_pop(L, 1);
lua_getfield(L, index, "y");
CHECK_POS_COORD("y");
pos.Y = lua_tonumber(L, -1);
+ CHECK_FLOAT_RANGE(pos.Y, "y")
lua_pop(L, 1);
lua_getfield(L, index, "z");
CHECK_POS_COORD("z");
pos.Z = lua_tonumber(L, -1);
+ CHECK_FLOAT_RANGE(pos.Z, "z")
lua_pop(L, 1);
return pos;
}
@@ -391,7 +403,7 @@ bool getintfield(lua_State *L, int table,
lua_getfield(L, table, fieldname);
bool got = false;
if(lua_isnumber(L, -1)){
- result = lua_tonumber(L, -1);
+ result = lua_tointeger(L, -1);
got = true;
}
lua_pop(L, 1);
@@ -404,7 +416,7 @@ bool getintfield(lua_State *L, int table,
lua_getfield(L, table, fieldname);
bool got = false;
if(lua_isnumber(L, -1)){
- result = lua_tonumber(L, -1);
+ result = lua_tointeger(L, -1);
got = true;
}
lua_pop(L, 1);
@@ -417,7 +429,7 @@ bool getintfield(lua_State *L, int table,
lua_getfield(L, table, fieldname);
bool got = false;
if(lua_isnumber(L, -1)){
- result = lua_tonumber(L, -1);
+ result = lua_tointeger(L, -1);
got = true;
}
lua_pop(L, 1);
@@ -430,7 +442,7 @@ bool getintfield(lua_State *L, int table,
lua_getfield(L, table, fieldname);
bool got = false;
if(lua_isnumber(L, -1)){
- result = lua_tonumber(L, -1);
+ result = lua_tointeger(L, -1);
got = true;
}
lua_pop(L, 1);
diff --git a/src/script/common/c_converter.h b/src/script/common/c_converter.h
index eefac0ed7..a5fbee765 100644
--- a/src/script/common/c_converter.h
+++ b/src/script/common/c_converter.h
@@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define C_CONVERTER_H_
#include <vector>
-#include <map>
+#include "util/cpp11_container.h"
#include "irrlichttypes_bloated.h"
#include "common/c_types.h"
@@ -60,7 +60,7 @@ bool getintfield(lua_State *L, int table,
bool getintfield(lua_State *L, int table,
const char *fieldname, u32 &result);
void read_groups(lua_State *L, int index,
- std::map<std::string, int> &result);
+ UNORDERED_MAP<std::string, int> &result);
bool getboolfield(lua_State *L, int table,
const char *fieldname, bool &result);
bool getfloatfield(lua_State *L, int table,
diff --git a/src/script/cpp_api/s_async.cpp b/src/script/cpp_api/s_async.cpp
index 9bf3fcf49..1fb84fab6 100644
--- a/src/script/cpp_api/s_async.cpp
+++ b/src/script/cpp_api/s_async.cpp
@@ -81,6 +81,7 @@ bool AsyncEngine::registerFunction(const char* name, lua_CFunction func)
if (initDone) {
return false;
}
+
functionList[name] = func;
return true;
}
@@ -203,7 +204,7 @@ void AsyncEngine::pushFinishedJobs(lua_State* L) {
/******************************************************************************/
void AsyncEngine::prepareEnvironment(lua_State* L, int top)
{
- for (std::map<std::string, lua_CFunction>::iterator it = functionList.begin();
+ for (UNORDERED_MAP<std::string, lua_CFunction>::iterator it = functionList.begin();
it != functionList.end(); it++) {
lua_pushstring(L, it->first.c_str());
lua_pushcfunction(L, it->second);
diff --git a/src/script/cpp_api/s_async.h b/src/script/cpp_api/s_async.h
index 8d612d58c..016381e5f 100644
--- a/src/script/cpp_api/s_async.h
+++ b/src/script/cpp_api/s_async.h
@@ -132,7 +132,7 @@ private:
bool initDone;
// Internal store for registred functions
- std::map<std::string, lua_CFunction> functionList;
+ UNORDERED_MAP<std::string, lua_CFunction> functionList;
// Internal counter to create job IDs
unsigned int jobIdCounter;
diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp
index 82d0d4f0e..913d8539d 100644
--- a/src/script/cpp_api/s_env.cpp
+++ b/src/script/cpp_api/s_env.cpp
@@ -212,11 +212,13 @@ void ScriptApiEnv::on_emerge_area_completion(
{
Server *server = getServer();
+ // This function should be executed with envlock held.
+ // The caller (LuaEmergeAreaCallback in src/script/lua_api/l_env.cpp)
+ // should have obtained the lock.
// Note that the order of these locks is important! Envlock must *ALWAYS*
// be acquired before attempting to acquire scriptlock, or else ServerThread
// will try to acquire scriptlock after it already owns envlock, thus
// deadlocking EmergeThread and ServerThread
- MutexAutoLock envlock(server->m_env_mutex);
SCRIPTAPI_PRECHECKHEADER
diff --git a/src/script/cpp_api/s_node.cpp b/src/script/cpp_api/s_node.cpp
index 17f0f0dac..379ed773f 100644
--- a/src/script/cpp_api/s_node.cpp
+++ b/src/script/cpp_api/s_node.cpp
@@ -58,6 +58,7 @@ struct EnumString ScriptApiNode::es_ContentParamType2[] =
{CPT2_WALLMOUNTED, "wallmounted"},
{CPT2_LEVELED, "leveled"},
{CPT2_DEGROTATE, "degrotate"},
+ {CPT2_MESHOPTIONS, "meshoptions"},
{0, NULL},
};
diff --git a/src/script/cpp_api/s_player.cpp b/src/script/cpp_api/s_player.cpp
index 807430678..a8c07476c 100644
--- a/src/script/cpp_api/s_player.cpp
+++ b/src/script/cpp_api/s_player.cpp
@@ -135,7 +135,8 @@ void ScriptApiPlayer::on_joinplayer(ServerActiveObject *player)
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
}
-void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
+void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player,
+ bool timeout)
{
SCRIPTAPI_PRECHECKHEADER
@@ -144,7 +145,8 @@ void ScriptApiPlayer::on_leaveplayer(ServerActiveObject *player)
lua_getfield(L, -1, "registered_on_leaveplayers");
// Call callbacks
objectrefGetOrCreate(L, player);
- runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
+ lua_pushboolean(L, timeout);
+ runCallbacks(2, RUN_CALLBACKS_MODE_FIRST);
}
void ScriptApiPlayer::on_cheat(ServerActiveObject *player,
diff --git a/src/script/cpp_api/s_player.h b/src/script/cpp_api/s_player.h
index 2e4dc2222..86ee1b024 100644
--- a/src/script/cpp_api/s_player.h
+++ b/src/script/cpp_api/s_player.h
@@ -38,7 +38,7 @@ public:
bool on_prejoinplayer(const std::string &name, const std::string &ip,
std::string *reason);
void on_joinplayer(ServerActiveObject *player);
- void on_leaveplayer(ServerActiveObject *player);
+ void on_leaveplayer(ServerActiveObject *player, bool timeout);
void on_cheat(ServerActiveObject *player, const std::string &cheat_type);
bool on_punchplayer(ServerActiveObject *player,
ServerActiveObject *hitter, float time_from_last_punch,
diff --git a/src/script/cpp_api/s_security.cpp b/src/script/cpp_api/s_security.cpp
index 730235c7b..1b1f148cd 100644
--- a/src/script/cpp_api/s_security.cpp
+++ b/src/script/cpp_api/s_security.cpp
@@ -249,8 +249,8 @@ bool ScriptApiSecurity::isSecure(lua_State *L)
#define CHECK_FILE_ERR(ret, fp) \
if (ret) { \
- if (fp) std::fclose(fp); \
lua_pushfstring(L, "%s: %s", path, strerror(errno)); \
+ if (fp) std::fclose(fp); \
return false; \
}
@@ -285,39 +285,50 @@ bool ScriptApiSecurity::safeLoadFile(lua_State *L, const char *path)
if (c == LUA_SIGNATURE[0]) {
lua_pushliteral(L, "Bytecode prohibited when mod security is enabled.");
+ std::fclose(fp);
+ if (path) {
+ delete [] chunk_name;
+ }
return false;
}
// Read the file
int ret = std::fseek(fp, 0, SEEK_END);
CHECK_FILE_ERR(ret, fp);
- if (ret) {
- std::fclose(fp);
- lua_pushfstring(L, "%s: %s", path, strerror(errno));
- return false;
- }
+
size_t size = std::ftell(fp) - start;
char *code = new char[size];
ret = std::fseek(fp, start, SEEK_SET);
- CHECK_FILE_ERR(ret, fp);
if (ret) {
- std::fclose(fp);
lua_pushfstring(L, "%s: %s", path, strerror(errno));
+ std::fclose(fp);
+ delete [] code;
+ if (path) {
+ delete [] chunk_name;
+ }
return false;
}
+
size_t num_read = std::fread(code, 1, size, fp);
if (path) {
std::fclose(fp);
}
if (num_read != size) {
lua_pushliteral(L, "Error reading file to load.");
+ delete [] code;
+ if (path) {
+ delete [] chunk_name;
+ }
return false;
}
if (luaL_loadbuffer(L, code, size, chunk_name)) {
+ delete [] code;
return false;
}
+ delete [] code;
+
if (path) {
delete [] chunk_name;
}
@@ -325,12 +336,15 @@ bool ScriptApiSecurity::safeLoadFile(lua_State *L, const char *path)
}
-bool ScriptApiSecurity::checkPath(lua_State *L, const char *path)
+bool ScriptApiSecurity::checkPath(lua_State *L, const char *path,
+ bool write_required, bool *write_allowed)
{
+ if (write_allowed)
+ *write_allowed = false;
+
std::string str; // Transient
- std::string norel_path = fs::RemoveRelativePathComponents(path);
- std::string abs_path = fs::AbsolutePath(norel_path);
+ std::string abs_path = fs::AbsolutePath(path);
if (!abs_path.empty()) {
// Don't allow accessing the settings file
@@ -341,18 +355,29 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path)
// If we couldn't find the absolute path (path doesn't exist) then
// try removing the last components until it works (to allow
// non-existent files/folders for mkdir).
- std::string cur_path = norel_path;
+ std::string cur_path = path;
std::string removed;
while (abs_path.empty() && !cur_path.empty()) {
- std::string tmp_rmed;
- cur_path = fs::RemoveLastPathComponent(cur_path, &tmp_rmed);
- removed = tmp_rmed + (removed.empty() ? "" : DIR_DELIM + removed);
+ std::string component;
+ cur_path = fs::RemoveLastPathComponent(cur_path, &component);
+ if (component == "..") {
+ // Parent components can't be allowed or we could allow something like
+ // /home/user/minetest/worlds/foo/noexist/../../../../../../etc/passwd.
+ // If we have previous non-relative elements in the path we might be
+ // able to remove them so that things like worlds/foo/noexist/../auth.txt
+ // could be allowed, but those paths will be interpreted as nonexistent
+ // by the operating system anyways.
+ return false;
+ }
+ removed = component + (removed.empty() ? "" : DIR_DELIM + removed);
abs_path = fs::AbsolutePath(cur_path);
}
- if (abs_path.empty()) return false;
+ if (abs_path.empty())
+ return false;
// Add the removed parts back so that you can't, eg, create a
// directory in worldmods if worldmods doesn't exist.
- if (!removed.empty()) abs_path += DIR_DELIM + removed;
+ if (!removed.empty())
+ abs_path += DIR_DELIM + removed;
// Get server from registry
lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_SCRIPTAPI);
@@ -369,32 +394,53 @@ bool ScriptApiSecurity::checkPath(lua_State *L, const char *path)
// Builtin can access anything
if (mod_name == BUILTIN_MOD_NAME) {
+ if (write_allowed) *write_allowed = true;
return true;
}
// Allow paths in mod path
- const ModSpec *mod = server->getModSpec(mod_name);
- if (mod) {
- str = fs::AbsolutePath(mod->path);
+ // Don't bother if write access isn't important, since it will be handled later
+ if (write_required || write_allowed != NULL) {
+ const ModSpec *mod = server->getModSpec(mod_name);
+ if (mod) {
+ str = fs::AbsolutePath(mod->path);
+ if (!str.empty() && fs::PathStartsWith(abs_path, str)) {
+ if (write_allowed) *write_allowed = true;
+ return true;
+ }
+ }
+ }
+ }
+ lua_pop(L, 1); // Pop mod name
+
+ // Allow read-only access to all mod directories
+ if (!write_required) {
+ const std::vector<ModSpec> mods = server->getMods();
+ for (size_t i = 0; i < mods.size(); ++i) {
+ str = fs::AbsolutePath(mods[i].path);
if (!str.empty() && fs::PathStartsWith(abs_path, str)) {
return true;
}
}
}
- lua_pop(L, 1); // Pop mod name
str = fs::AbsolutePath(server->getWorldPath());
- if (str.empty()) return false;
- // Don't allow access to world mods. We add to the absolute path
- // of the world instead of getting the absolute paths directly
- // because that won't work if they don't exist.
- if (fs::PathStartsWith(abs_path, str + DIR_DELIM + "worldmods") ||
- fs::PathStartsWith(abs_path, str + DIR_DELIM + "game")) {
- return false;
- }
- // Allow all other paths in world path
- if (fs::PathStartsWith(abs_path, str)) {
- return true;
+ if (!str.empty()) {
+ // Don't allow access to other paths in the world mod/game path.
+ // These have to be blocked so you can't override a trusted mod
+ // by creating a mod with the same name in a world mod directory.
+ // We add to the absolute path of the world instead of getting
+ // the absolute paths directly because that won't work if they
+ // don't exist.
+ if (fs::PathStartsWith(abs_path, str + DIR_DELIM + "worldmods") ||
+ fs::PathStartsWith(abs_path, str + DIR_DELIM + "game")) {
+ return false;
+ }
+ // Allow all other paths in world path
+ if (fs::PathStartsWith(abs_path, str)) {
+ if (write_allowed) *write_allowed = true;
+ return true;
+ }
}
// Default to disallowing
@@ -465,7 +511,7 @@ int ScriptApiSecurity::sl_g_loadfile(lua_State *L)
if (lua_isstring(L, 1)) {
path = lua_tostring(L, 1);
- CHECK_SECURE_PATH(L, path);
+ CHECK_SECURE_PATH_INTERNAL(L, path, false, NULL);
}
if (!safeLoadFile(L, path)) {
@@ -514,14 +560,28 @@ int ScriptApiSecurity::sl_g_require(lua_State *L)
int ScriptApiSecurity::sl_io_open(lua_State *L)
{
+ bool with_mode = lua_gettop(L) > 1;
+
luaL_checktype(L, 1, LUA_TSTRING);
const char *path = lua_tostring(L, 1);
- CHECK_SECURE_PATH(L, path);
+
+ bool write_requested = false;
+ if (with_mode) {
+ luaL_checktype(L, 2, LUA_TSTRING);
+ const char *mode = lua_tostring(L, 2);
+ write_requested = strchr(mode, 'w') != NULL ||
+ strchr(mode, '+') != NULL ||
+ strchr(mode, 'a') != NULL;
+ }
+ CHECK_SECURE_PATH_INTERNAL(L, path, write_requested, NULL);
push_original(L, "io", "open");
lua_pushvalue(L, 1);
- lua_pushvalue(L, 2);
- lua_call(L, 2, 2);
+ if (with_mode) {
+ lua_pushvalue(L, 2);
+ }
+
+ lua_call(L, with_mode ? 2 : 1, 2);
return 2;
}
@@ -530,7 +590,7 @@ int ScriptApiSecurity::sl_io_input(lua_State *L)
{
if (lua_isstring(L, 1)) {
const char *path = lua_tostring(L, 1);
- CHECK_SECURE_PATH(L, path);
+ CHECK_SECURE_PATH_INTERNAL(L, path, false, NULL);
}
push_original(L, "io", "input");
@@ -544,7 +604,7 @@ int ScriptApiSecurity::sl_io_output(lua_State *L)
{
if (lua_isstring(L, 1)) {
const char *path = lua_tostring(L, 1);
- CHECK_SECURE_PATH(L, path);
+ CHECK_SECURE_PATH_INTERNAL(L, path, true, NULL);
}
push_original(L, "io", "output");
@@ -558,16 +618,16 @@ int ScriptApiSecurity::sl_io_lines(lua_State *L)
{
if (lua_isstring(L, 1)) {
const char *path = lua_tostring(L, 1);
- CHECK_SECURE_PATH(L, path);
+ CHECK_SECURE_PATH_INTERNAL(L, path, false, NULL);
}
+ int top_precall = lua_gettop(L);
push_original(L, "io", "lines");
lua_pushvalue(L, 1);
- int top_precall = lua_gettop(L);
lua_call(L, 1, LUA_MULTRET);
// Return number of arguments returned by the function,
// adjusting for the function being poped.
- return lua_gettop(L) - (top_precall - 1);
+ return lua_gettop(L) - top_precall;
}
@@ -575,11 +635,11 @@ int ScriptApiSecurity::sl_os_rename(lua_State *L)
{
luaL_checktype(L, 1, LUA_TSTRING);
const char *path1 = lua_tostring(L, 1);
- CHECK_SECURE_PATH(L, path1);
+ CHECK_SECURE_PATH_INTERNAL(L, path1, true, NULL);
luaL_checktype(L, 2, LUA_TSTRING);
const char *path2 = lua_tostring(L, 2);
- CHECK_SECURE_PATH(L, path2);
+ CHECK_SECURE_PATH_INTERNAL(L, path2, true, NULL);
push_original(L, "os", "rename");
lua_pushvalue(L, 1);
@@ -593,7 +653,7 @@ int ScriptApiSecurity::sl_os_remove(lua_State *L)
{
luaL_checktype(L, 1, LUA_TSTRING);
const char *path = lua_tostring(L, 1);
- CHECK_SECURE_PATH(L, path);
+ CHECK_SECURE_PATH_INTERNAL(L, path, true, NULL);
push_original(L, "os", "remove");
lua_pushvalue(L, 1);
diff --git a/src/script/cpp_api/s_security.h b/src/script/cpp_api/s_security.h
index 97bc5c067..6876108e8 100644
--- a/src/script/cpp_api/s_security.h
+++ b/src/script/cpp_api/s_security.h
@@ -23,14 +23,18 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "cpp_api/s_base.h"
-#define CHECK_SECURE_PATH(L, path) \
- if (!ScriptApiSecurity::checkPath(L, path)) { \
- throw LuaError(std::string("Attempt to access external file ") + \
- path + " with mod security on."); \
+#define CHECK_SECURE_PATH_INTERNAL(L, path, write_required, ptr) \
+ if (!ScriptApiSecurity::checkPath(L, path, write_required, ptr)) { \
+ throw LuaError(std::string("Mod security: Blocked attempted ") + \
+ (write_required ? "write to " : "read from ") + path); \
}
-#define CHECK_SECURE_PATH_OPTIONAL(L, path) \
+#define CHECK_SECURE_PATH(L, path, write_required) \
if (ScriptApiSecurity::isSecure(L)) { \
- CHECK_SECURE_PATH(L, path); \
+ CHECK_SECURE_PATH_INTERNAL(L, path, write_required, NULL); \
+ }
+#define CHECK_SECURE_PATH_POSSIBLE_WRITE(L, path, ptr) \
+ if (ScriptApiSecurity::isSecure(L)) { \
+ CHECK_SECURE_PATH_INTERNAL(L, path, false, ptr); \
}
@@ -43,8 +47,9 @@ public:
static bool isSecure(lua_State *L);
// Loads a file as Lua code safely (doesn't allow bytecode).
static bool safeLoadFile(lua_State *L, const char *path);
- // Checks if mods are allowed to read and write to the path
- static bool checkPath(lua_State *L, const char *path);
+ // Checks if mods are allowed to read (and optionally write) to the path
+ static bool checkPath(lua_State *L, const char *path, bool write_required,
+ bool *write_allowed=NULL);
private:
// Syntax: "sl_" <Library name or 'g' (global)> '_' <Function name>
diff --git a/src/script/lua_api/l_areastore.cpp b/src/script/lua_api/l_areastore.cpp
index 20e7875c7..09a5c78f9 100644
--- a/src/script/lua_api/l_areastore.cpp
+++ b/src/script/lua_api/l_areastore.cpp
@@ -111,6 +111,9 @@ int LuaAreaStore::l_get_area(lua_State *L)
const Area *res;
res = ast->getArea(id);
+ if (!res)
+ return 0;
+
push_area(L, res, include_borders, include_data);
return 1;
@@ -260,7 +263,7 @@ int LuaAreaStore::l_to_file(lua_State *L)
AreaStore *ast = o->as;
const char *filename = luaL_checkstring(L, 2);
- CHECK_SECURE_PATH_OPTIONAL(L, filename);
+ CHECK_SECURE_PATH(L, filename, true);
std::ostringstream os(std::ios_base::binary);
ast->serialize(os);
@@ -291,7 +294,7 @@ int LuaAreaStore::l_from_file(lua_State *L)
LuaAreaStore *o = checkobject(L, 1);
const char *filename = luaL_checkstring(L, 2);
- CHECK_SECURE_PATH_OPTIONAL(L, filename);
+ CHECK_SECURE_PATH(L, filename, false);
std::ifstream is(filename, std::ios::binary);
return deserialization_helper(L, o->as, is);
diff --git a/src/script/lua_api/l_craft.cpp b/src/script/lua_api/l_craft.cpp
index 391a0133d..2236566de 100644
--- a/src/script/lua_api/l_craft.cpp
+++ b/src/script/lua_api/l_craft.cpp
@@ -34,7 +34,6 @@ struct EnumString ModApiCraft::es_CraftMethod[] =
{0, NULL},
};
-
// helper for register_craft
bool ModApiCraft::readCraftRecipeShaped(lua_State *L, int index,
int &width, std::vector<std::string> &recipe)
@@ -281,6 +280,80 @@ int ModApiCraft::l_register_craft(lua_State *L)
return 0; /* number of results */
}
+// clear_craft({[output=item], [recipe={{item00,item10},{item01,item11}}])
+int ModApiCraft::l_clear_craft(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ luaL_checktype(L, 1, LUA_TTABLE);
+ int table = 1;
+
+ // Get the writable craft definition manager from the server
+ IWritableCraftDefManager *craftdef =
+ getServer(L)->getWritableCraftDefManager();
+
+ std::string output = getstringfield_default(L, table, "output", "");
+ std::string type = getstringfield_default(L, table, "type", "shaped");
+ CraftOutput c_output(output, 0);
+ if (output != "") {
+ if (craftdef->clearCraftRecipesByOutput(c_output, getServer(L)))
+ return 0;
+ else
+ throw LuaError("No craft recipe known for output"
+ " (output=\"" + output + "\")");
+ }
+ std::vector<std::string> recipe;
+ int width = 0;
+ CraftMethod method = CRAFT_METHOD_NORMAL;
+ /*
+ CraftDefinitionShaped
+ */
+ if (type == "shaped") {
+ lua_getfield(L, table, "recipe");
+ if (lua_isnil(L, -1))
+ throw LuaError("Either output or recipe has to be defined");
+ if (!readCraftRecipeShaped(L, -1, width, recipe))
+ throw LuaError("Invalid crafting recipe");
+ }
+ /*
+ CraftDefinitionShapeless
+ */
+ else if (type == "shapeless") {
+ lua_getfield(L, table, "recipe");
+ if (lua_isnil(L, -1))
+ throw LuaError("Either output or recipe has to be defined");
+ if (!readCraftRecipeShapeless(L, -1, recipe))
+ throw LuaError("Invalid crafting recipe");
+ }
+ /*
+ CraftDefinitionCooking
+ */
+ else if (type == "cooking") {
+ method = CRAFT_METHOD_COOKING;
+ std::string rec = getstringfield_default(L, table, "recipe", "");
+ if (rec == "")
+ throw LuaError("Crafting definition (cooking)"
+ " is missing a recipe");
+ recipe.push_back(rec);
+ }
+ /*
+ CraftDefinitionFuel
+ */
+ else if (type == "fuel") {
+ method = CRAFT_METHOD_FUEL;
+ std::string rec = getstringfield_default(L, table, "recipe", "");
+ if (rec == "")
+ throw LuaError("Crafting definition (fuel)"
+ " is missing a recipe");
+ recipe.push_back(rec);
+ } else {
+ throw LuaError("Unknown crafting definition type: \"" + type + "\"");
+ }
+ if (!craftdef->clearCraftRecipesByInput(method, width, recipe, getServer(L)))
+ throw LuaError("No crafting specified for input");
+ lua_pop(L, 1);
+ return 0;
+}
+
// get_craft_result(input)
int ModApiCraft::l_get_craft_result(lua_State *L)
{
@@ -349,20 +422,28 @@ static void push_craft_recipe(lua_State *L, IGameDef *gdef,
}
lua_setfield(L, -2, "items");
setintfield(L, -1, "width", input.width);
+
+ std::string method_s;
switch (input.method) {
case CRAFT_METHOD_NORMAL:
- lua_pushstring(L, "normal");
+ method_s = "normal";
break;
case CRAFT_METHOD_COOKING:
- lua_pushstring(L, "cooking");
+ method_s = "cooking";
break;
case CRAFT_METHOD_FUEL:
- lua_pushstring(L, "fuel");
+ method_s = "fuel";
break;
default:
- lua_pushstring(L, "unknown");
+ method_s = "unknown";
}
+ lua_pushstring(L, method_s.c_str());
+ lua_setfield(L, -2, "method");
+
+ // Deprecated, only for compatibility's sake
+ lua_pushstring(L, method_s.c_str());
lua_setfield(L, -2, "type");
+
lua_pushstring(L, output.item.c_str());
lua_setfield(L, -2, "output");
}
@@ -431,4 +512,5 @@ void ModApiCraft::Initialize(lua_State *L, int top)
API_FCT(get_craft_recipe);
API_FCT(get_craft_result);
API_FCT(register_craft);
+ API_FCT(clear_craft);
}
diff --git a/src/script/lua_api/l_craft.h b/src/script/lua_api/l_craft.h
index 548608776..eb2bce706 100644
--- a/src/script/lua_api/l_craft.h
+++ b/src/script/lua_api/l_craft.h
@@ -33,6 +33,7 @@ private:
static int l_get_craft_recipe(lua_State *L);
static int l_get_all_craft_recipes(lua_State *L);
static int l_get_craft_result(lua_State *L);
+ static int l_clear_craft(lua_State *L);
static bool readCraftReplacements(lua_State *L, int index,
CraftReplacements &replacements);
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index 8284c3fcb..68d10308c 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -137,6 +137,10 @@ void LuaEmergeAreaCallback(v3s16 blockpos, EmergeAction action, void *param)
assert(state->script != NULL);
assert(state->refcount > 0);
+ // state must be protected by envlock
+ Server *server = state->script->getServer();
+ MutexAutoLock envlock(server->m_env_mutex);
+
state->refcount--;
state->script->on_emerge_area_completion(blockpos, action, state);
@@ -494,8 +498,8 @@ int ModApiEnvMod::l_get_player_by_name(lua_State *L)
// Do it
const char *name = luaL_checkstring(L, 1);
- Player *player = env->getPlayer(name);
- if(player == NULL){
+ RemotePlayer *player = dynamic_cast<RemotePlayer *>(env->getPlayer(name));
+ if (player == NULL){
lua_pushnil(L);
return 1;
}
@@ -758,7 +762,7 @@ int ModApiEnvMod::l_get_perlin_map(lua_State *L)
return 0;
v3s16 size = read_v3s16(L, 2);
- int seed = (int)(env->getServerMap().getSeed());
+ s32 seed = (s32)(env->getServerMap().getSeed());
LuaPerlinNoiseMap *n = new LuaPerlinNoiseMap(&np, seed, size);
*(void **)(lua_newuserdata(L, sizeof(void *))) = n;
luaL_getmetatable(L, "PerlinNoiseMap");
diff --git a/src/script/lua_api/l_inventory.cpp b/src/script/lua_api/l_inventory.cpp
index de9f9374a..38eade609 100644
--- a/src/script/lua_api/l_inventory.cpp
+++ b/src/script/lua_api/l_inventory.cpp
@@ -420,7 +420,7 @@ void InvRef::create(lua_State *L, const InventoryLocation &loc)
luaL_getmetatable(L, className);
lua_setmetatable(L, -2);
}
-void InvRef::createPlayer(lua_State *L, Player *player)
+void InvRef::createPlayer(lua_State *L, RemotePlayer *player)
{
NO_MAP_LOCK_REQUIRED;
InventoryLocation loc;
@@ -520,16 +520,17 @@ int ModApiInventory::l_get_inventory(lua_State *L)
}
}
-// create_detached_inventory_raw(name)
+// create_detached_inventory_raw(name, [player_name])
int ModApiInventory::l_create_detached_inventory_raw(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
const char *name = luaL_checkstring(L, 1);
- if(getServer(L)->createDetachedInventory(name) != NULL){
+ const char *player = lua_isstring(L, 2) ? lua_tostring(L, 2) : "";
+ if (getServer(L)->createDetachedInventory(name, player) != NULL) {
InventoryLocation loc;
loc.setDetached(name);
InvRef::create(L, loc);
- }else{
+ } else {
lua_pushnil(L);
}
return 1;
diff --git a/src/script/lua_api/l_inventory.h b/src/script/lua_api/l_inventory.h
index 2d4b29d0c..cc5333965 100644
--- a/src/script/lua_api/l_inventory.h
+++ b/src/script/lua_api/l_inventory.h
@@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "inventory.h"
#include "inventorymanager.h"
-class Player;
+class RemotePlayer;
/*
InvRef
@@ -112,7 +112,7 @@ public:
// Creates an InvRef and leaves it on top of stack
// Not callable from Lua; all references are created on the C side.
static void create(lua_State *L, const InventoryLocation &loc);
- static void createPlayer(lua_State *L, Player *player);
+ static void createPlayer(lua_State *L, RemotePlayer *player);
static void createNodeMeta(lua_State *L, v3s16 p);
static void Register(lua_State *L);
};
@@ -123,11 +123,6 @@ private:
static int l_get_inventory(lua_State *L);
- static void inventory_set_list_from_lua(Inventory *inv, const char *name,
- lua_State *L, int tableindex, int forcesize);
- static void inventory_get_list_to_lua(Inventory *inv, const char *name,
- lua_State *L);
-
public:
static void Initialize(lua_State *L, int top);
};
diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp
index 5381cba76..ff0baea14 100644
--- a/src/script/lua_api/l_item.cpp
+++ b/src/script/lua_api/l_item.cpp
@@ -525,6 +525,27 @@ int ModApiItemMod::l_register_item_raw(lua_State *L)
return 0; /* number of results */
}
+// unregister_item(name)
+int ModApiItemMod::l_unregister_item_raw(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ std::string name = luaL_checkstring(L, 1);
+
+ IWritableItemDefManager *idef =
+ getServer(L)->getWritableItemDefManager();
+
+ // Unregister the node
+ if (idef->get(name).type == ITEM_NODE) {
+ IWritableNodeDefManager *ndef =
+ getServer(L)->getWritableNodeDefManager();
+ ndef->removeNode(name);
+ }
+
+ idef->unregisterItem(name);
+
+ return 0; /* number of results */
+}
+
// register_alias_raw(name, convert_to_name)
int ModApiItemMod::l_register_alias_raw(lua_State *L)
{
@@ -570,6 +591,7 @@ int ModApiItemMod::l_get_name_from_content_id(lua_State *L)
void ModApiItemMod::Initialize(lua_State *L, int top)
{
API_FCT(register_item_raw);
+ API_FCT(unregister_item_raw);
API_FCT(register_alias_raw);
API_FCT(get_content_id);
API_FCT(get_name_from_content_id);
diff --git a/src/script/lua_api/l_item.h b/src/script/lua_api/l_item.h
index 0f9e4ba9b..be919b701 100644
--- a/src/script/lua_api/l_item.h
+++ b/src/script/lua_api/l_item.h
@@ -135,6 +135,7 @@ public:
class ModApiItemMod : public ModApiBase {
private:
static int l_register_item_raw(lua_State *L);
+ static int l_unregister_item_raw(lua_State *L);
static int l_register_alias_raw(lua_State *L);
static int l_get_content_id(lua_State *L);
static int l_get_name_from_content_id(lua_State *L);
diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp
index 7b29db159..4a2484613 100644
--- a/src/script/lua_api/l_mainmenu.cpp
+++ b/src/script/lua_api/l_mainmenu.cpp
@@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "filesys.h"
#include "convert_json.h"
#include "serverlist.h"
-#include "emerge.h"
+#include "mapgen.h"
#include "sound.h"
#include "settings.h"
#include "log.h"
@@ -707,7 +707,7 @@ int ModApiMainMenu::l_set_topleft_text(lua_State *L)
int ModApiMainMenu::l_get_mapgen_names(lua_State *L)
{
std::vector<const char *> names;
- EmergeManager::getMapgenNames(&names, lua_toboolean(L, 1));
+ Mapgen::getMapgenNames(&names, lua_toboolean(L, 1));
lua_newtable(L);
for (size_t i = 0; i != names.size(); i++) {
@@ -956,13 +956,6 @@ int ModApiMainMenu::l_show_file_open_dialog(lua_State *L)
}
/******************************************************************************/
-int ModApiMainMenu::l_get_version(lua_State *L)
-{
- lua_pushstring(L, g_version_string);
- return 1;
-}
-
-/******************************************************************************/
int ModApiMainMenu::l_sound_play(lua_State *L)
{
GUIEngine* engine = getGuiEngine(L);
@@ -1157,7 +1150,6 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
API_FCT(extract_zip);
API_FCT(get_mainmenu_path);
API_FCT(show_file_open_dialog);
- API_FCT(get_version);
API_FCT(download_file);
API_FCT(get_modstore_details);
API_FCT(get_modstore_list);
@@ -1188,7 +1180,6 @@ void ModApiMainMenu::InitializeAsync(AsyncEngine& engine)
ASYNC_API_FCT(delete_dir);
ASYNC_API_FCT(copy_dir);
//ASYNC_API_FCT(extract_zip); //TODO remove dependency to GuiEngine
- ASYNC_API_FCT(get_version);
ASYNC_API_FCT(download_file);
ASYNC_API_FCT(get_modstore_details);
ASYNC_API_FCT(get_modstore_list);
diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h
index 405af25e8..ad5155ac6 100644
--- a/src/script/lua_api/l_mainmenu.h
+++ b/src/script/lua_api/l_mainmenu.h
@@ -79,8 +79,6 @@ private:
static int l_delete_favorite(lua_State *L);
- static int l_get_version(lua_State *L);
-
static int l_sound_play(lua_State *L);
static int l_sound_stop(lua_State *L);
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index fb839176b..bc1c32f03 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -39,11 +39,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
struct EnumString ModApiMapgen::es_BiomeTerrainType[] =
{
- {BIOME_NORMAL, "normal"},
- {BIOME_LIQUID, "liquid"},
- {BIOME_NETHER, "nether"},
- {BIOME_AETHER, "aether"},
- {BIOME_FLAT, "flat"},
+ {BIOMETYPE_NORMAL, "normal"},
+ {BIOMETYPE_LIQUID, "liquid"},
+ {BIOMETYPE_NETHER, "nether"},
+ {BIOMETYPE_AETHER, "aether"},
+ {BIOMETYPE_FLAT, "flat"},
{0, NULL},
};
@@ -100,7 +100,7 @@ Biome *get_or_load_biome(lua_State *L, int index,
BiomeManager *biomemgr);
Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef);
size_t get_biome_list(lua_State *L, int index,
- BiomeManager *biomemgr, std::set<u8> *biome_id_list);
+ BiomeManager *biomemgr, UNORDERED_SET<u8> *biome_id_list);
Schematic *get_or_load_schematic(lua_State *L, int index,
SchematicManager *schemmgr, StringMap *replace_names);
@@ -244,7 +244,7 @@ bool read_schematic_def(lua_State *L, int index,
schem->schemdata = new MapNode[numnodes];
size_t names_base = names->size();
- std::map<std::string, content_t> name_id_map;
+ UNORDERED_MAP<std::string, content_t> name_id_map;
u32 i = 0;
for (lua_pushnil(L); lua_next(L, -2); i++, lua_pop(L, 1)) {
@@ -266,7 +266,7 @@ bool read_schematic_def(lua_State *L, int index,
u8 param2 = getintfield_default(L, -1, "param2", 0);
//// Find or add new nodename-to-ID mapping
- std::map<std::string, content_t>::iterator it = name_id_map.find(name);
+ UNORDERED_MAP<std::string, content_t>::iterator it = name_id_map.find(name);
content_t name_index;
if (it != name_id_map.end()) {
name_index = it->second;
@@ -371,13 +371,14 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
return NULL;
BiomeType biometype = (BiomeType)getenumfield(L, index, "type",
- ModApiMapgen::es_BiomeTerrainType, BIOME_NORMAL);
+ ModApiMapgen::es_BiomeTerrainType, BIOMETYPE_NORMAL);
Biome *b = BiomeManager::create(biometype);
b->name = getstringfield_default(L, index, "name", "");
b->depth_top = getintfield_default(L, index, "depth_top", 0);
b->depth_filler = getintfield_default(L, index, "depth_filler", -31000);
b->depth_water_top = getintfield_default(L, index, "depth_water_top", 0);
+ b->depth_riverbed = getintfield_default(L, index, "depth_riverbed", 0);
b->y_min = getintfield_default(L, index, "y_min", -31000);
b->y_max = getintfield_default(L, index, "y_max", 31000);
b->heat_point = getfloatfield_default(L, index, "heat_point", 0.f);
@@ -391,6 +392,7 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
nn.push_back(getstringfield_default(L, index, "node_water_top", ""));
nn.push_back(getstringfield_default(L, index, "node_water", ""));
nn.push_back(getstringfield_default(L, index, "node_river_water", ""));
+ nn.push_back(getstringfield_default(L, index, "node_riverbed", ""));
nn.push_back(getstringfield_default(L, index, "node_dust", ""));
ndef->pendNodeResolve(b);
@@ -399,7 +401,7 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
size_t get_biome_list(lua_State *L, int index,
- BiomeManager *biomemgr, std::set<u8> *biome_id_list)
+ BiomeManager *biomemgr, UNORDERED_SET<u8> *biome_id_list)
{
if (index < 0)
index = lua_gettop(L) + 1 + index;
@@ -528,24 +530,26 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
return 1;
}
case MGOBJ_BIOMEMAP: {
- if (!mg->biomemap)
+ if (!mg->biomegen)
return 0;
lua_newtable(L);
for (size_t i = 0; i != maplen; i++) {
- lua_pushinteger(L, mg->biomemap[i]);
+ lua_pushinteger(L, mg->biomegen->biomemap[i]);
lua_rawseti(L, -2, i + 1);
}
return 1;
}
case MGOBJ_HEATMAP: {
- if (!mg->heatmap)
+ if (!mg->biomegen || mg->biomegen->getType() != BIOMEGEN_ORIGINAL)
return 0;
+ BiomeGenOriginal *bg = (BiomeGenOriginal *)mg->biomegen;
+
lua_newtable(L);
for (size_t i = 0; i != maplen; i++) {
- lua_pushnumber(L, mg->heatmap[i]);
+ lua_pushnumber(L, bg->heatmap[i]);
lua_rawseti(L, -2, i + 1);
}
@@ -553,12 +557,14 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
}
case MGOBJ_HUMIDMAP: {
- if (!mg->humidmap)
+ if (!mg->biomegen || mg->biomegen->getType() != BIOMEGEN_ORIGINAL)
return 0;
+ BiomeGenOriginal *bg = (BiomeGenOriginal *)mg->biomegen;
+
lua_newtable(L);
for (size_t i = 0; i != maplen; i++) {
- lua_pushnumber(L, mg->humidmap[i]);
+ lua_pushnumber(L, bg->humidmap[i]);
lua_rawseti(L, -2, i + 1);
}
@@ -594,24 +600,37 @@ int ModApiMapgen::l_get_mapgen_params(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- MapgenParams *params = &getServer(L)->getEmergeManager()->params;
+ log_deprecated(L, "get_mapgen_params is deprecated; "
+ "use get_mapgen_setting instead");
+
+ std::string value;
+
+ MapSettingsManager *settingsmgr =
+ getServer(L)->getEmergeManager()->map_settings_mgr;
lua_newtable(L);
- lua_pushstring(L, params->mg_name.c_str());
+ settingsmgr->getMapSetting("mg_name", &value);
+ lua_pushstring(L, value.c_str());
lua_setfield(L, -2, "mgname");
- lua_pushinteger(L, params->seed);
+ settingsmgr->getMapSetting("seed", &value);
+ std::istringstream ss(value);
+ u64 seed;
+ ss >> seed;
+ lua_pushinteger(L, seed);
lua_setfield(L, -2, "seed");
- lua_pushinteger(L, params->water_level);
+ settingsmgr->getMapSetting("water_level", &value);
+ lua_pushinteger(L, stoi(value, -32768, 32767));
lua_setfield(L, -2, "water_level");
- lua_pushinteger(L, params->chunksize);
+ settingsmgr->getMapSetting("chunksize", &value);
+ lua_pushinteger(L, stoi(value, -32768, 32767));
lua_setfield(L, -2, "chunksize");
- std::string flagstr = writeFlagString(params->flags, flagdesc_mapgen, U32_MAX);
- lua_pushstring(L, flagstr.c_str());
+ settingsmgr->getMapSetting("mg_flags", &value);
+ lua_pushstring(L, value.c_str());
lua_setfield(L, -2, "flags");
return 1;
@@ -624,44 +643,120 @@ int ModApiMapgen::l_set_mapgen_params(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
+ log_deprecated(L, "set_mapgen_params is deprecated; "
+ "use set_mapgen_setting instead");
+
if (!lua_istable(L, 1))
return 0;
- EmergeManager *emerge = getServer(L)->getEmergeManager();
- if (emerge->isRunning())
- throw LuaError("Cannot set parameters while mapgen is running");
-
- MapgenParams *params = &emerge->params;
- u32 flags = 0, flagmask = 0;
+ MapSettingsManager *settingsmgr =
+ getServer(L)->getEmergeManager()->map_settings_mgr;
lua_getfield(L, 1, "mgname");
- if (lua_isstring(L, -1)) {
- params->mg_name = lua_tostring(L, -1);
- delete params->sparams;
- params->sparams = NULL;
- }
+ if (lua_isstring(L, -1))
+ settingsmgr->setMapSetting("mg_name", lua_tostring(L, -1), true);
lua_getfield(L, 1, "seed");
if (lua_isnumber(L, -1))
- params->seed = lua_tointeger(L, -1);
+ settingsmgr->setMapSetting("seed", lua_tostring(L, -1), true);
lua_getfield(L, 1, "water_level");
if (lua_isnumber(L, -1))
- params->water_level = lua_tointeger(L, -1);
+ settingsmgr->setMapSetting("water_level", lua_tostring(L, -1), true);
lua_getfield(L, 1, "chunksize");
if (lua_isnumber(L, -1))
- params->chunksize = lua_tointeger(L, -1);
+ settingsmgr->setMapSetting("chunksize", lua_tostring(L, -1), true);
warn_if_field_exists(L, 1, "flagmask",
"Deprecated: flags field now includes unset flags.");
- lua_getfield(L, 1, "flagmask");
+
+ lua_getfield(L, 1, "flags");
if (lua_isstring(L, -1))
- params->flags &= ~readFlagString(lua_tostring(L, -1), flagdesc_mapgen, NULL);
+ settingsmgr->setMapSetting("mg_flags", lua_tostring(L, -1), true);
+
+ return 0;
+}
+
+// get_mapgen_setting(name)
+int ModApiMapgen::l_get_mapgen_setting(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ std::string value;
+ MapSettingsManager *settingsmgr =
+ getServer(L)->getEmergeManager()->map_settings_mgr;
- if (getflagsfield(L, 1, "flags", flagdesc_mapgen, &flags, &flagmask)) {
- params->flags &= ~flagmask;
- params->flags |= flags;
+ const char *name = luaL_checkstring(L, 1);
+ if (!settingsmgr->getMapSetting(name, &value))
+ return 0;
+
+ lua_pushstring(L, value.c_str());
+ return 1;
+}
+
+// get_mapgen_setting_noiseparams(name)
+int ModApiMapgen::l_get_mapgen_setting_noiseparams(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ NoiseParams np;
+ MapSettingsManager *settingsmgr =
+ getServer(L)->getEmergeManager()->map_settings_mgr;
+
+ const char *name = luaL_checkstring(L, 1);
+ if (!settingsmgr->getMapSettingNoiseParams(name, &np))
+ return 0;
+
+ push_noiseparams(L, &np);
+ return 1;
+}
+
+// set_mapgen_setting(name, value, override_meta)
+// set mapgen config values
+int ModApiMapgen::l_set_mapgen_setting(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ MapSettingsManager *settingsmgr =
+ getServer(L)->getEmergeManager()->map_settings_mgr;
+
+ const char *name = luaL_checkstring(L, 1);
+ const char *value = luaL_checkstring(L, 2);
+ bool override_meta = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : false;
+
+ if (!settingsmgr->setMapSetting(name, value, override_meta)) {
+ errorstream << "set_mapgen_setting: cannot set '"
+ << name << "' after initialization" << std::endl;
+ }
+
+ return 0;
+}
+
+
+// set_mapgen_setting_noiseparams(name, noiseparams, set_default)
+// set mapgen config values for noise parameters
+int ModApiMapgen::l_set_mapgen_setting_noiseparams(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ MapSettingsManager *settingsmgr =
+ getServer(L)->getEmergeManager()->map_settings_mgr;
+
+ const char *name = luaL_checkstring(L, 1);
+
+ NoiseParams np;
+ if (!read_noiseparams(L, 2, &np)) {
+ errorstream << "set_mapgen_setting_noiseparams: cannot set '" << name
+ << "'; invalid noiseparams table" << std::endl;
+ return 0;
+ }
+
+ bool override_meta = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : false;
+
+ if (!settingsmgr->setMapSettingNoiseParams(name, &np, override_meta)) {
+ errorstream << "set_mapgen_setting_noiseparams: cannot set '"
+ << name << "' after initialization" << std::endl;
}
return 0;
@@ -677,8 +772,11 @@ int ModApiMapgen::l_set_noiseparams(lua_State *L)
const char *name = luaL_checkstring(L, 1);
NoiseParams np;
- if (!read_noiseparams(L, 2, &np))
+ if (!read_noiseparams(L, 2, &np)) {
+ errorstream << "set_noiseparams: cannot set '" << name
+ << "'; invalid noiseparams table" << std::endl;
return 0;
+ }
bool set_default = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : true;
@@ -804,6 +902,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
deco->fill_ratio = getfloatfield_default(L, index, "fill_ratio", 0.02);
deco->y_min = getintfield_default(L, index, "y_min", -31000);
deco->y_max = getintfield_default(L, index, "y_max", 31000);
+ deco->nspawnby = getintfield_default(L, index, "num_spawn_by", -1);
deco->sidelen = getintfield_default(L, index, "sidelen", 8);
if (deco->sidelen <= 0) {
errorstream << "register_decoration: sidelen must be "
@@ -831,6 +930,14 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
errorstream << "register_decoration: couldn't get all biomes " << std::endl;
lua_pop(L, 1);
+ //// Get node name(s) to 'spawn by'
+ size_t nnames = getstringlistfield(L, index, "spawn_by", &deco->m_nodenames);
+ deco->m_nnlistsizes.push_back(nnames);
+ if (nnames == 0 && deco->nspawnby != -1) {
+ errorstream << "register_decoration: no spawn_by nodes defined,"
+ " but num_spawn_by specified" << std::endl;
+ }
+
//// Handle decoration type-specific parameters
bool success = false;
switch (decotype) {
@@ -864,12 +971,11 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
bool read_deco_simple(lua_State *L, DecoSimple *deco)
{
- size_t nnames;
int index = 1;
+ int param2;
deco->deco_height = getintfield_default(L, index, "height", 1);
deco->deco_height_max = getintfield_default(L, index, "height_max", 0);
- deco->nspawnby = getintfield_default(L, index, "num_spawn_by", -1);
if (deco->deco_height <= 0) {
errorstream << "register_decoration: simple decoration height"
@@ -877,7 +983,7 @@ bool read_deco_simple(lua_State *L, DecoSimple *deco)
return false;
}
- nnames = getstringlistfield(L, index, "decoration", &deco->m_nodenames);
+ size_t nnames = getstringlistfield(L, index, "decoration", &deco->m_nodenames);
deco->m_nnlistsizes.push_back(nnames);
if (nnames == 0) {
errorstream << "register_decoration: no decoration nodes "
@@ -885,13 +991,13 @@ bool read_deco_simple(lua_State *L, DecoSimple *deco)
return false;
}
- nnames = getstringlistfield(L, index, "spawn_by", &deco->m_nodenames);
- deco->m_nnlistsizes.push_back(nnames);
- if (nnames == 0 && deco->nspawnby != -1) {
- errorstream << "register_decoration: no spawn_by nodes defined,"
- " but num_spawn_by specified" << std::endl;
+ param2 = getintfield_default(L, index, "param2", 0);
+ if ((param2 < 0) || (param2 > 255)) {
+ errorstream << "register_decoration: param2 out of bounds (0-255)"
+ << std::endl;
return false;
}
+ deco->deco_param2 = (u8)param2;
return true;
}
@@ -1137,7 +1243,7 @@ int ModApiMapgen::l_generate_ores(lua_State *L)
EmergeManager *emerge = getServer(L)->getEmergeManager();
Mapgen mg;
- mg.seed = emerge->params.seed;
+ mg.seed = emerge->mgparams->seed;
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
mg.ndef = getServer(L)->getNodeDefManager();
@@ -1163,7 +1269,7 @@ int ModApiMapgen::l_generate_decorations(lua_State *L)
EmergeManager *emerge = getServer(L)->getEmergeManager();
Mapgen mg;
- mg.seed = emerge->params.seed;
+ mg.seed = emerge->mgparams->seed;
mg.vm = LuaVoxelManip::checkobject(L, 1)->vm;
mg.ndef = getServer(L)->getNodeDefManager();
@@ -1189,7 +1295,7 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
INodeDefManager *ndef = getServer(L)->getNodeDefManager();
const char *filename = luaL_checkstring(L, 4);
- CHECK_SECURE_PATH_OPTIONAL(L, filename);
+ CHECK_SECURE_PATH(L, filename, true);
Map *map = &(getEnv(L)->getMap());
Schematic schem;
@@ -1387,6 +1493,10 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
API_FCT(get_mapgen_params);
API_FCT(set_mapgen_params);
+ API_FCT(get_mapgen_setting);
+ API_FCT(set_mapgen_setting);
+ API_FCT(get_mapgen_setting_noiseparams);
+ API_FCT(set_mapgen_setting_noiseparams);
API_FCT(set_noiseparams);
API_FCT(get_noiseparams);
API_FCT(set_gen_notify);
diff --git a/src/script/lua_api/l_mapgen.h b/src/script/lua_api/l_mapgen.h
index 9751c0db6..bb94575c7 100644
--- a/src/script/lua_api/l_mapgen.h
+++ b/src/script/lua_api/l_mapgen.h
@@ -40,6 +40,18 @@ private:
// set mapgen parameters
static int l_set_mapgen_params(lua_State *L);
+ // get_mapgen_setting(name)
+ static int l_get_mapgen_setting(lua_State *L);
+
+ // set_mapgen_setting(name, value, override_meta)
+ static int l_set_mapgen_setting(lua_State *L);
+
+ // get_mapgen_setting_noiseparams(name)
+ static int l_get_mapgen_setting_noiseparams(lua_State *L);
+
+ // set_mapgen_setting_noiseparams(name, value, override_meta)
+ static int l_set_mapgen_setting_noiseparams(lua_State *L);
+
// set_noiseparam_defaults(name, noiseparams, set_default)
static int l_set_noiseparams(lua_State *L);
diff --git a/src/script/lua_api/l_nodetimer.cpp b/src/script/lua_api/l_nodetimer.cpp
index 601113516..3242d6ea5 100644
--- a/src/script/lua_api/l_nodetimer.cpp
+++ b/src/script/lua_api/l_nodetimer.cpp
@@ -45,7 +45,7 @@ int NodeTimerRef::l_set(lua_State *L)
if(env == NULL) return 0;
f32 t = luaL_checknumber(L,2);
f32 e = luaL_checknumber(L,3);
- env->getMap().setNodeTimer(o->m_p,NodeTimer(t,e));
+ env->getMap().setNodeTimer(NodeTimer(t, e, o->m_p));
return 0;
}
@@ -56,7 +56,7 @@ int NodeTimerRef::l_start(lua_State *L)
ServerEnvironment *env = o->m_env;
if(env == NULL) return 0;
f32 t = luaL_checknumber(L,2);
- env->getMap().setNodeTimer(o->m_p,NodeTimer(t,0));
+ env->getMap().setNodeTimer(NodeTimer(t, 0, o->m_p));
return 0;
}
diff --git a/src/script/lua_api/l_noise.cpp b/src/script/lua_api/l_noise.cpp
index 04dc6048f..e0039371f 100644
--- a/src/script/lua_api/l_noise.cpp
+++ b/src/script/lua_api/l_noise.cpp
@@ -146,7 +146,7 @@ const luaL_reg LuaPerlinNoise::methods[] = {
LuaPerlinNoiseMap
*/
-LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *params, int seed, v3s16 size)
+LuaPerlinNoiseMap::LuaPerlinNoiseMap(NoiseParams *params, s32 seed, v3s16 size)
{
m_is3d = size.Z > 1;
np = *params;
diff --git a/src/script/lua_api/l_noise.h b/src/script/lua_api/l_noise.h
index 492eb7550..40bfd1315 100644
--- a/src/script/lua_api/l_noise.h
+++ b/src/script/lua_api/l_noise.h
@@ -79,7 +79,7 @@ class LuaPerlinNoiseMap : public ModApiBase {
static int l_getMapSlice(lua_State *L);
public:
- LuaPerlinNoiseMap(NoiseParams *np, int seed, v3s16 size);
+ LuaPerlinNoiseMap(NoiseParams *np, s32 seed, v3s16 size);
~LuaPerlinNoiseMap();
@@ -111,7 +111,7 @@ private:
static int l_next(lua_State *L);
public:
- LuaPseudoRandom(int seed) :
+ LuaPseudoRandom(s32 seed) :
m_pseudo(seed) {}
// LuaPseudoRandom(seed)
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index 6d6614e7d..2a8b8a64e 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -107,7 +107,7 @@ PlayerSAO* ObjectRef::getplayersao(ObjectRef *ref)
return (PlayerSAO*)obj;
}
-Player* ObjectRef::getplayer(ObjectRef *ref)
+RemotePlayer *ObjectRef::getplayer(ObjectRef *ref)
{
PlayerSAO *playersao = getplayersao(ref);
if (playersao == NULL)
@@ -137,11 +137,12 @@ int ObjectRef::l_remove(lua_State *L)
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
return 0;
- std::set<int> child_ids = co->getAttachmentChildIds();
- std::set<int>::iterator it;
+ UNORDERED_SET<int> child_ids = co->getAttachmentChildIds();
+ UNORDERED_SET<int>::iterator it;
for (it = child_ids.begin(); it != child_ids.end(); ++it) {
- ServerActiveObject *child = env->getActiveObject(*it);
- child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
+ // Child can be NULL if it was deleted earlier
+ if (ServerActiveObject *child = env->getActiveObject(*it))
+ child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
}
verbosestream<<"ObjectRef::l_remove(): id="<<co->getId()<<std::endl;
@@ -508,7 +509,7 @@ int ObjectRef::l_set_local_animation(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
// Do it
@@ -533,7 +534,7 @@ int ObjectRef::l_get_local_animation(lua_State *L)
{
NO_MAP_LOCK_REQUIRED
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -554,7 +555,7 @@ int ObjectRef::l_set_eye_offset(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
// Do it
@@ -584,7 +585,7 @@ int ObjectRef::l_get_eye_offset(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
// Do it
@@ -606,10 +607,10 @@ int ObjectRef::l_set_bone_position(lua_State *L)
bone = lua_tostring(L, 2);
v3f position = v3f(0, 0, 0);
if (!lua_isnil(L, 3))
- position = read_v3f(L, 3);
+ position = check_v3f(L, 3);
v3f rotation = v3f(0, 0, 0);
if (!lua_isnil(L, 4))
- rotation = read_v3f(L, 4);
+ rotation = check_v3f(L, 4);
co->setBonePosition(bone, position, rotation);
return 0;
}
@@ -762,7 +763,7 @@ int ObjectRef::l_is_player(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
lua_pushboolean(L, (player != NULL));
return 1;
}
@@ -973,7 +974,7 @@ int ObjectRef::l_is_player_connected(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
lua_pushboolean(L, (player != NULL && player->peer_id != 0));
return 1;
}
@@ -983,7 +984,7 @@ int ObjectRef::l_get_player_name(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL) {
lua_pushlstring(L, "", 0);
return 1;
@@ -998,7 +999,7 @@ int ObjectRef::l_get_player_velocity(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL) {
lua_pushnil(L);
return 1;
@@ -1013,63 +1014,133 @@ int ObjectRef::l_get_look_dir(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL) return 0;
+ PlayerSAO* co = getplayersao(ref);
+ if (co == NULL) return 0;
// Do it
- float pitch = player->getRadPitch();
- float yaw = player->getRadYaw();
+ float pitch = co->getRadPitchDep();
+ float yaw = co->getRadYawDep();
v3f v(cos(pitch)*cos(yaw), sin(pitch), cos(pitch)*sin(yaw));
push_v3f(L, v);
return 1;
}
+// DEPRECATED
// get_look_pitch(self)
int ObjectRef::l_get_look_pitch(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
+
+ log_deprecated(L,
+ "Deprecated call to get_look_pitch, use get_look_vertical instead");
+
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL) return 0;
+ PlayerSAO* co = getplayersao(ref);
+ if (co == NULL) return 0;
// Do it
- lua_pushnumber(L, player->getRadPitch());
+ lua_pushnumber(L, co->getRadPitchDep());
return 1;
}
+// DEPRECATED
// get_look_yaw(self)
int ObjectRef::l_get_look_yaw(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
+
+ log_deprecated(L,
+ "Deprecated call to get_look_yaw, use get_look_horizontal instead");
+
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
- if (player == NULL) return 0;
+ PlayerSAO* co = getplayersao(ref);
+ if (co == NULL) return 0;
+ // Do it
+ lua_pushnumber(L, co->getRadYawDep());
+ return 1;
+}
+
+// get_look_pitch2(self)
+int ObjectRef::l_get_look_vertical(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ ObjectRef *ref = checkobject(L, 1);
+ PlayerSAO* co = getplayersao(ref);
+ if (co == NULL) return 0;
+ // Do it
+ lua_pushnumber(L, co->getRadPitch());
+ return 1;
+}
+
+// get_look_yaw2(self)
+int ObjectRef::l_get_look_horizontal(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ ObjectRef *ref = checkobject(L, 1);
+ PlayerSAO* co = getplayersao(ref);
+ if (co == NULL) return 0;
+ // Do it
+ lua_pushnumber(L, co->getRadYaw());
+ return 1;
+}
+
+// set_look_vertical(self, radians)
+int ObjectRef::l_set_look_vertical(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ ObjectRef *ref = checkobject(L, 1);
+ PlayerSAO* co = getplayersao(ref);
+ if (co == NULL) return 0;
+ float pitch = luaL_checknumber(L, 2) * core::RADTODEG;
// Do it
- lua_pushnumber(L, player->getRadYaw());
+ co->setPitchAndSend(pitch);
return 1;
}
+// set_look_horizontal(self, radians)
+int ObjectRef::l_set_look_horizontal(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ ObjectRef *ref = checkobject(L, 1);
+ PlayerSAO* co = getplayersao(ref);
+ if (co == NULL) return 0;
+ float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
+ // Do it
+ co->setYawAndSend(yaw);
+ return 1;
+}
+
+// DEPRECATED
// set_look_pitch(self, radians)
int ObjectRef::l_set_look_pitch(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
+
+ log_deprecated(L,
+ "Deprecated call to set_look_pitch, use set_look_vertical instead.");
+
ObjectRef *ref = checkobject(L, 1);
PlayerSAO* co = getplayersao(ref);
if (co == NULL) return 0;
float pitch = luaL_checknumber(L, 2) * core::RADTODEG;
// Do it
- co->setPitch(pitch);
+ co->setPitchAndSend(pitch);
return 1;
}
+// DEPRECATED
// set_look_yaw(self, radians)
int ObjectRef::l_set_look_yaw(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
+
+ log_deprecated(L,
+ "Deprecated call to set_look_yaw, use set_look_horizontal instead.");
+
ObjectRef *ref = checkobject(L, 1);
PlayerSAO* co = getplayersao(ref);
if (co == NULL) return 0;
float yaw = luaL_checknumber(L, 2) * core::RADTODEG;
// Do it
- co->setYaw(yaw);
+ co->setYawAndSend(yaw);
return 1;
}
@@ -1109,7 +1180,7 @@ int ObjectRef::l_set_inventory_formspec(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL) return 0;
std::string formspec = luaL_checkstring(L, 2);
@@ -1124,7 +1195,7 @@ int ObjectRef::l_get_inventory_formspec(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL) return 0;
std::string formspec = player->inventory_formspec;
@@ -1137,13 +1208,13 @@ int ObjectRef::l_get_player_control(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL) {
lua_pushlstring(L, "", 0);
return 1;
}
- // Do it
- PlayerControl control = player->getPlayerControl();
+
+ const PlayerControl &control = player->getPlayerControl();
lua_newtable(L);
lua_pushboolean(L, control.up);
lua_setfield(L, -2, "up");
@@ -1171,7 +1242,7 @@ int ObjectRef::l_get_player_control_bits(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL) {
lua_pushlstring(L, "", 0);
return 1;
@@ -1186,7 +1257,7 @@ int ObjectRef::l_hud_add(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1249,7 +1320,7 @@ int ObjectRef::l_hud_remove(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1269,7 +1340,7 @@ int ObjectRef::l_hud_change(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1346,7 +1417,7 @@ int ObjectRef::l_hud_get(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1397,7 +1468,7 @@ int ObjectRef::l_hud_set_flags(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1423,7 +1494,7 @@ int ObjectRef::l_hud_get_flags(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1449,7 +1520,7 @@ int ObjectRef::l_hud_set_hotbar_itemcount(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1467,7 +1538,7 @@ int ObjectRef::l_hud_get_hotbar_itemcount(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1482,7 +1553,7 @@ int ObjectRef::l_hud_set_hotbar_image(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1497,7 +1568,7 @@ int ObjectRef::l_hud_get_hotbar_image(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1511,7 +1582,7 @@ int ObjectRef::l_hud_set_hotbar_selected_image(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1526,11 +1597,11 @@ int ObjectRef::l_hud_get_hotbar_selected_image(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
- std::string name = getServer(L)->hudGetHotbarSelectedImage(player);
+ const std::string &name = getServer(L)->hudGetHotbarSelectedImage(player);
lua_pushlstring(L, name.c_str(), name.size());
return 1;
}
@@ -1540,7 +1611,7 @@ int ObjectRef::l_set_sky(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1579,7 +1650,7 @@ int ObjectRef::l_get_sky(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
video::SColor bgcolor(255, 255, 255, 255);
@@ -1607,7 +1678,7 @@ int ObjectRef::l_override_day_night_ratio(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1630,7 +1701,7 @@ int ObjectRef::l_get_day_night_ratio(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
ObjectRef *ref = checkobject(L, 1);
- Player *player = getplayer(ref);
+ RemotePlayer *player = getplayer(ref);
if (player == NULL)
return 0;
@@ -1754,6 +1825,10 @@ const luaL_reg ObjectRef::methods[] = {
luamethod(ObjectRef, get_look_dir),
luamethod(ObjectRef, get_look_pitch),
luamethod(ObjectRef, get_look_yaw),
+ luamethod(ObjectRef, get_look_vertical),
+ luamethod(ObjectRef, get_look_horizontal),
+ luamethod(ObjectRef, set_look_horizontal),
+ luamethod(ObjectRef, set_look_vertical),
luamethod(ObjectRef, set_look_yaw),
luamethod(ObjectRef, set_look_pitch),
luamethod(ObjectRef, get_breath),
diff --git a/src/script/lua_api/l_object.h b/src/script/lua_api/l_object.h
index a4457cc05..09f10e417 100644
--- a/src/script/lua_api/l_object.h
+++ b/src/script/lua_api/l_object.h
@@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class ServerActiveObject;
class LuaEntitySAO;
class PlayerSAO;
-class Player;
+class RemotePlayer;
/*
ObjectRef
@@ -47,7 +47,7 @@ private:
static PlayerSAO* getplayersao(ObjectRef *ref);
- static Player* getplayer(ObjectRef *ref);
+ static RemotePlayer *getplayer(ObjectRef *ref);
// Exported functions
@@ -189,15 +189,31 @@ private:
// get_look_dir(self)
static int l_get_look_dir(lua_State *L);
+ // DEPRECATED
// get_look_pitch(self)
static int l_get_look_pitch(lua_State *L);
+ // DEPRECATED
// get_look_yaw(self)
static int l_get_look_yaw(lua_State *L);
+ // get_look_pitch2(self)
+ static int l_get_look_vertical(lua_State *L);
+
+ // get_look_yaw2(self)
+ static int l_get_look_horizontal(lua_State *L);
+
+ // set_look_vertical(self, radians)
+ static int l_set_look_vertical(lua_State *L);
+
+ // set_look_horizontal(self, radians)
+ static int l_set_look_horizontal(lua_State *L);
+
+ // DEPRECATED
// set_look_pitch(self, radians)
static int l_set_look_pitch(lua_State *L);
+ // DEPRECATED
// set_look_yaw(self, radians)
static int l_set_look_yaw(lua_State *L);
diff --git a/src/script/lua_api/l_particles.cpp b/src/script/lua_api/l_particles.cpp
index f6c1725de..667ac7272 100644
--- a/src/script/lua_api/l_particles.cpp
+++ b/src/script/lua_api/l_particles.cpp
@@ -18,16 +18,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include "lua_api/l_particles.h"
+#include "lua_api/l_object.h"
#include "lua_api/l_internal.h"
#include "common/c_converter.h"
#include "server.h"
+#include "particles.h"
// add_particle({pos=, velocity=, acceleration=, expirationtime=,
-// size=, collisiondetection=, vertical=, texture=, player=})
+// size=, collisiondetection=, collision_removal=, vertical=,
+// texture=, player=})
// pos/velocity/acceleration = {x=num, y=num, z=num}
// expirationtime = num (seconds)
// size = num
// collisiondetection = bool
+// collision_removal = bool
// vertical = bool
// texture = e.g."default_wood.png"
int ModApiParticles::l_add_particle(lua_State *L)
@@ -41,8 +45,8 @@ int ModApiParticles::l_add_particle(lua_State *L)
float expirationtime, size;
expirationtime = size = 1;
- bool collisiondetection, vertical;
- collisiondetection = vertical = false;
+ bool collisiondetection, vertical, collision_removal;
+ collisiondetection = vertical = collision_removal = false;
std::string texture = "";
std::string playername = "";
@@ -94,12 +98,14 @@ int ModApiParticles::l_add_particle(lua_State *L)
size = getfloatfield_default(L, 1, "size", 1);
collisiondetection = getboolfield_default(L, 1,
"collisiondetection", collisiondetection);
+ collision_removal = getboolfield_default(L, 1,
+ "collision_removal", collision_removal);
vertical = getboolfield_default(L, 1, "vertical", vertical);
texture = getstringfield_default(L, 1, "texture", "");
playername = getstringfield_default(L, 1, "playername", "");
}
- getServer(L)->spawnParticle(playername, pos, vel, acc,
- expirationtime, size, collisiondetection, vertical, texture);
+ getServer(L)->spawnParticle(playername, pos, vel, acc, expirationtime, size,
+ collisiondetection, collision_removal, vertical, texture);
return 1;
}
@@ -110,6 +116,7 @@ int ModApiParticles::l_add_particle(lua_State *L)
// minexptime=, maxexptime=,
// minsize=, maxsize=,
// collisiondetection=,
+// collision_removal=,
// vertical=,
// texture=,
// player=})
@@ -117,6 +124,7 @@ int ModApiParticles::l_add_particle(lua_State *L)
// minexptime/maxexptime = num (seconds)
// minsize/maxsize = num
// collisiondetection = bool
+// collision_removal = bool
// vertical = bool
// texture = e.g."default_wood.png"
int ModApiParticles::l_add_particlespawner(lua_State *L)
@@ -129,8 +137,9 @@ int ModApiParticles::l_add_particlespawner(lua_State *L)
minpos= maxpos= minvel= maxvel= minacc= maxacc= v3f(0, 0, 0);
float time, minexptime, maxexptime, minsize, maxsize;
time= minexptime= maxexptime= minsize= maxsize= 1;
- bool collisiondetection, vertical;
- collisiondetection= vertical= false;
+ bool collisiondetection, vertical, collision_removal;
+ collisiondetection = vertical = collision_removal = false;
+ ServerActiveObject *attached = NULL;
std::string texture = "";
std::string playername = "";
@@ -189,6 +198,16 @@ int ModApiParticles::l_add_particlespawner(lua_State *L)
maxsize = getfloatfield_default(L, 1, "maxsize", maxsize);
collisiondetection = getboolfield_default(L, 1,
"collisiondetection", collisiondetection);
+ collision_removal = getboolfield_default(L, 1,
+ "collision_removal", collision_removal);
+
+ lua_getfield(L, 1, "attached");
+ if (!lua_isnil(L, -1)) {
+ ObjectRef *ref = ObjectRef::checkobject(L, -1);
+ lua_pop(L, 1);
+ attached = ObjectRef::getobject(ref);
+ }
+
vertical = getboolfield_default(L, 1, "vertical", vertical);
texture = getstringfield_default(L, 1, "texture", "");
playername = getstringfield_default(L, 1, "playername", "");
@@ -201,6 +220,8 @@ int ModApiParticles::l_add_particlespawner(lua_State *L)
minexptime, maxexptime,
minsize, maxsize,
collisiondetection,
+ collision_removal,
+ attached,
vertical,
texture, playername);
lua_pushnumber(L, id);
diff --git a/src/script/lua_api/l_server.cpp b/src/script/lua_api/l_server.cpp
index 59d3f5c70..b6d44e0ff 100644
--- a/src/script/lua_api/l_server.cpp
+++ b/src/script/lua_api/l_server.cpp
@@ -45,6 +45,15 @@ int ModApiServer::l_get_server_status(lua_State *L)
return 1;
}
+// get_server_uptime()
+int ModApiServer::l_get_server_uptime(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ lua_pushnumber(L, getServer(L)->getUptime());
+ return 1;
+}
+
+
// print(text)
int ModApiServer::l_print(lua_State *L)
{
@@ -106,7 +115,7 @@ int ModApiServer::l_get_player_ip(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
const char * name = luaL_checkstring(L, 1);
- Player *player = getEnv(L)->getPlayer(name);
+ RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
if(player == NULL)
{
lua_pushnil(L); // no such player
@@ -133,9 +142,8 @@ int ModApiServer::l_get_player_information(lua_State *L)
NO_MAP_LOCK_REQUIRED;
const char * name = luaL_checkstring(L, 1);
- Player *player = getEnv(L)->getPlayer(name);
- if(player == NULL)
- {
+ RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+ if (player == NULL) {
lua_pushnil(L); // no such player
return 1;
}
@@ -278,15 +286,15 @@ int ModApiServer::l_ban_player(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
const char * name = luaL_checkstring(L, 1);
- Player *player = getEnv(L)->getPlayer(name);
- if(player == NULL)
- {
+ RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+ if (player == NULL) {
lua_pushboolean(L, false); // no such player
return 1;
}
try
{
- Address addr = getServer(L)->getPeerAddress(getEnv(L)->getPlayer(name)->peer_id);
+ Address addr = getServer(L)->getPeerAddress(
+ dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name)->peer_id);
std::string ip_str = addr.serializeString();
getServer(L)->setIpBanned(ip_str, name);
}
@@ -314,9 +322,9 @@ int ModApiServer::l_kick_player(lua_State *L)
{
message = "Kicked.";
}
- Player *player = getEnv(L)->getPlayer(name);
- if (player == NULL)
- {
+
+ RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
+ if (player == NULL) {
lua_pushboolean(L, false); // No such player
return 1;
}
@@ -508,6 +516,7 @@ void ModApiServer::Initialize(lua_State *L, int top)
{
API_FCT(request_shutdown);
API_FCT(get_server_status);
+ API_FCT(get_server_uptime);
API_FCT(get_worldpath);
API_FCT(is_singleplayer);
diff --git a/src/script/lua_api/l_server.h b/src/script/lua_api/l_server.h
index 06a5ddc24..1ad46d440 100644
--- a/src/script/lua_api/l_server.h
+++ b/src/script/lua_api/l_server.h
@@ -30,6 +30,9 @@ private:
// get_server_status()
static int l_get_server_status(lua_State *L);
+ // get_server_uptime()
+ static int l_get_server_uptime(lua_State *L);
+
// get_worldpath()
static int l_get_worldpath(lua_State *L);
diff --git a/src/script/lua_api/l_settings.cpp b/src/script/lua_api/l_settings.cpp
index 35b82b435..d3fe03005 100644
--- a/src/script/lua_api/l_settings.cpp
+++ b/src/script/lua_api/l_settings.cpp
@@ -118,6 +118,11 @@ int LuaSettings::l_write(lua_State* L)
NO_MAP_LOCK_REQUIRED;
LuaSettings* o = checkobject(L, 1);
+ if (!o->m_write_allowed) {
+ throw LuaError("Settings: writing " + o->m_filename +
+ " not allowed with mod security on.");
+ }
+
bool success = o->m_settings->updateConfigFile(o->m_filename.c_str());
lua_pushboolean(L, success);
@@ -142,8 +147,9 @@ int LuaSettings::l_to_table(lua_State* L)
return 1;
}
-LuaSettings::LuaSettings(const char* filename)
+LuaSettings::LuaSettings(const char* filename, bool write_allowed)
{
+ m_write_allowed = write_allowed;
m_filename = std::string(filename);
m_settings = new Settings();
@@ -188,9 +194,10 @@ void LuaSettings::Register(lua_State* L)
int LuaSettings::create_object(lua_State* L)
{
NO_MAP_LOCK_REQUIRED;
+ bool write_allowed = true;
const char* filename = luaL_checkstring(L, 1);
- CHECK_SECURE_PATH_OPTIONAL(L, filename);
- LuaSettings* o = new LuaSettings(filename);
+ CHECK_SECURE_PATH_POSSIBLE_WRITE(L, filename, &write_allowed);
+ LuaSettings* o = new LuaSettings(filename, write_allowed);
*(void **)(lua_newuserdata(L, sizeof(void *))) = o;
luaL_getmetatable(L, className);
lua_setmetatable(L, -2);
diff --git a/src/script/lua_api/l_settings.h b/src/script/lua_api/l_settings.h
index cb0c09a73..bca333e31 100644
--- a/src/script/lua_api/l_settings.h
+++ b/src/script/lua_api/l_settings.h
@@ -53,11 +53,12 @@ private:
// to_table(self) -> {[key1]=value1,...}
static int l_to_table(lua_State* L);
+ bool m_write_allowed;
Settings* m_settings;
std::string m_filename;
public:
- LuaSettings(const char* filename);
+ LuaSettings(const char* filename, bool write_allowed);
~LuaSettings();
// LuaSettings(filename)
diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp
index c3e6c8964..26e2b985c 100644
--- a/src/script/lua_api/l_util.cpp
+++ b/src/script/lua_api/l_util.cpp
@@ -23,7 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common/c_content.h"
#include "cpp_api/s_async.h"
#include "serialization.h"
-#include "json/json.h"
+#include <json/json.h>
#include "cpp_api/s_security.h"
#include "porting.h"
#include "debug.h"
@@ -32,8 +32,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "filesys.h"
#include "settings.h"
#include "util/auth.h"
+#include "util/base64.h"
+#include "config.h"
+#include "version.h"
#include <algorithm>
+
// log([level,] text)
// Writes a line to the logger.
// The one-argument version logs to infostream.
@@ -219,7 +223,7 @@ int ModApiUtil::l_write_json(lua_State *L)
int ModApiUtil::l_get_dig_params(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- std::map<std::string, int> groups;
+ ItemGroupList groups;
read_groups(L, 1, groups);
ToolCapabilities tp = read_tool_capabilities(L, 2);
if(lua_isnoneornil(L, 3))
@@ -234,7 +238,7 @@ int ModApiUtil::l_get_dig_params(lua_State *L)
int ModApiUtil::l_get_hit_params(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- std::map<std::string, int> groups;
+ UNORDERED_MAP<std::string, int> groups;
read_groups(L, 1, groups);
ToolCapabilities tp = read_tool_capabilities(L, 2);
if(lua_isnoneornil(L, 3))
@@ -245,6 +249,35 @@ int ModApiUtil::l_get_hit_params(lua_State *L)
return 1;
}
+// check_password_entry(name, entry, password)
+int ModApiUtil::l_check_password_entry(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ std::string name = luaL_checkstring(L, 1);
+ std::string entry = luaL_checkstring(L, 2);
+ std::string password = luaL_checkstring(L, 3);
+
+ if (base64_is_valid(entry)) {
+ std::string hash = translate_password(name, password);
+ lua_pushboolean(L, hash == entry);
+ return 1;
+ }
+
+ std::string salt;
+ std::string verifier;
+
+ if (!decode_srp_verifier_and_salt(entry, &verifier, &salt)) {
+ // invalid format
+ warningstream << "Invalid password format for " << name << std::endl;
+ lua_pushboolean(L, false);
+ return 1;
+ }
+ std::string gen_verifier = generate_srp_verifier(name, password, salt);
+
+ lua_pushboolean(L, gen_verifier == verifier);
+ return 1;
+}
+
// get_password_hash(name, raw_password)
int ModApiUtil::l_get_password_hash(lua_State *L)
{
@@ -272,12 +305,14 @@ int ModApiUtil::l_is_yes(lua_State *L)
return 1;
}
+// get_builtin_path()
int ModApiUtil::l_get_builtin_path(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
std::string path = porting::path_share + DIR_DELIM + "builtin";
lua_pushstring(L, path.c_str());
+
return 1;
}
@@ -320,12 +355,40 @@ int ModApiUtil::l_decompress(lua_State *L)
return 1;
}
+// encode_base64(string)
+int ModApiUtil::l_encode_base64(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ size_t size;
+ const char *data = luaL_checklstring(L, 1, &size);
+
+ std::string out = base64_encode((const unsigned char *)(data), size);
+
+ lua_pushlstring(L, out.data(), out.size());
+ return 1;
+}
+
+// decode_base64(string)
+int ModApiUtil::l_decode_base64(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ size_t size;
+ const char *data = luaL_checklstring(L, 1, &size);
+
+ std::string out = base64_decode(std::string(data, size));
+
+ lua_pushlstring(L, out.data(), out.size());
+ return 1;
+}
+
// mkdir(path)
int ModApiUtil::l_mkdir(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
const char *path = luaL_checkstring(L, 1);
- CHECK_SECURE_PATH_OPTIONAL(L, path);
+ CHECK_SECURE_PATH(L, path, true);
lua_pushboolean(L, fs::CreateAllDirs(path));
return 1;
}
@@ -337,7 +400,7 @@ int ModApiUtil::l_get_dir_list(lua_State *L)
const char *path = luaL_checkstring(L, 1);
short is_dir = lua_isboolean(L, 2) ? lua_toboolean(L, 2) : -1;
- CHECK_SECURE_PATH_OPTIONAL(L, path);
+ CHECK_SECURE_PATH(L, path, false);
std::vector<fs::DirListNode> list = fs::GetDirListing(path);
@@ -388,8 +451,9 @@ int ModApiUtil::l_request_insecure_environment(lua_State *L)
// Check secure.trusted_mods
const char *mod_name = lua_tostring(L, -1);
std::string trusted_mods = g_settings->get("secure.trusted_mods");
- trusted_mods.erase(std::remove(trusted_mods.begin(),
- trusted_mods.end(), ' '), trusted_mods.end());
+ trusted_mods.erase(std::remove_if(trusted_mods.begin(),
+ trusted_mods.end(), static_cast<int(*)(int)>(&std::isspace)),
+ trusted_mods.end());
std::vector<std::string> mod_list = str_split(trusted_mods, ',');
if (std::find(mod_list.begin(), mod_list.end(), mod_name) ==
mod_list.end()) {
@@ -401,6 +465,26 @@ int ModApiUtil::l_request_insecure_environment(lua_State *L)
return 1;
}
+// get_version()
+int ModApiUtil::l_get_version(lua_State *L)
+{
+ lua_createtable(L, 0, 3);
+ int table = lua_gettop(L);
+
+ lua_pushstring(L, PROJECT_NAME_C);
+ lua_setfield(L, table, "project");
+
+ lua_pushstring(L, g_version_string);
+ lua_setfield(L, table, "string");
+
+ if (strcmp(g_version_string, g_version_hash)) {
+ lua_pushstring(L, g_version_hash);
+ lua_setfield(L, table, "hash");
+ }
+
+ return 1;
+}
+
void ModApiUtil::Initialize(lua_State *L, int top)
{
@@ -420,6 +504,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(get_dig_params);
API_FCT(get_hit_params);
+ API_FCT(check_password_entry);
API_FCT(get_password_hash);
API_FCT(is_yes);
@@ -433,6 +518,11 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(get_dir_list);
API_FCT(request_insecure_environment);
+
+ API_FCT(encode_base64);
+ API_FCT(decode_base64);
+
+ API_FCT(get_version);
}
void ModApiUtil::InitializeAsync(AsyncEngine& engine)
@@ -459,5 +549,10 @@ void ModApiUtil::InitializeAsync(AsyncEngine& engine)
ASYNC_API_FCT(mkdir);
ASYNC_API_FCT(get_dir_list);
+
+ ASYNC_API_FCT(encode_base64);
+ ASYNC_API_FCT(decode_base64);
+
+ ASYNC_API_FCT(get_version);
}
diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h
index 6fac7e7eb..9910704b3 100644
--- a/src/script/lua_api/l_util.h
+++ b/src/script/lua_api/l_util.h
@@ -71,6 +71,9 @@ private:
// get_hit_params(groups, tool_capabilities[, time_from_last_punch])
static int l_get_hit_params(lua_State *L);
+ // check_password_entry(name, entry, password)
+ static int l_check_password_entry(lua_State *L);
+
// get_password_hash(name, raw_password)
static int l_get_password_hash(lua_State *L);
@@ -95,6 +98,15 @@ private:
// request_insecure_environment()
static int l_request_insecure_environment(lua_State *L);
+ // encode_base64(string)
+ static int l_encode_base64(lua_State *L);
+
+ // decode_base64(string)
+ static int l_decode_base64(lua_State *L);
+
+ // get_version()
+ static int l_get_version(lua_State *L);
+
public:
static void Initialize(lua_State *L, int top);
diff --git a/src/script/lua_api/l_vmanip.cpp b/src/script/lua_api/l_vmanip.cpp
index f13866408..bdf720f0a 100644
--- a/src/script/lua_api/l_vmanip.cpp
+++ b/src/script/lua_api/l_vmanip.cpp
@@ -190,7 +190,7 @@ int LuaVoxelManip::l_calc_lighting(lua_State *L)
Mapgen mg;
mg.vm = vm;
mg.ndef = ndef;
- mg.water_level = emerge->params.water_level;
+ mg.water_level = emerge->mgparams->water_level;
mg.calcLighting(pmin, pmax, fpmin, fpmax, propagate_shadow);
@@ -277,11 +277,17 @@ int LuaVoxelManip::l_get_param2_data(lua_State *L)
NO_MAP_LOCK_REQUIRED;
LuaVoxelManip *o = checkobject(L, 1);
+ bool use_buffer = lua_istable(L, 2);
+
MMVManip *vm = o->vm;
u32 volume = vm->m_area.getVolume();
- lua_newtable(L);
+ if (use_buffer)
+ lua_pushvalue(L, 2);
+ else
+ lua_newtable(L);
+
for (u32 i = 0; i != volume; i++) {
lua_Integer param2 = vm->m_data[i].param2;
lua_pushinteger(L, param2);
diff --git a/src/serialization.cpp b/src/serialization.cpp
index 79f66fcae..d30e83726 100644
--- a/src/serialization.cpp
+++ b/src/serialization.cpp
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "serialization.h"
#include "util/serialize.h"
-#ifdef _WIN32
+#if defined(_WIN32) && !defined(WIN32_NO_ZLIB_WINAPI)
#define ZLIB_WINAPI
#endif
#include "zlib.h"
diff --git a/src/server.cpp b/src/server.cpp
index a3b686c25..c9d5c7129 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -184,9 +184,7 @@ Server::Server(
{
m_liquid_transform_timer = 0.0;
m_liquid_transform_every = 1.0;
- m_print_info_timer = 0.0;
m_masterserver_timer = 0.0;
- m_objectdata_timer = 0.0;
m_emergethread_trigger_timer = 0.0;
m_savemap_timer = 0.0;
@@ -266,9 +264,6 @@ Server::Server(
//lock environment
MutexAutoLock envlock(m_env_mutex);
- // Load mapgen params from Settings
- m_emerge->loadMapgenParams();
-
// Create the Map (loads map_meta.txt, overriding configured mapgen params)
ServerMap *servermap = new ServerMap(path_world, this, m_emerge);
@@ -331,8 +326,11 @@ Server::Server(
m_clients.setEnv(m_env);
+ if (!servermap->settings_mgr.makeMapgenParams())
+ FATAL_ERROR("Couldn't create any mapgen type");
+
// Initialize mapgens
- m_emerge->initMapgens();
+ m_emerge->initMapgens(servermap->getMapgenParams());
m_enable_rollback_recording = g_settings->getBool("enable_rollback_recording");
if (m_enable_rollback_recording) {
@@ -358,6 +356,7 @@ Server::Server(
add_legacy_abms(m_env, m_nodedef);
m_liquid_transform_every = g_settings->getFloat("liquid_update");
+ m_max_chatmessage_length = g_settings->getU16("chat_message_max_size");
}
Server::~Server()
@@ -402,11 +401,8 @@ Server::~Server()
m_emerge->stopThreads();
// Delete things in the reverse order of creation
- delete m_env;
-
- // N.B. the EmergeManager should be deleted after the Environment since Map
- // depends on EmergeManager to write its current params to the map meta
delete m_emerge;
+ delete m_env;
delete m_rollback;
delete m_banmanager;
delete m_event;
@@ -655,7 +651,7 @@ void Server::AsyncRunStep(bool initial_step)
m_env->getGameTime(),
m_lag,
m_gamespec.id,
- m_emerge->params.mg_name,
+ Mapgen::getMapgenName(m_emerge->mgparams->mgtype),
m_mods);
counter = 0.01;
}
@@ -671,7 +667,7 @@ void Server::AsyncRunStep(bool initial_step)
MutexAutoLock envlock(m_env_mutex);
m_clients.lock();
- std::map<u16, RemoteClient*> clients = m_clients.getClientList();
+ UNORDERED_MAP<u16, RemoteClient*> clients = m_clients.getClientList();
ScopeProfiler sp(g_profiler, "Server: checking added and deleted objs");
// Radius inside which objects are active
@@ -687,8 +683,7 @@ void Server::AsyncRunStep(bool initial_step)
if (player_radius == 0 && is_transfer_limited)
player_radius = radius;
- for (std::map<u16, RemoteClient*>::iterator
- i = clients.begin();
+ for (UNORDERED_MAP<u16, RemoteClient*>::iterator i = clients.begin();
i != clients.end(); ++i) {
RemoteClient *client = i->second;
@@ -697,8 +692,8 @@ void Server::AsyncRunStep(bool initial_step)
if (client->getState() < CS_DefinitionsSent)
continue;
- Player *player = m_env->getPlayer(client->peer_id);
- if(player == NULL) {
+ RemotePlayer *player = m_env->getPlayer(client->peer_id);
+ if (player == NULL) {
// This can happen if the client timeouts somehow
/*warningstream<<FUNCTION_NAME<<": Client "
<<client->peer_id
@@ -706,11 +701,19 @@ void Server::AsyncRunStep(bool initial_step)
continue;
}
+ PlayerSAO *playersao = player->getPlayerSAO();
+ if (playersao == NULL)
+ continue;
+
+ s16 my_radius = MYMIN(radius, playersao->getWantedRange() * MAP_BLOCKSIZE);
+ if (my_radius <= 0) my_radius = radius;
+ //infostream << "Server: Active Radius " << my_radius << std::endl;
+
std::queue<u16> removed_objects;
std::queue<u16> added_objects;
- m_env->getRemovedActiveObjects(player, radius, player_radius,
+ m_env->getRemovedActiveObjects(playersao, my_radius, player_radius,
client->m_known_objects, removed_objects);
- m_env->getAddedActiveObjects(player, radius, player_radius,
+ m_env->getAddedActiveObjects(playersao, my_radius, player_radius,
client->m_known_objects, added_objects);
// Ignore if nothing happened
@@ -797,7 +800,7 @@ void Server::AsyncRunStep(bool initial_step)
// Key = object id
// Value = data sent by object
- std::map<u16, std::vector<ActiveObjectMessage>* > buffered_messages;
+ UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* > buffered_messages;
// Get active object messages from environment
for(;;) {
@@ -806,7 +809,7 @@ void Server::AsyncRunStep(bool initial_step)
break;
std::vector<ActiveObjectMessage>* message_list = NULL;
- std::map<u16, std::vector<ActiveObjectMessage>* >::iterator n;
+ UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator n;
n = buffered_messages.find(aom.id);
if (n == buffered_messages.end()) {
message_list = new std::vector<ActiveObjectMessage>;
@@ -819,16 +822,15 @@ void Server::AsyncRunStep(bool initial_step)
}
m_clients.lock();
- std::map<u16, RemoteClient*> clients = m_clients.getClientList();
+ UNORDERED_MAP<u16, RemoteClient*> clients = m_clients.getClientList();
// Route data to every client
- for (std::map<u16, RemoteClient*>::iterator
- i = clients.begin();
+ for (UNORDERED_MAP<u16, RemoteClient*>::iterator i = clients.begin();
i != clients.end(); ++i) {
RemoteClient *client = i->second;
std::string reliable_data;
std::string unreliable_data;
// Go through all objects in message buffer
- for (std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
+ for (UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator
j = buffered_messages.begin();
j != buffered_messages.end(); ++j) {
// If object is not known by client, skip it
@@ -872,7 +874,7 @@ void Server::AsyncRunStep(bool initial_step)
m_clients.unlock();
// Clear buffered_messages
- for(std::map<u16, std::vector<ActiveObjectMessage>* >::iterator
+ for (UNORDERED_MAP<u16, std::vector<ActiveObjectMessage>* >::iterator
i = buffered_messages.begin();
i != buffered_messages.end(); ++i) {
delete i->second;
@@ -1114,30 +1116,13 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id)
SendPlayerBreath(peer_id);
// Show death screen if necessary
- if(player->isDead())
+ if (playersao->isDead())
SendDeathscreen(peer_id, false, v3f(0,0,0));
// Note things in chat if not in simple singleplayer mode
if(!m_simple_singleplayer_mode) {
// Send information about server to player in chat
SendChatMessage(peer_id, getStatusString());
-
- // Send information about joining in chat
- {
- std::string name = "unknown";
- Player *player = m_env->getPlayer(peer_id);
- if(player != NULL)
- name = player->getName();
-
- std::wstring message;
- message += L"*** ";
- message += narrow_to_wide(name);
- message += L" joined the game.";
- SendChatMessage(PEER_ID_INEXISTENT,message);
- if (m_admin_chat)
- m_admin_chat->outgoing_queue.push_back(
- new ChatEventNick(CET_NICK_ADD, name));
- }
}
Address addr = getPeerAddress(player->peer_id);
std::string ip_str = addr.serializeString();
@@ -1146,11 +1131,11 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id)
Print out action
*/
{
- std::vector<std::string> names = m_clients.getPlayerNames();
+ const std::vector<std::string> &names = m_clients.getPlayerNames();
- actionstream<<player->getName() <<" joins game. List of players: ";
+ actionstream << player->getName() << " joins game. List of players: ";
- for (std::vector<std::string>::iterator i = names.begin();
+ for (std::vector<std::string>::const_iterator i = names.begin();
i != names.end(); ++i) {
actionstream << *i << " ";
}
@@ -1277,7 +1262,7 @@ Inventory* Server::getInventory(const InventoryLocation &loc)
break;
case InventoryLocation::PLAYER:
{
- Player *player = m_env->getPlayer(loc.name.c_str());
+ RemotePlayer *player = dynamic_cast<RemotePlayer *>(m_env->getPlayer(loc.name.c_str()));
if(!player)
return NULL;
PlayerSAO *playersao = player->getPlayerSAO();
@@ -1317,9 +1302,12 @@ void Server::setInventoryModified(const InventoryLocation &loc, bool playerSend)
if (!playerSend)
return;
- Player *player = m_env->getPlayer(loc.name.c_str());
- if(!player)
+ RemotePlayer *player =
+ dynamic_cast<RemotePlayer *>(m_env->getPlayer(loc.name.c_str()));
+
+ if (!player)
return;
+
PlayerSAO *playersao = player->getPlayerSAO();
if(!playersao)
return;
@@ -1663,8 +1651,12 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string &formspec,
DSTACK(FUNCTION_NAME);
NetworkPacket pkt(TOCLIENT_SHOW_FORMSPEC, 0 , peer_id);
-
- pkt.putLongString(FORMSPEC_VERSION_STRING + formspec);
+ if (formspec == "" ){
+ //the client should close the formspec
+ pkt.putLongString("");
+ } else {
+ pkt.putLongString(FORMSPEC_VERSION_STRING + formspec);
+ }
pkt << formname;
Send(&pkt);
@@ -1673,7 +1665,8 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string &formspec,
// Spawns a particle on peer with peer_id
void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size, bool collisiondetection,
- bool vertical, std::string texture)
+ bool collision_removal,
+ bool vertical, const std::string &texture)
{
DSTACK(FUNCTION_NAME);
@@ -1683,6 +1676,7 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat
<< size << collisiondetection;
pkt.putLongString(texture);
pkt << vertical;
+ pkt << collision_removal;
if (peer_id != PEER_ID_INEXISTENT) {
Send(&pkt);
@@ -1695,7 +1689,8 @@ void Server::SendSpawnParticle(u16 peer_id, v3f pos, v3f velocity, v3f accelerat
// Adds a ParticleSpawner on peer with peer_id
void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3f minpos, v3f maxpos,
v3f minvel, v3f maxvel, v3f minacc, v3f maxacc, float minexptime, float maxexptime,
- float minsize, float maxsize, bool collisiondetection, bool vertical, std::string texture, u32 id)
+ float minsize, float maxsize, bool collisiondetection, bool collision_removal,
+ u16 attached_id, bool vertical, const std::string &texture, u32 id)
{
DSTACK(FUNCTION_NAME);
@@ -1708,6 +1703,8 @@ void Server::SendAddParticleSpawner(u16 peer_id, u16 amount, float spawntime, v3
pkt.putLongString(texture);
pkt << id << vertical;
+ pkt << collision_removal;
+ pkt << attached_id;
if (peer_id != PEER_ID_INEXISTENT) {
Send(&pkt);
@@ -1873,20 +1870,20 @@ void Server::SendPlayerBreath(u16 peer_id)
void Server::SendMovePlayer(u16 peer_id)
{
DSTACK(FUNCTION_NAME);
- Player *player = m_env->getPlayer(peer_id);
+ RemotePlayer *player = m_env->getPlayer(peer_id);
assert(player);
+ PlayerSAO *sao = player->getPlayerSAO();
+ assert(sao);
NetworkPacket pkt(TOCLIENT_MOVE_PLAYER, sizeof(v3f) + sizeof(f32) * 2, peer_id);
- pkt << player->getPosition() << player->getPitch() << player->getYaw();
+ pkt << sao->getBasePosition() << sao->getPitch() << sao->getYaw();
{
- v3f pos = player->getPosition();
- f32 pitch = player->getPitch();
- f32 yaw = player->getYaw();
+ v3f pos = sao->getBasePosition();
verbosestream << "Server: Sending TOCLIENT_MOVE_PLAYER"
<< " pos=(" << pos.X << "," << pos.Y << "," << pos.Z << ")"
- << " pitch=" << pitch
- << " yaw=" << yaw
+ << " pitch=" << sao->getPitch()
+ << " yaw=" << sao->getYaw()
<< std::endl;
}
@@ -1912,7 +1909,7 @@ void Server::SendEyeOffset(u16 peer_id, v3f first, v3f third)
}
void Server::SendPlayerPrivileges(u16 peer_id)
{
- Player *player = m_env->getPlayer(peer_id);
+ RemotePlayer *player = m_env->getPlayer(peer_id);
assert(player);
if(player->peer_id == PEER_ID_INEXISTENT)
return;
@@ -1933,7 +1930,7 @@ void Server::SendPlayerPrivileges(u16 peer_id)
void Server::SendPlayerInventoryFormspec(u16 peer_id)
{
- Player *player = m_env->getPlayer(peer_id);
+ RemotePlayer *player = m_env->getPlayer(peer_id);
assert(player);
if(player->peer_id == PEER_ID_INEXISTENT)
return;
@@ -1978,7 +1975,7 @@ s32 Server::playSound(const SimpleSoundSpec &spec,
std::vector<u16> dst_clients;
if(params.to_player != "")
{
- Player *player = m_env->getPlayer(params.to_player.c_str());
+ RemotePlayer *player = m_env->getPlayer(params.to_player.c_str());
if(!player){
infostream<<"Server::playSound: Player \""<<params.to_player
<<"\" not found"<<std::endl;
@@ -1994,14 +1991,17 @@ s32 Server::playSound(const SimpleSoundSpec &spec,
else {
std::vector<u16> clients = m_clients.getClientIDs();
- for(std::vector<u16>::iterator
- i = clients.begin(); i != clients.end(); ++i) {
- Player *player = m_env->getPlayer(*i);
- if(!player)
+ for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
+ RemotePlayer *player = m_env->getPlayer(*i);
+ if (!player)
continue;
- if(pos_exists) {
- if(player->getPosition().getDistanceFrom(pos) >
+ PlayerSAO *sao = player->getPlayerSAO();
+ if (!sao)
+ continue;
+
+ if (pos_exists) {
+ if(sao->getBasePosition().getDistanceFrom(pos) >
params.max_hear_distance)
continue;
}
@@ -2033,16 +2033,15 @@ s32 Server::playSound(const SimpleSoundSpec &spec,
void Server::stopSound(s32 handle)
{
// Get sound reference
- std::map<s32, ServerPlayingSound>::iterator i =
- m_playing_sounds.find(handle);
- if(i == m_playing_sounds.end())
+ UNORDERED_MAP<s32, ServerPlayingSound>::iterator i = m_playing_sounds.find(handle);
+ if (i == m_playing_sounds.end())
return;
ServerPlayingSound &psound = i->second;
NetworkPacket pkt(TOCLIENT_STOP_SOUND, 4);
pkt << handle;
- for(std::set<u16>::iterator i = psound.clients.begin();
+ for (UNORDERED_SET<u16>::iterator i = psound.clients.begin();
i != psound.clients.end(); ++i) {
// Send as reliable
m_clients.send(*i, 0, &pkt, true);
@@ -2061,14 +2060,17 @@ void Server::sendRemoveNode(v3s16 p, u16 ignore_id,
pkt << p;
std::vector<u16> clients = m_clients.getClientIDs();
- for(std::vector<u16>::iterator i = clients.begin();
- i != clients.end(); ++i) {
+ for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
if (far_players) {
// Get player
- if(Player *player = m_env->getPlayer(*i)) {
+ if (RemotePlayer *player = m_env->getPlayer(*i)) {
+ PlayerSAO *sao = player->getPlayerSAO();
+ if (!sao)
+ continue;
+
// If player is far away, only set modified blocks not sent
- v3f player_pos = player->getPosition();
- if(player_pos.getDistanceFrom(p_f) > maxd) {
+ v3f player_pos = sao->getBasePosition();
+ if (player_pos.getDistanceFrom(p_f) > maxd) {
far_players->push_back(*i);
continue;
}
@@ -2088,14 +2090,16 @@ void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id,
v3f p_f = intToFloat(p, BS);
std::vector<u16> clients = m_clients.getClientIDs();
- for(std::vector<u16>::iterator i = clients.begin();
- i != clients.end(); ++i) {
-
- if(far_players) {
+ for(std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
+ if (far_players) {
// Get player
- if(Player *player = m_env->getPlayer(*i)) {
+ if (RemotePlayer *player = m_env->getPlayer(*i)) {
+ PlayerSAO *sao = player->getPlayerSAO();
+ if (!sao)
+ continue;
+
// If player is far away, only set modified blocks not sent
- v3f player_pos = player->getPosition();
+ v3f player_pos = sao->getBasePosition();
if(player_pos.getDistanceFrom(p_f) > maxd) {
far_players->push_back(*i);
continue;
@@ -2339,7 +2343,7 @@ void Server::sendMediaAnnouncement(u16 peer_id)
NetworkPacket pkt(TOCLIENT_ANNOUNCE_MEDIA, 0, peer_id);
pkt << (u16) m_media.size();
- for (std::map<std::string, MediaInfo>::iterator i = m_media.begin();
+ for (UNORDERED_MAP<std::string, MediaInfo>::iterator i = m_media.begin();
i != m_media.end(); ++i) {
pkt << i->first << i->second.sha1_digest;
}
@@ -2384,7 +2388,7 @@ void Server::sendRequestedMedia(u16 peer_id,
i != tosend.end(); ++i) {
const std::string &name = *i;
- if(m_media.find(name) == m_media.end()) {
+ if (m_media.find(name) == m_media.end()) {
errorstream<<"Server::sendRequestedMedia(): Client asked for "
<<"unknown file \""<<(name)<<"\""<<std::endl;
continue;
@@ -2487,11 +2491,16 @@ void Server::sendDetachedInventory(const std::string &name, u16 peer_id)
NetworkPacket pkt(TOCLIENT_DETACHED_INVENTORY, 0, peer_id);
pkt.putRawString(s.c_str(), s.size());
- if (peer_id != PEER_ID_INEXISTENT) {
- Send(&pkt);
- }
- else {
- m_clients.sendToAll(0, &pkt, true);
+ const std::string &check = m_detached_inventories_player[name];
+ if (peer_id == PEER_ID_INEXISTENT) {
+ if (check == "")
+ return m_clients.sendToAll(0, &pkt, true);
+ RemotePlayer *p = m_env->getPlayer(check.c_str());
+ if (p)
+ m_clients.send(p->peer_id, 0, &pkt, true);
+ } else {
+ if (check == "" || getPlayerName(peer_id) == check)
+ Send(&pkt);
}
}
@@ -2645,44 +2654,26 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
/*
Clear references to playing sounds
*/
- for(std::map<s32, ServerPlayingSound>::iterator
- i = m_playing_sounds.begin();
- i != m_playing_sounds.end();)
- {
+ for (UNORDERED_MAP<s32, ServerPlayingSound>::iterator
+ i = m_playing_sounds.begin(); i != m_playing_sounds.end();) {
ServerPlayingSound &psound = i->second;
psound.clients.erase(peer_id);
- if(psound.clients.empty())
+ if (psound.clients.empty())
m_playing_sounds.erase(i++);
else
++i;
}
- Player *player = m_env->getPlayer(peer_id);
-
- // Collect information about leaving in chat
- {
- if(player != NULL && reason != CDR_DENY)
- {
- std::wstring name = narrow_to_wide(player->getName());
- message += L"*** ";
- message += name;
- message += L" left the game.";
- if(reason == CDR_TIMEOUT)
- message += L" (timed out)";
- }
- }
+ RemotePlayer *player = m_env->getPlayer(peer_id);
/* Run scripts and remove from environment */
- {
- if(player != NULL)
- {
- PlayerSAO *playersao = player->getPlayerSAO();
- assert(playersao);
+ if (player != NULL) {
+ PlayerSAO *playersao = player->getPlayerSAO();
+ assert(playersao);
- m_script->on_leaveplayer(playersao);
+ m_script->on_leaveplayer(playersao, reason == CDR_TIMEOUT);
- playersao->disconnected();
- }
+ playersao->disconnected();
}
/*
@@ -2696,8 +2687,8 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
for(std::vector<u16>::iterator i = clients.begin();
i != clients.end(); ++i) {
// Get player
- Player *player = m_env->getPlayer(*i);
- if(!player)
+ RemotePlayer *player = m_env->getPlayer(*i);
+ if (!player)
continue;
// Get name of player
@@ -2724,7 +2715,7 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
SendChatMessage(PEER_ID_INEXISTENT,message);
}
-void Server::UpdateCrafting(Player* player)
+void Server::UpdateCrafting(RemotePlayer *player)
{
DSTACK(FUNCTION_NAME);
@@ -2734,7 +2725,8 @@ void Server::UpdateCrafting(Player* player)
loc.setPlayer(player->getName());
std::vector<ItemStack> output_replacements;
getCraftingResult(&player->inventory, preview, output_replacements, false, this);
- m_env->getScriptIface()->item_CraftPredict(preview, player->getPlayerSAO(), (&player->inventory)->getList("craft"), loc);
+ m_env->getScriptIface()->item_CraftPredict(preview, player->getPlayerSAO(),
+ (&player->inventory)->getList("craft"), loc);
// Put the new preview in
InventoryList *plist = player->inventory.getList("craftpreview");
@@ -2763,8 +2755,7 @@ void Server::handleChatInterfaceEvent(ChatEvent *evt)
}
std::wstring Server::handleChat(const std::string &name, const std::wstring &wname,
- const std::wstring &wmessage, bool check_shout_priv,
- u16 peer_id_to_avoid_sending)
+ const std::wstring &wmessage, bool check_shout_priv, RemotePlayer *player)
{
// If something goes wrong, this player is to blame
RollbackScopeActor rollback_scope(m_rollback,
@@ -2782,6 +2773,28 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
if (ate)
return L"";
+ if (player) {
+ switch (player->canSendChatMessage()) {
+ case RPLAYER_CHATRESULT_FLOODING: {
+ std::wstringstream ws;
+ ws << L"You cannot send more messages. You are limited to "
+ << g_settings->getFloat("chat_message_limit_per_10sec")
+ << L" messages per 10 seconds.";
+ return ws.str();
+ }
+ case RPLAYER_CHATRESULT_KICK:
+ DenyAccess_Legacy(player->peer_id, L"You have been kicked due to message flooding.");
+ return L"";
+ case RPLAYER_CHATRESULT_OK: break;
+ default: FATAL_ERROR("Unhandled chat filtering result found.");
+ }
+ }
+
+ if (m_max_chatmessage_length > 0 && wmessage.length() > m_max_chatmessage_length) {
+ return L"Your message exceed the maximum chat message limit set on the server. "
+ L"It was refused. Send a shorter message";
+ }
+
// Commands are implemented in Lua, so only catch invalid
// commands that were not "eaten" and send an error back
if (wmessage[0] == L'/') {
@@ -2816,6 +2829,7 @@ std::wstring Server::handleChat(const std::string &name, const std::wstring &wna
std::vector<u16> clients = m_clients.getClientIDs();
+ u16 peer_id_to_avoid_sending = (player ? player->peer_id : PEER_ID_INEXISTENT);
for (u16 i = 0; i < clients.size(); i++) {
u16 cid = clients[i];
if (cid != peer_id_to_avoid_sending)
@@ -2854,16 +2868,16 @@ RemoteClient* Server::getClientNoEx(u16 peer_id, ClientState state_min)
std::string Server::getPlayerName(u16 peer_id)
{
- Player *player = m_env->getPlayer(peer_id);
- if(player == NULL)
+ RemotePlayer *player = m_env->getPlayer(peer_id);
+ if (player == NULL)
return "[id="+itos(peer_id)+"]";
return player->getName();
}
PlayerSAO* Server::getPlayerSAO(u16 peer_id)
{
- Player *player = m_env->getPlayer(peer_id);
- if(player == NULL)
+ RemotePlayer *player = m_env->getPlayer(peer_id);
+ if (player == NULL)
return NULL;
return player->getPlayerSAO();
}
@@ -2882,13 +2896,12 @@ std::wstring Server::getStatusString()
bool first = true;
os<<L", clients={";
std::vector<u16> clients = m_clients.getClientIDs();
- for(std::vector<u16>::iterator i = clients.begin();
- i != clients.end(); ++i) {
+ for (std::vector<u16>::iterator i = clients.begin(); i != clients.end(); ++i) {
// Get player
- Player *player = m_env->getPlayer(*i);
+ RemotePlayer *player = m_env->getPlayer(*i);
// Get name of player
std::wstring name = L"unknown";
- if(player != NULL)
+ if (player != NULL)
name = narrow_to_wide(player->getName());
// Add name to information string
if(!first)
@@ -2924,12 +2937,12 @@ void Server::reportPrivsModified(const std::string &name)
std::vector<u16> clients = m_clients.getClientIDs();
for(std::vector<u16>::iterator i = clients.begin();
i != clients.end(); ++i) {
- Player *player = m_env->getPlayer(*i);
+ RemotePlayer *player = m_env->getPlayer(*i);
reportPrivsModified(player->getName());
}
} else {
- Player *player = m_env->getPlayer(name.c_str());
- if(!player)
+ RemotePlayer *player = m_env->getPlayer(name.c_str());
+ if (!player)
return;
SendPlayerPrivileges(player->peer_id);
PlayerSAO *sao = player->getPlayerSAO();
@@ -2943,8 +2956,8 @@ void Server::reportPrivsModified(const std::string &name)
void Server::reportInventoryFormspecModified(const std::string &name)
{
- Player *player = m_env->getPlayer(name.c_str());
- if(!player)
+ RemotePlayer *player = m_env->getPlayer(name.c_str());
+ if (!player)
return;
SendPlayerInventoryFormspec(player->peer_id);
}
@@ -2974,7 +2987,7 @@ void Server::notifyPlayer(const char *name, const std::wstring &msg)
m_admin_chat->outgoing_queue.push_back(new ChatEventChat("", msg));
}
- Player *player = m_env->getPlayer(name);
+ RemotePlayer *player = m_env->getPlayer(name);
if (!player) {
return;
}
@@ -2992,7 +3005,7 @@ bool Server::showFormspec(const char *playername, const std::string &formspec,
if (!m_env)
return false;
- Player *player = m_env->getPlayer(playername);
+ RemotePlayer *player = m_env->getPlayer(playername);
if (!player)
return false;
@@ -3000,7 +3013,7 @@ bool Server::showFormspec(const char *playername, const std::string &formspec,
return true;
}
-u32 Server::hudAdd(Player *player, HudElement *form)
+u32 Server::hudAdd(RemotePlayer *player, HudElement *form)
{
if (!player)
return -1;
@@ -3012,7 +3025,7 @@ u32 Server::hudAdd(Player *player, HudElement *form)
return id;
}
-bool Server::hudRemove(Player *player, u32 id) {
+bool Server::hudRemove(RemotePlayer *player, u32 id) {
if (!player)
return false;
@@ -3027,7 +3040,7 @@ bool Server::hudRemove(Player *player, u32 id) {
return true;
}
-bool Server::hudChange(Player *player, u32 id, HudElementStat stat, void *data)
+bool Server::hudChange(RemotePlayer *player, u32 id, HudElementStat stat, void *data)
{
if (!player)
return false;
@@ -3036,7 +3049,7 @@ bool Server::hudChange(Player *player, u32 id, HudElementStat stat, void *data)
return true;
}
-bool Server::hudSetFlags(Player *player, u32 flags, u32 mask)
+bool Server::hudSetFlags(RemotePlayer *player, u32 flags, u32 mask)
{
if (!player)
return false;
@@ -3054,10 +3067,11 @@ bool Server::hudSetFlags(Player *player, u32 flags, u32 mask)
return true;
}
-bool Server::hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount)
+bool Server::hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount)
{
if (!player)
return false;
+
if (hotbar_itemcount <= 0 || hotbar_itemcount > HUD_HOTBAR_ITEMCOUNT_MAX)
return false;
@@ -3068,14 +3082,7 @@ bool Server::hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount)
return true;
}
-s32 Server::hudGetHotbarItemcount(Player *player)
-{
- if (!player)
- return 0;
- return player->getHotbarItemcount();
-}
-
-void Server::hudSetHotbarImage(Player *player, std::string name)
+void Server::hudSetHotbarImage(RemotePlayer *player, std::string name)
{
if (!player)
return;
@@ -3084,14 +3091,14 @@ void Server::hudSetHotbarImage(Player *player, std::string name)
SendHUDSetParam(player->peer_id, HUD_PARAM_HOTBAR_IMAGE, name);
}
-std::string Server::hudGetHotbarImage(Player *player)
+std::string Server::hudGetHotbarImage(RemotePlayer *player)
{
if (!player)
return "";
return player->getHotbarImage();
}
-void Server::hudSetHotbarSelectedImage(Player *player, std::string name)
+void Server::hudSetHotbarSelectedImage(RemotePlayer *player, std::string name)
{
if (!player)
return;
@@ -3100,16 +3107,8 @@ void Server::hudSetHotbarSelectedImage(Player *player, std::string name)
SendHUDSetParam(player->peer_id, HUD_PARAM_HOTBAR_SELECTED_IMAGE, name);
}
-std::string Server::hudGetHotbarSelectedImage(Player *player)
-{
- if (!player)
- return "";
-
- return player->getHotbarSelectedImage();
-}
-
-bool Server::setLocalPlayerAnimations(Player *player,
- v2s32 animation_frames[4], f32 frame_speed)
+bool Server::setLocalPlayerAnimations(RemotePlayer *player,
+ v2s32 animation_frames[4], f32 frame_speed)
{
if (!player)
return false;
@@ -3119,7 +3118,7 @@ bool Server::setLocalPlayerAnimations(Player *player,
return true;
}
-bool Server::setPlayerEyeOffset(Player *player, v3f first, v3f third)
+bool Server::setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third)
{
if (!player)
return false;
@@ -3130,7 +3129,7 @@ bool Server::setPlayerEyeOffset(Player *player, v3f first, v3f third)
return true;
}
-bool Server::setSky(Player *player, const video::SColor &bgcolor,
+bool Server::setSky(RemotePlayer *player, const video::SColor &bgcolor,
const std::string &type, const std::vector<std::string> &params)
{
if (!player)
@@ -3141,7 +3140,7 @@ bool Server::setSky(Player *player, const video::SColor &bgcolor,
return true;
}
-bool Server::overrideDayNightRatio(Player *player, bool do_override,
+bool Server::overrideDayNightRatio(RemotePlayer *player, bool do_override,
float ratio)
{
if (!player)
@@ -3160,7 +3159,8 @@ void Server::notifyPlayers(const std::wstring &msg)
void Server::spawnParticle(const std::string &playername, v3f pos,
v3f velocity, v3f acceleration,
float expirationtime, float size, bool
- collisiondetection, bool vertical, const std::string &texture)
+ collisiondetection, bool collision_removal,
+ bool vertical, const std::string &texture)
{
// m_env will be NULL if the server is initializing
if (!m_env)
@@ -3168,20 +3168,22 @@ void Server::spawnParticle(const std::string &playername, v3f pos,
u16 peer_id = PEER_ID_INEXISTENT;
if (playername != "") {
- Player* player = m_env->getPlayer(playername.c_str());
+ RemotePlayer *player = m_env->getPlayer(playername.c_str());
if (!player)
return;
peer_id = player->peer_id;
}
SendSpawnParticle(peer_id, pos, velocity, acceleration,
- expirationtime, size, collisiondetection, vertical, texture);
+ expirationtime, size, collisiondetection,
+ collision_removal, vertical, texture);
}
u32 Server::addParticleSpawner(u16 amount, float spawntime,
v3f minpos, v3f maxpos, v3f minvel, v3f maxvel, v3f minacc, v3f maxacc,
float minexptime, float maxexptime, float minsize, float maxsize,
- bool collisiondetection, bool vertical, const std::string &texture,
+ bool collisiondetection, bool collision_removal,
+ ServerActiveObject *attached, bool vertical, const std::string &texture,
const std::string &playername)
{
// m_env will be NULL if the server is initializing
@@ -3190,17 +3192,25 @@ u32 Server::addParticleSpawner(u16 amount, float spawntime,
u16 peer_id = PEER_ID_INEXISTENT;
if (playername != "") {
- Player* player = m_env->getPlayer(playername.c_str());
+ RemotePlayer *player = m_env->getPlayer(playername.c_str());
if (!player)
return -1;
peer_id = player->peer_id;
}
- u32 id = m_env->addParticleSpawner(spawntime);
+ u16 attached_id = attached ? attached->getId() : 0;
+
+ u32 id;
+ if (attached_id == 0)
+ id = m_env->addParticleSpawner(spawntime);
+ else
+ id = m_env->addParticleSpawner(spawntime, attached_id);
+
SendAddParticleSpawner(peer_id, amount, spawntime,
minpos, maxpos, minvel, maxvel, minacc, maxacc,
minexptime, maxexptime, minsize, maxsize,
- collisiondetection, vertical, texture, id);
+ collisiondetection, collision_removal, attached_id, vertical,
+ texture, id);
return id;
}
@@ -3213,7 +3223,7 @@ void Server::deleteParticleSpawner(const std::string &playername, u32 id)
u16 peer_id = PEER_ID_INEXISTENT;
if (playername != "") {
- Player* player = m_env->getPlayer(playername.c_str());
+ RemotePlayer *player = m_env->getPlayer(playername.c_str());
if (!player)
return;
peer_id = player->peer_id;
@@ -3223,13 +3233,7 @@ void Server::deleteParticleSpawner(const std::string &playername, u32 id)
SendDeleteParticleSpawner(peer_id, id);
}
-void Server::deleteParticleSpawnerAll(u32 id)
-{
- m_env->deleteParticleSpawner(id);
- SendDeleteParticleSpawner(PEER_ID_INEXISTENT, id);
-}
-
-Inventory* Server::createDetachedInventory(const std::string &name)
+Inventory* Server::createDetachedInventory(const std::string &name, const std::string &player)
{
if(m_detached_inventories.count(name) > 0){
infostream<<"Server clearing detached inventory \""<<name<<"\""<<std::endl;
@@ -3240,6 +3244,7 @@ Inventory* Server::createDetachedInventory(const std::string &name)
Inventory *inv = new Inventory(m_itemdef);
sanity_check(inv);
m_detached_inventories[name] = inv;
+ m_detached_inventories_player[name] = player;
//TODO find a better way to do this
sendDetachedInventory(name,PEER_ID_INEXISTENT);
return inv;
@@ -3431,11 +3436,10 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version
/*
Try to get an existing player
*/
- RemotePlayer *player = static_cast<RemotePlayer*>(m_env->getPlayer(name));
+ RemotePlayer *player = m_env->getPlayer(name);
// If player is already connected, cancel
- if(player != NULL && player->peer_id != 0)
- {
+ if (player != NULL && player->peer_id != 0) {
infostream<<"emergePlayer(): Player already connected"<<std::endl;
return NULL;
}
@@ -3443,27 +3447,24 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version
/*
If player with the wanted peer_id already exists, cancel.
*/
- if(m_env->getPlayer(peer_id) != NULL)
- {
+ if (m_env->getPlayer(peer_id) != NULL) {
infostream<<"emergePlayer(): Player with wrong name but same"
" peer_id already exists"<<std::endl;
return NULL;
}
- // Load player if it isn't already loaded
- if (!player) {
- player = static_cast<RemotePlayer*>(m_env->loadPlayer(name));
- }
+ // Create a new player active object
+ PlayerSAO *playersao = new PlayerSAO(m_env, peer_id, isSingleplayer());
+ player = m_env->loadPlayer(name, playersao);
// Create player if it doesn't exist
if (!player) {
newplayer = true;
- player = new RemotePlayer(this, name);
+ player = new RemotePlayer(name, this->idef());
// Set player position
infostream<<"Server: Finding spawn place for player \""
<<name<<"\""<<std::endl;
- v3f pos = findSpawnPos();
- player->setPosition(pos);
+ playersao->setBasePosition(findSpawnPos());
// Make sure the player is saved
player->setModified(true);
@@ -3474,18 +3475,14 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id, u16 proto_version
// If the player exists, ensure that they respawn inside legal bounds
// This fixes an assert crash when the player can't be added
// to the environment
- if (objectpos_over_limit(player->getPosition())) {
+ if (objectpos_over_limit(playersao->getBasePosition())) {
actionstream << "Respawn position for player \""
<< name << "\" outside limits, resetting" << std::endl;
- v3f pos = findSpawnPos();
- player->setPosition(pos);
+ playersao->setBasePosition(findSpawnPos());
}
}
- // Create a new player active object
- PlayerSAO *playersao = new PlayerSAO(m_env, player, peer_id,
- getPlayerEffectivePrivs(player->getName()),
- isSingleplayer());
+ playersao->initialize(player, getPlayerEffectivePrivs(player->getName()));
player->protocol_version = proto_version;
diff --git a/src/server.h b/src/server.h
index daf51dee1..4425d139b 100644
--- a/src/server.h
+++ b/src/server.h
@@ -34,6 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "environment.h"
#include "chat_interface.h"
#include "clientiface.h"
+#include "remoteplayer.h"
#include "network/networkpacket.h"
#include <string>
#include <list>
@@ -48,7 +49,6 @@ class IWritableCraftDefManager;
class BanManager;
class EventManager;
class Inventory;
-class Player;
class PlayerSAO;
class IRollbackManager;
struct RollbackAction;
@@ -64,31 +64,6 @@ enum ClientDeletionReason {
CDR_DENY
};
-class MapEditEventIgnorer
-{
-public:
- MapEditEventIgnorer(bool *flag):
- m_flag(flag)
- {
- if(*m_flag == false)
- *m_flag = true;
- else
- m_flag = NULL;
- }
-
- ~MapEditEventIgnorer()
- {
- if(m_flag)
- {
- assert(*m_flag);
- *m_flag = false;
- }
- }
-
-private:
- bool *m_flag;
-};
-
class MapEditEventAreaIgnorer
{
public:
@@ -157,7 +132,7 @@ struct ServerSoundParams
struct ServerPlayingSound
{
ServerSoundParams params;
- std::set<u16> clients; // peer ids
+ UNORDERED_SET<u16> clients; // peer ids
};
class Server : public con::PeerHandler, public MapEventReceiver,
@@ -222,6 +197,10 @@ public:
void Send(NetworkPacket* pkt);
+ // Helper for handleCommand_PlayerPos and handleCommand_Interact
+ void process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
+ NetworkPacket *pkt);
+
// Both setter and getter need no envlock,
// can be called freely from threads
void setTimeOfDay(u32 time);
@@ -241,13 +220,12 @@ public:
// Connection must be locked when called
std::wstring getStatusString();
+ inline double getUptime() const { return m_uptime.m_value; }
// read shutdown state
- inline bool getShutdownRequested()
- { return m_shutdown_requested; }
+ inline bool getShutdownRequested() const { return m_shutdown_requested; }
// request server to shutdown
- inline void requestShutdown() { m_shutdown_requested = true; }
void requestShutdown(const std::string &msg, bool reconnect)
{
m_shutdown_requested = true;
@@ -275,7 +253,8 @@ public:
void spawnParticle(const std::string &playername,
v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size,
- bool collisiondetection, bool vertical, const std::string &texture);
+ bool collisiondetection, bool collision_removal,
+ bool vertical, const std::string &texture);
u32 addParticleSpawner(u16 amount, float spawntime,
v3f minpos, v3f maxpos,
@@ -283,14 +262,15 @@ public:
v3f minacc, v3f maxacc,
float minexptime, float maxexptime,
float minsize, float maxsize,
- bool collisiondetection, bool vertical, const std::string &texture,
+ bool collisiondetection, bool collision_removal,
+ ServerActiveObject *attached,
+ bool vertical, const std::string &texture,
const std::string &playername);
void deleteParticleSpawner(const std::string &playername, u32 id);
- void deleteParticleSpawnerAll(u32 id);
// Creates or resets inventory
- Inventory* createDetachedInventory(const std::string &name);
+ Inventory* createDetachedInventory(const std::string &name, const std::string &player="");
// Envlock and conlock should be locked when using scriptapi
GameScripting *getScriptIface(){ return m_script; }
@@ -318,11 +298,11 @@ public:
IWritableNodeDefManager* getWritableNodeDefManager();
IWritableCraftDefManager* getWritableCraftDefManager();
+ const std::vector<ModSpec> &getMods() const { return m_mods; }
const ModSpec* getModSpec(const std::string &modname) const;
void getModNames(std::vector<std::string> &modlist);
std::string getBuiltinLuaPath();
- inline std::string getWorldPath() const
- { return m_path_world; }
+ inline std::string getWorldPath() const { return m_path_world; }
inline bool isSingleplayer()
{ return m_simple_singleplayer_mode; }
@@ -334,28 +314,32 @@ public:
Map & getMap() { return m_env->getMap(); }
ServerEnvironment & getEnv() { return *m_env; }
- u32 hudAdd(Player *player, HudElement *element);
- bool hudRemove(Player *player, u32 id);
- bool hudChange(Player *player, u32 id, HudElementStat stat, void *value);
- bool hudSetFlags(Player *player, u32 flags, u32 mask);
- bool hudSetHotbarItemcount(Player *player, s32 hotbar_itemcount);
- s32 hudGetHotbarItemcount(Player *player);
- void hudSetHotbarImage(Player *player, std::string name);
- std::string hudGetHotbarImage(Player *player);
- void hudSetHotbarSelectedImage(Player *player, std::string name);
- std::string hudGetHotbarSelectedImage(Player *player);
+ u32 hudAdd(RemotePlayer *player, HudElement *element);
+ bool hudRemove(RemotePlayer *player, u32 id);
+ bool hudChange(RemotePlayer *player, u32 id, HudElementStat stat, void *value);
+ bool hudSetFlags(RemotePlayer *player, u32 flags, u32 mask);
+ bool hudSetHotbarItemcount(RemotePlayer *player, s32 hotbar_itemcount);
+ s32 hudGetHotbarItemcount(RemotePlayer *player) const
+ { return player->getHotbarItemcount(); }
+ void hudSetHotbarImage(RemotePlayer *player, std::string name);
+ std::string hudGetHotbarImage(RemotePlayer *player);
+ void hudSetHotbarSelectedImage(RemotePlayer *player, std::string name);
+ const std::string &hudGetHotbarSelectedImage(RemotePlayer *player) const
+ {
+ return player->getHotbarSelectedImage();
+ }
inline Address getPeerAddress(u16 peer_id)
{ return m_con.GetPeerAddress(peer_id); }
- bool setLocalPlayerAnimations(Player *player, v2s32 animation_frames[4], f32 frame_speed);
- bool setPlayerEyeOffset(Player *player, v3f first, v3f third);
+ bool setLocalPlayerAnimations(RemotePlayer *player, v2s32 animation_frames[4],
+ f32 frame_speed);
+ bool setPlayerEyeOffset(RemotePlayer *player, v3f first, v3f third);
- bool setSky(Player *player, const video::SColor &bgcolor,
+ bool setSky(RemotePlayer *player, const video::SColor &bgcolor,
const std::string &type, const std::vector<std::string> &params);
- bool overrideDayNightRatio(Player *player, bool do_override,
- float brightness);
+ bool overrideDayNightRatio(RemotePlayer *player, bool do_override, float brightness);
/* con::PeerHandler implementation. */
void peerAdded(con::Peer *peer);
@@ -456,7 +440,9 @@ private:
v3f minacc, v3f maxacc,
float minexptime, float maxexptime,
float minsize, float maxsize,
- bool collisiondetection, bool vertical, std::string texture, u32 id);
+ bool collisiondetection, bool collision_removal,
+ u16 attached_id,
+ bool vertical, const std::string &texture, u32 id);
void SendDeleteParticleSpawner(u16 peer_id, u32 id);
@@ -464,7 +450,8 @@ private:
void SendSpawnParticle(u16 peer_id,
v3f pos, v3f velocity, v3f acceleration,
float expirationtime, float size,
- bool collisiondetection, bool vertical, std::string texture);
+ bool collisiondetection, bool collision_removal,
+ bool vertical, const std::string &texture);
u32 SendActiveObjectRemoveAdd(u16 peer_id, const std::string &datas);
void SendActiveObjectMessages(u16 peer_id, const std::string &datas, bool reliable = true);
@@ -475,7 +462,7 @@ private:
void DiePlayer(u16 peer_id);
void RespawnPlayer(u16 peer_id);
void DeleteClient(u16 peer_id, ClientDeletionReason reason);
- void UpdateCrafting(Player *player);
+ void UpdateCrafting(RemotePlayer *player);
void handleChatInterfaceEvent(ChatEvent *evt);
@@ -483,7 +470,7 @@ private:
std::wstring handleChat(const std::string &name, const std::wstring &wname,
const std::wstring &wmessage,
bool check_shout_priv = false,
- u16 peer_id_to_avoid_sending = PEER_ID_INEXISTENT);
+ RemotePlayer *player = NULL);
void handleAdminChat(const ChatEventChat *evt);
v3f findSpawnPos();
@@ -518,6 +505,7 @@ private:
// If true, do not allow multiple players and hide some multiplayer
// functionality
bool m_simple_singleplayer_mode;
+ u16 m_max_chatmessage_length;
// Thread can set; step() will throw as ServerError
MutexedVariable<std::string> m_async_fatal_error;
@@ -525,9 +513,7 @@ private:
// Some timers
float m_liquid_transform_timer;
float m_liquid_transform_every;
- float m_print_info_timer;
float m_masterserver_timer;
- float m_objectdata_timer;
float m_emergethread_trigger_timer;
float m_savemap_timer;
IntervalLimiter m_map_timer_and_unload_interval;
@@ -649,12 +635,12 @@ private:
u16 m_ignore_map_edit_events_peer_id;
// media files known to server
- std::map<std::string,MediaInfo> m_media;
+ UNORDERED_MAP<std::string, MediaInfo> m_media;
/*
Sounds
*/
- std::map<s32, ServerPlayingSound> m_playing_sounds;
+ UNORDERED_MAP<s32, ServerPlayingSound> m_playing_sounds;
s32 m_next_sound_id;
/*
@@ -662,6 +648,8 @@ private:
*/
// key = name
std::map<std::string, Inventory*> m_detached_inventories;
+ // value = "" (visible to all players) or player name
+ std::map<std::string, std::string> m_detached_inventories_player;
DISABLE_CLASS_COPY(Server);
};
diff --git a/src/serverlist.cpp b/src/serverlist.cpp
index de7962a68..87ca5dc04 100644
--- a/src/serverlist.cpp
+++ b/src/serverlist.cpp
@@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "porting.h"
#include "log.h"
#include "network/networkprotocol.h"
-#include "json/json.h"
+#include <json/json.h>
#include "convert_json.h"
#include "httpfetch.h"
#include "util/string.h"
diff --git a/src/serverlist.h b/src/serverlist.h
index 8ffea44cc..0747c3920 100644
--- a/src/serverlist.h
+++ b/src/serverlist.h
@@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <iostream>
#include "config.h"
#include "mods.h"
-#include "json/json.h"
+#include <json/json.h>
#ifndef SERVERLIST_HEADER
#define SERVERLIST_HEADER
diff --git a/src/serverobject.cpp b/src/serverobject.cpp
index 236d7e8dc..191247829 100644
--- a/src/serverobject.cpp
+++ b/src/serverobject.cpp
@@ -98,4 +98,3 @@ bool ServerActiveObject::setWieldedItem(const ItemStack &item)
}
return false;
}
-
diff --git a/src/serverobject.h b/src/serverobject.h
index 597eb63a8..9884eb0a1 100644
--- a/src/serverobject.h
+++ b/src/serverobject.h
@@ -44,7 +44,6 @@ Some planning
class ServerEnvironment;
struct ItemStack;
-class Player;
struct ToolCapabilities;
struct ObjectProperties;
@@ -69,24 +68,24 @@ public:
// environment
virtual bool environmentDeletes() const
{ return true; }
-
+
// Create a certain type of ServerActiveObject
static ServerActiveObject* create(ActiveObjectType type,
ServerEnvironment *env, u16 id, v3f pos,
const std::string &data);
-
+
/*
Some simple getters/setters
*/
v3f getBasePosition(){ return m_base_position; }
void setBasePosition(v3f pos){ m_base_position = pos; }
ServerEnvironment* getEnv(){ return m_env; }
-
+
/*
Some more dynamic interface
*/
-
- virtual void setPos(v3f pos)
+
+ virtual void setPos(const v3f &pos)
{ setBasePosition(pos); }
// continuous: if true, object does not stop immediately at pos
virtual void moveTo(v3f pos, bool continuous)
@@ -96,7 +95,7 @@ public:
virtual float getMinimumSavedMovement();
virtual std::string getDescription(){return "SAO";}
-
+
/*
Step object in time.
Messages added to messages are sent to client over network.
@@ -108,13 +107,13 @@ public:
packet.
*/
virtual void step(float dtime, bool send_recommended){}
-
+
/*
The return value of this is passed to the client-side object
when it is created
*/
virtual std::string getClientInitializationData(u16 protocol_version){return "";}
-
+
/*
The return value of this is passed to the server-side object
when it is created (converted from static to active - actually
@@ -131,7 +130,7 @@ public:
*/
virtual bool isStaticAllowed() const
{return true;}
-
+
// Returns tool wear
virtual int punch(v3f dir,
const ToolCapabilities *toolcap=NULL,
@@ -167,8 +166,8 @@ public:
{}
virtual void removeAttachmentChild(int child_id)
{}
- virtual std::set<int> getAttachmentChildIds()
- { return std::set<int>(); }
+ virtual UNORDERED_SET<int> getAttachmentChildIds()
+ { return UNORDERED_SET<int>(); }
virtual ObjectProperties* accessObjectProperties()
{ return NULL; }
virtual void notifyObjectPropertiesModified()
@@ -189,6 +188,15 @@ public:
{ return 0; }
virtual ItemStack getWieldedItem() const;
virtual bool setWieldedItem(const ItemStack &item);
+ inline void attachParticleSpawner(u32 id)
+ {
+ m_attached_particle_spawners.insert(id);
+ }
+ inline void detachParticleSpawner(u32 id)
+ {
+ m_attached_particle_spawners.erase(id);
+ }
+
/*
Number of players which know about this object. Object won't be
@@ -207,7 +215,7 @@ public:
- This can be set to true by anything else too.
*/
bool m_removed;
-
+
/*
This is set to true when an object should be removed from the active
object list but couldn't be removed because the id has to be
@@ -218,7 +226,7 @@ public:
list.
*/
bool m_pending_deactivation;
-
+
/*
Whether the object's static data has been stored to a block
*/
@@ -228,12 +236,12 @@ public:
a copy of the static data resides.
*/
v3s16 m_static_block;
-
+
/*
Queue of messages to be sent to the client
*/
std::queue<ActiveObjectMessage> m_messages_out;
-
+
protected:
// Used for creating objects based on type
typedef ServerActiveObject* (*Factory)
@@ -243,6 +251,7 @@ protected:
ServerEnvironment *m_env;
v3f m_base_position;
+ UNORDERED_SET<u32> m_attached_particle_spawners;
private:
// Used for creating objects based on type
diff --git a/src/settings.cpp b/src/settings.cpp
index 56afa6133..c4c3c9073 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -196,9 +196,8 @@ void Settings::writeLines(std::ostream &os, u32 tab_depth) const
{
MutexAutoLock lock(m_mutex);
- for (std::map<std::string, SettingsEntry>::const_iterator
- it = m_settings.begin();
- it != m_settings.end(); ++it)
+ for (SettingEntries::const_iterator it = m_settings.begin();
+ it != m_settings.end(); ++it)
printEntry(os, it->first, it->second, tab_depth);
}
@@ -231,7 +230,7 @@ void Settings::printEntry(std::ostream &os, const std::string &name,
bool Settings::updateConfigObject(std::istream &is, std::ostream &os,
const std::string &end, u32 tab_depth)
{
- std::map<std::string, SettingsEntry>::const_iterator it;
+ SettingEntries::const_iterator it;
std::set<std::string> present_entries;
std::string line, name, value;
bool was_modified = false;
@@ -381,7 +380,7 @@ const SettingsEntry &Settings::getEntry(const std::string &name) const
{
MutexAutoLock lock(m_mutex);
- std::map<std::string, SettingsEntry>::const_iterator n;
+ SettingEntries::const_iterator n;
if ((n = m_settings.find(name)) == m_settings.end()) {
if ((n = m_defaults.find(name)) == m_defaults.end())
throw SettingNotFoundException("Setting [" + name + "] not found.");
@@ -572,9 +571,8 @@ bool Settings::exists(const std::string &name) const
std::vector<std::string> Settings::getNames() const
{
std::vector<std::string> names;
- for (std::map<std::string, SettingsEntry>::const_iterator
- i = m_settings.begin();
- i != m_settings.end(); ++i) {
+ for (SettingEntries::const_iterator i = m_settings.begin();
+ i != m_settings.end(); ++i) {
names.push_back(i->first);
}
return names;
@@ -880,7 +878,7 @@ bool Settings::remove(const std::string &name)
{
MutexAutoLock lock(m_mutex);
- std::map<std::string, SettingsEntry>::iterator it = m_settings.find(name);
+ SettingEntries::iterator it = m_settings.find(name);
if (it != m_settings.end()) {
delete it->second.group;
m_settings.erase(it);
@@ -912,7 +910,6 @@ void Settings::updateValue(const Settings &other, const std::string &name)
try {
std::string val = other.get(name);
-
m_settings[name] = val;
} catch (SettingNotFoundException &e) {
}
@@ -968,8 +965,9 @@ void Settings::updateNoLock(const Settings &other)
void Settings::clearNoLock()
{
- std::map<std::string, SettingsEntry>::const_iterator it;
- for (it = m_settings.begin(); it != m_settings.end(); ++it)
+
+ for (SettingEntries::const_iterator it = m_settings.begin();
+ it != m_settings.end(); ++it)
delete it->second.group;
m_settings.clear();
@@ -978,46 +976,45 @@ void Settings::clearNoLock()
void Settings::clearDefaultsNoLock()
{
- std::map<std::string, SettingsEntry>::const_iterator it;
- for (it = m_defaults.begin(); it != m_defaults.end(); ++it)
+ for (SettingEntries::const_iterator it = m_defaults.begin();
+ it != m_defaults.end(); ++it)
delete it->second.group;
m_defaults.clear();
}
-void Settings::registerChangedCallback(std::string name,
- setting_changed_callback cbf, void *userdata)
+void Settings::registerChangedCallback(const std::string &name,
+ SettingsChangedCallback cbf, void *userdata)
{
- MutexAutoLock lock(m_callbackMutex);
+ MutexAutoLock lock(m_callback_mutex);
m_callbacks[name].push_back(std::make_pair(cbf, userdata));
}
-void Settings::deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata)
+void Settings::deregisterChangedCallback(const std::string &name,
+ SettingsChangedCallback cbf, void *userdata)
{
- MutexAutoLock lock(m_callbackMutex);
- std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
- if (iterToVector != m_callbacks.end())
- {
- std::vector<std::pair<setting_changed_callback, void*> > &vector = iterToVector->second;
+ MutexAutoLock lock(m_callback_mutex);
+ SettingsCallbackMap::iterator it_cbks = m_callbacks.find(name);
- std::vector<std::pair<setting_changed_callback, void*> >::iterator position =
- std::find(vector.begin(), vector.end(), std::make_pair(cbf, userdata));
+ if (it_cbks != m_callbacks.end()) {
+ SettingsCallbackList &cbks = it_cbks->second;
- if (position != vector.end())
- vector.erase(position);
+ SettingsCallbackList::iterator position =
+ std::find(cbks.begin(), cbks.end(), std::make_pair(cbf, userdata));
+
+ if (position != cbks.end())
+ cbks.erase(position);
}
}
-void Settings::doCallbacks(const std::string name)
+void Settings::doCallbacks(const std::string &name) const
{
- MutexAutoLock lock(m_callbackMutex);
- std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
- if (iterToVector != m_callbacks.end())
- {
- std::vector<std::pair<setting_changed_callback, void*> >::iterator iter;
- for (iter = iterToVector->second.begin(); iter != iterToVector->second.end(); ++iter)
- {
- (iter->first)(name, iter->second);
- }
+ MutexAutoLock lock(m_callback_mutex);
+
+ SettingsCallbackMap::const_iterator it_cbks = m_callbacks.find(name);
+ if (it_cbks != m_callbacks.end()) {
+ SettingsCallbackList::const_iterator it;
+ for (it = it_cbks->second.begin(); it != it_cbks->second.end(); ++it)
+ (it->first)(name, it->second);
}
}
diff --git a/src/settings.h b/src/settings.h
index 80d41fd79..b19733514 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -24,7 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/string.h"
#include "threading/mutex.h"
#include <string>
-#include <map>
+#include "util/cpp11_container.h"
#include <list>
#include <set>
@@ -35,8 +35,17 @@ struct NoiseParams;
extern Settings *g_settings;
extern std::string g_settings_path;
-/** function type to register a changed callback */
-typedef void (*setting_changed_callback)(const std::string &name, void *data);
+// Type for a settings changed callback function
+typedef void (*SettingsChangedCallback)(const std::string &name, void *data);
+
+typedef std::vector<
+ std::pair<
+ SettingsChangedCallback,
+ void *
+ >
+> SettingsCallbackList;
+
+typedef UNORDERED_MAP<std::string, SettingsCallbackList> SettingsCallbackMap;
enum ValueType {
VALUETYPE_STRING,
@@ -89,6 +98,8 @@ struct SettingsEntry {
bool is_group;
};
+typedef UNORDERED_MAP<std::string, SettingsEntry> SettingEntries;
+
class Settings {
public:
Settings() {}
@@ -209,24 +220,28 @@ public:
void clearDefaults();
void updateValue(const Settings &other, const std::string &name);
void update(const Settings &other);
- void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
- void deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
-private:
+ void registerChangedCallback(const std::string &name,
+ SettingsChangedCallback cbf, void *userdata = NULL);
+ void deregisterChangedCallback(const std::string &name,
+ SettingsChangedCallback cbf, void *userdata = NULL);
+private:
void updateNoLock(const Settings &other);
void clearNoLock();
void clearDefaultsNoLock();
- void doCallbacks(std::string name);
+ void doCallbacks(const std::string &name) const;
+
+ SettingEntries m_settings;
+ SettingEntries m_defaults;
- std::map<std::string, SettingsEntry> m_settings;
- std::map<std::string, SettingsEntry> m_defaults;
+ SettingsCallbackMap m_callbacks;
- std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks;
+ mutable Mutex m_callback_mutex;
- mutable Mutex m_callbackMutex;
- mutable Mutex m_mutex; // All methods that access m_settings/m_defaults directly should lock this.
+ // All methods that access m_settings/m_defaults directly should lock this.
+ mutable Mutex m_mutex;
};
diff --git a/src/settings_translation_file.cpp b/src/settings_translation_file.cpp
index f7e14dd65..39223d9ce 100644
--- a/src/settings_translation_file.cpp
+++ b/src/settings_translation_file.cpp
@@ -1,6 +1,6 @@
// This file is automatically generated
// It conatins a bunch of fake gettext calls, to tell xgettext about the strings in config files
-// To update it, refer to the bottom of builtin/mainmenu/tab_settings.lua
+// To update it, refer to the bottom of builtin/mainmenu/dlg_settings_advanced.lua
fake_function() {
gettext("Client");
@@ -14,7 +14,7 @@ fake_function() {
gettext("Noclip");
gettext("If enabled together with fly mode, player is able to fly through solid nodes.\nThis requires the \"noclip\" privilege on the server.");
gettext("Cinematic mode");
- gettext("Smooths camera when moving and looking around.\nUseful for recording videos.");
+ gettext("Smooths camera when looking around. Also called look or mouse smoothing.\nUseful for recording videos.");
gettext("Camera smoothing");
gettext("Smooths rotation of camera. 0 to disable.");
gettext("Camera smoothing in cinematic mode");
@@ -35,6 +35,12 @@ fake_function() {
gettext("Enable random user input (only used for testing).");
gettext("Continuous forward");
gettext("Continuous forward movement (only used for testing).");
+ gettext("Enable Joysticks");
+ gettext("Enable Joysticks");
+ gettext("Joystick button repetition interval");
+ gettext("The time in seconds it takes between repeated events\nwhen holding down a joystick button combination.");
+ gettext("Joystick frustum sensitivity");
+ gettext("The sensitivity of the joystick axes for moving the\ningame view frustum around.");
gettext("Forward key");
gettext("Key for moving the player forward.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Backward key");
@@ -65,6 +71,8 @@ fake_function() {
gettext("Key for toggling fast mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Noclip key");
gettext("Key for toggling noclip mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
+ gettext("Autorun key");
+ gettext("Key for toggling autorun.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Cinematic mode key");
gettext("Key for toggling cinematic mode.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Minimap key");
@@ -80,7 +88,7 @@ fake_function() {
gettext("Fog toggle key");
gettext("Key for toggling the display of the fog.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Camera update toggle key");
- gettext("Key for toggling the camrea update. Only used for development\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
+ gettext("Key for toggling the camera update. Only used for development\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Debug info toggle key");
gettext("Key for toggling the display of debug info.\nSee http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3");
gettext("Profiler toggle key");
@@ -146,7 +154,7 @@ fake_function() {
gettext("Experimental option, might cause visible spaces between blocks\nwhen set to higher number than 0.");
gettext("Shaders");
gettext("Shaders");
- gettext("Shaders allow advanced visul effects and may increase performance on some video cards.\nThy only work with the OpenGL video backend.");
+ gettext("Shaders allow advanced visual effects and may increase performance on some video cards.\nThy only work with the OpenGL video backend.");
gettext("Tone Mapping");
gettext("Filmic tone mapping");
gettext("Enables filmic tone mapping");
@@ -188,7 +196,7 @@ fake_function() {
gettext("FPS in pause menu");
gettext("Maximum FPS when game is paused.");
gettext("Viewing range");
- gettext("View distance in nodes.\nMin = 20");
+ gettext("View distance in nodes.");
gettext("Screen width");
gettext("Width component of the initial window size.");
gettext("Screen height");
@@ -201,6 +209,8 @@ fake_function() {
gettext("Vertical screen synchronization.");
gettext("Field of view");
gettext("Field of view in degrees.");
+ gettext("Field of view for zoom");
+ gettext("Field of view while zooming in degrees.\nThis requires the \"zoom\" privilege on the server.");
gettext("Gamma");
gettext("Adjust the gamma encoding for the light tables. Lower numbers are brighter.\nThis setting is for the client only and is ignored by the server.");
gettext("Texture path");
@@ -247,6 +257,8 @@ fake_function() {
gettext("The strength (darkness) of node ambient-occlusion shading.\nLower is darker, Higher is lighter. The valid range of values for this\nsetting is 0.25 to 4.0 inclusive. If the value is out of range it will be\nset to the nearest valid value.");
gettext("Inventory items animations");
gettext("Enables animation of inventory items.");
+ gettext("Fog Start");
+ gettext("Fraction of the visible distance at which fog starts to be rendered");
gettext("Menus");
gettext("Clouds in menu");
gettext("Use a cloud animation for the main menu background.");
@@ -255,7 +267,7 @@ fake_function() {
gettext("GUI scaling filter");
gettext("When gui_scaling_filter is true, all GUI images need to be\nfiltered in software, but some images are generated directly\nto hardware (e.g. render-to-texture for nodes in inventory).");
gettext("GUI scaling filter txr2img");
- gettext("When gui_scaling_filter_txr2img is true, copy those images\nfrom hardware to software for scaling. When false, fall back\nto the old scaling method, for video drivers that don't\npropery support downloading textures back from hardware.");
+ gettext("When gui_scaling_filter_txr2img is true, copy those images\nfrom hardware to software for scaling. When false, fall back\nto the old scaling method, for video drivers that don't\nproperly support downloading textures back from hardware.");
gettext("Tooltip delay");
gettext("Delay showing tooltips, stated in milliseconds.");
gettext("Freetype fonts");
@@ -306,6 +318,8 @@ fake_function() {
gettext("Automaticaly report to the serverlist.");
gettext("Serverlist URL");
gettext("Announce to this serverlist.\nIf you want to announce your ipv6 address, use serverlist_url = v6.servers.minetest.net.");
+ gettext("Disable escape sequences");
+ gettext("Disable escape sequences, e.g. chat coloring.\nUse this if you want to run a server with pre-0.4.14 clients and you want to disable\nthe escape sequences generated by mods.");
gettext("Network");
gettext("Server port");
gettext("Network port to listen (UDP).\nThis value will be overridden when starting from the main menu.");
@@ -318,10 +332,11 @@ fake_function() {
gettext("IPv6 server");
gettext("Enable/disable running an IPv6 server. An IPv6 server may be restricted\nto IPv6 clients, depending on system configuration.\nIgnored if bind_address is set.");
gettext("Advanced");
- gettext("Maximum simultaneously blocks send per client");
- gettext("How many blocks are flying in the wire simultaneously per client.");
- gettext("Maximum simultaneously bocks send total");
- gettext("How many blocks are flying in the wire simultaneously for the whole server.");
+ gettext("Maximum simultaneous block sends per client");
+ gettext("Maximum number of blocks that are simultaneously sent per client.");
+ gettext("Maximum simultaneous block sends total");
+ gettext("Maximum number of blocks that are simultaneously sent in total.");
+ gettext("Delay in sending blocks after building");
gettext("To reduce lag, block transfers are slowed down when a player is building something.\nThis determines how long they are slowed down after placing or removing a node.");
gettext("Max. packets per iteration");
gettext("Maximum number of packets sent per send step, if you have a slow connection\ntry reducing it, but don't reduce it to a number below double of targeted\nclient number.");
@@ -397,17 +412,11 @@ fake_function() {
gettext("Advanced");
gettext("Deprecated Lua API handling");
gettext("Handling for deprecated lua api calls:\n- legacy: (try to) mimic old behaviour (default for release).\n- log: mimic and log backtrace of deprecated call (default for debug).\n- error: abort on usage of deprecated call (suggested for mod developers).");
- gettext("Mod profiling");
- gettext("Useful for mod developers.");
- gettext("Detailed mod profiling");
- gettext("Detailed mod profile data. Useful for mod developers.");
- gettext("Profiling print interval");
- gettext("Profiler data print interval. 0 = disable. Useful for developers.");
gettext("Max. clearobjects extra blocks");
gettext("Number of extra blocks that can be loaded by /clearobjects at once.\nThis is a trade-off between sqlite transaction overhead and\nmemory consumption (4096=100MB, as a rule of thumb).");
gettext("Unload unused server data");
gettext("How much the server will wait before unloading unused mapblocks.\nHigher value is smoother, but will use more RAM.");
- gettext("Maxmimum objects per block");
+ gettext("Maximum objects per block");
gettext("Maximum number of statically stored objects in a block.");
gettext("Synchronous SQLite");
gettext("See http://www.sqlite.org/pragma.html#pragma_synchronous");
@@ -427,6 +436,8 @@ fake_function() {
gettext("The time (in seconds) that the liquids queue may grow beyond processing\ncapacity until an attempt is made to decrease its size by dumping old queue\nitems. A value of 0 disables the functionality.");
gettext("Liquid update tick");
gettext("Liquid update interval in seconds.");
+ gettext("block send optimize distance");
+ gettext("At this distance the server will aggressively optimize which blocks are sent to clients.\nSmall values potentially improve performance a lot, at the expense of visible rendering glitches.\n(some blocks will not be rendered under water and in caves, as well as sometimes on land)\nSetting this to a value greater than max_block_send_distance disables this optimization.\nStated in mapblocks (16 nodes)");
gettext("Mapgen");
gettext("Mapgen name");
gettext("Name of map generator to be used when creating a new world.\nCreating a world in the main menu will override this.");
@@ -437,7 +448,7 @@ fake_function() {
gettext("Map generation limit");
gettext("Where the map generator stops.\nPlease note:\n- Limited to 31000 (setting above has no effect)\n- The map generator works in groups of 80x80x80 nodes (5x5x5 MapBlocks).\n- Those groups have an offset of -32, -32 nodes from the origin.\n- Only groups which are within the map_generation_limit are generated");
gettext("Mapgen flags");
- gettext("Global map generation attributes.\nIn Mapgen v6 the 'decorations' flag controls all decorations except trees\nand junglegrass, in all other mapgens this flag controls all decorations.\nThe default flags set in the engine are: caves, light, decorations\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+ gettext("Global map generation attributes.\nIn Mapgen v6 the 'decorations' flag controls all decorations except trees\nand junglegrass, in all other mapgens this flag controls all decorations.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
gettext("Advanced");
gettext("Chunk size");
gettext("Size of chunks to be generated at once by mapgen, stated in mapblocks (16 nodes).");
@@ -466,7 +477,7 @@ fake_function() {
gettext("Mapgen v5 cave2 noise parameters");
gettext("Mapgen v6");
gettext("Mapgen v6 flags");
- gettext("Map generation attributes specific to Mapgen v6.\nWhen snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.\nThe default flags set in the engine are: biomeblend, mudflow\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+ gettext("Map generation attributes specific to Mapgen v6.\nWhen snowbiomes are enabled jungles are automatically enabled, the 'jungles' flag is ignored.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
gettext("Mapgen v6 desert frequency");
gettext("Controls size of deserts and beaches in Mapgen v6.\nWhen snowbiomes are enabled 'mgv6_freq_desert' is ignored.");
gettext("Mapgen v6 beach frequency");
@@ -483,23 +494,33 @@ fake_function() {
gettext("Mapgen v6 apple trees noise parameters");
gettext("Mapgen v7");
gettext("Mapgen v7 flags");
- gettext("Map generation attributes specific to Mapgen v7.\nThe 'ridges' flag controls the rivers.\nThe default flags set in the engine are: mountains, ridges\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+ gettext("Map generation attributes specific to Mapgen v7.\nThe 'ridges' flag enables the rivers.\nFloatlands are currently experimental and subject to change.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
gettext("Mapgen v7 cave width");
gettext("Controls width of tunnels, a smaller value creates wider tunnels.");
+ gettext("Mapgen v7 floatland mountain density");
+ gettext("Controls the density of floatland mountain terrain.\nIs an offset added to the 'np_mountain' noise value.");
+ gettext("Mapgen v7 floatland mountain height");
+ gettext("Typical maximum height, above and below midpoint, of floatland mountain terrain.");
+ gettext("Mapgen v7 floatland level");
+ gettext("Y-level of floatland midpoint and lake surface.");
+ gettext("Mapgen v7 shadow limit");
+ gettext("Y-level to which floatland shadows extend.");
gettext("Mapgen v7 terrain base noise parameters");
gettext("Mapgen v7 terrain altitude noise parameters");
gettext("Mapgen v7 terrain persistation noise parameters");
gettext("Mapgen v7 height select noise parameters");
gettext("Mapgen v7 filler depth noise parameters");
gettext("Mapgen v7 mount height noise parameters");
- gettext("Mapgen v7 ridge water noise parameters");
+ gettext("Mapgen v7 river course noise parameters");
+ gettext("Mapgen v7 floatland base terrain noise parameters");
+ gettext("Mapgen v7 floatland base terrain height noise parameters");
gettext("Mapgen v7 mountain noise parameters");
- gettext("Mapgen v7 ridge noise parameters");
+ gettext("Mapgen v7 river channel wall noise parameters");
gettext("Mapgen v7 cave1 noise parameters");
gettext("Mapgen v7 cave2 noise parameters");
gettext("Mapgen flat");
gettext("Mapgen flat flags");
- gettext("Map generation attributes specific to Mapgen flat.\nOccasional lakes and hills can be added to the flat world.\nThe default flags set in the engine are: none\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+ gettext("Map generation attributes specific to Mapgen flat.\nOccasional lakes and hills can be added to the flat world.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
gettext("Mapgen flat ground level");
gettext("Y of flat ground.");
gettext("Mapgen flat large cave depth");
@@ -547,7 +568,7 @@ fake_function() {
gettext("Mapgen Valleys");
gettext("General");
gettext("Valleys C Flags");
- gettext("Map generation attributes specific to Mapgen Valleys.\n'altitude_chill' makes higher elevations colder, which may cause biome issues.\n'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,\nit may interfere with delicately adjusted biomes.\nThe default flags set in the engine are: altitude_chill, humid_rivers\nThe flags string modifies the engine defaults.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
+ gettext("Map generation attributes specific to Mapgen Valleys.\n'altitude_chill' makes higher elevations colder, which may cause biome issues.\n'humid_rivers' modifies the humidity around rivers and in areas where water would tend to pool,\nit may interfere with delicately adjusted biomes.\nFlags that are not specified in the flag string are not modified from the default.\nFlags starting with 'no' are used to explicitly disable them.");
gettext("Altitude Chill");
gettext("The altitude at which temperature drops by 20C");
gettext("Large cave depth");
@@ -591,7 +612,31 @@ fake_function() {
gettext("Trusted mods");
gettext("Comma-separated list of trusted mods that are allowed to access insecure\nfunctions even when mod security is on (via request_insecure_environment()).");
gettext("HTTP Mods");
- gettext("Comma-seperated list of mods that are allowed to access HTTP APIs, which\nallow them to upload and download data to/from the internet.");
+ gettext("Comma-separated list of mods that are allowed to access HTTP APIs, which\nallow them to upload and download data to/from the internet.");
+ gettext("Advanced");
+ gettext("Profiling");
+ gettext("Load the game profiler");
+ gettext("Load the game profiler to collect game profiling data.\nProvides a /profiler command to access the compiled profile.\nUseful for mod developers and server operators.");
+ gettext("Default report format");
+ gettext("The default format in which profiles are being saved,\nwhen calling `/profiler save [format]` without format.");
+ gettext("Report path");
+ gettext("The file path relative to your worldpath in which profiles will be saved to.\n");
+ gettext("Instrumentation");
+ gettext("Entity methods");
+ gettext("Instrument the methods of entities on registration.");
+ gettext("Active Block Modifiers");
+ gettext("Instrument the action function of Active Block Modifiers on registration.");
+ gettext("Loading Block Modifiers");
+ gettext("Instrument the action function of Loading Block Modifiers on registration.");
+ gettext("Chatcommands");
+ gettext("Instrument chatcommands on registration.");
+ gettext("Global callbacks");
+ gettext("Instrument global callback functions on registration.\n(anything you pass to a minetest.register_*() function)");
+ gettext("Advanced");
+ gettext("Builtin");
+ gettext("Instrument builtin.\nThis is usually only needed by core/builtin contributors");
+ gettext("Profiler");
+ gettext("Have the profiler instrument itself:\n* Instrument an empty function.\nThis estimates the overhead, that instrumentation is adding (+1 function call).\n* Instrument the sampler being used to update the statistics.");
gettext("Client and Server");
gettext("Player name");
gettext("Name of the player.\nWhen running a server, clients connecting with this name are admins.\nWhen starting from the main menu, this is overridden.");
@@ -617,4 +662,6 @@ fake_function() {
gettext("Modstore download URL");
gettext("Modstore mods list URL");
gettext("Modstore details URL");
+ gettext("Engine profiling data print interval");
+ gettext("Print the engine's profiling data in regular intervals (in seconds). 0 = disable. Useful for developers.");
}
diff --git a/src/shader.cpp b/src/shader.cpp
index e13ab8df3..c0ecf738d 100644
--- a/src/shader.cpp
+++ b/src/shader.cpp
@@ -167,29 +167,27 @@ private:
}
};
+
/*
ShaderCallback: Sets constants that can be used in shaders
*/
-class IShaderConstantSetterRegistry
-{
-public:
- virtual ~IShaderConstantSetterRegistry(){};
- virtual void onSetConstants(video::IMaterialRendererServices *services,
- bool is_highlevel, const std::string &name) = 0;
-};
-
class ShaderCallback : public video::IShaderConstantSetCallBack
{
- IShaderConstantSetterRegistry *m_scsr;
- std::string m_name;
+ std::vector<IShaderConstantSetter*> m_setters;
public:
- ShaderCallback(IShaderConstantSetterRegistry *scsr, const std::string &name):
- m_scsr(scsr),
- m_name(name)
- {}
- ~ShaderCallback() {}
+ ShaderCallback(const std::vector<IShaderConstantSetterFactory*> &factories)
+ {
+ for (u32 i = 0; i < factories.size(); ++i)
+ m_setters.push_back(factories[i]->create());
+ }
+
+ ~ShaderCallback()
+ {
+ for (u32 i = 0; i < m_setters.size(); ++i)
+ delete m_setters[i];
+ }
virtual void OnSetConstants(video::IMaterialRendererServices *services, s32 userData)
{
@@ -198,18 +196,25 @@ public:
bool is_highlevel = userData;
- m_scsr->onSetConstants(services, is_highlevel, m_name);
+ for (u32 i = 0; i < m_setters.size(); ++i)
+ m_setters[i]->onSetConstants(services, is_highlevel);
}
};
+
/*
MainShaderConstantSetter: Set basic constants required for almost everything
*/
class MainShaderConstantSetter : public IShaderConstantSetter
{
+ CachedVertexShaderSetting<float, 16> m_world_view_proj;
+ CachedVertexShaderSetting<float, 16> m_world;
+
public:
- MainShaderConstantSetter(IrrlichtDevice *device)
+ MainShaderConstantSetter() :
+ m_world_view_proj("mWorldViewProj"),
+ m_world("mWorld")
{}
~MainShaderConstantSetter() {}
@@ -219,47 +224,40 @@ public:
video::IVideoDriver *driver = services->getVideoDriver();
sanity_check(driver);
- // set inverted world matrix
- core::matrix4 invWorld = driver->getTransform(video::ETS_WORLD);
- invWorld.makeInverse();
- if(is_highlevel)
- services->setVertexShaderConstant("mInvWorld", invWorld.pointer(), 16);
- else
- services->setVertexShaderConstant(invWorld.pointer(), 0, 4);
-
- // set clip matrix
+ // Set clip matrix
core::matrix4 worldViewProj;
worldViewProj = driver->getTransform(video::ETS_PROJECTION);
worldViewProj *= driver->getTransform(video::ETS_VIEW);
worldViewProj *= driver->getTransform(video::ETS_WORLD);
- if(is_highlevel)
- services->setVertexShaderConstant("mWorldViewProj", worldViewProj.pointer(), 16);
- else
- services->setVertexShaderConstant(worldViewProj.pointer(), 4, 4);
-
- // set transposed world matrix
- core::matrix4 transWorld = driver->getTransform(video::ETS_WORLD);
- transWorld = transWorld.getTransposed();
- if(is_highlevel)
- services->setVertexShaderConstant("mTransWorld", transWorld.pointer(), 16);
+ if (is_highlevel)
+ m_world_view_proj.set(*reinterpret_cast<float(*)[16]>(worldViewProj.pointer()), services);
else
- services->setVertexShaderConstant(transWorld.pointer(), 8, 4);
+ services->setVertexShaderConstant(worldViewProj.pointer(), 0, 4);
- // set world matrix
+ // Set world matrix
core::matrix4 world = driver->getTransform(video::ETS_WORLD);
- if(is_highlevel)
- services->setVertexShaderConstant("mWorld", world.pointer(), 16);
+ if (is_highlevel)
+ m_world.set(*reinterpret_cast<float(*)[16]>(world.pointer()), services);
else
- services->setVertexShaderConstant(world.pointer(), 8, 4);
+ services->setVertexShaderConstant(world.pointer(), 4, 4);
}
};
+
+class MainShaderConstantSetterFactory : public IShaderConstantSetterFactory
+{
+public:
+ virtual IShaderConstantSetter* create()
+ { return new MainShaderConstantSetter(); }
+};
+
+
/*
ShaderSource
*/
-class ShaderSource : public IWritableShaderSource, public IShaderConstantSetterRegistry
+class ShaderSource : public IWritableShaderSource
{
public:
ShaderSource(IrrlichtDevice *device);
@@ -302,22 +300,17 @@ public:
// Shall be called from the main thread.
void rebuildShaders();
- void addGlobalConstantSetter(IShaderConstantSetter *setter)
+ void addShaderConstantSetterFactory(IShaderConstantSetterFactory *setter)
{
- m_global_setters.push_back(setter);
+ m_setter_factories.push_back(setter);
}
- void onSetConstants(video::IMaterialRendererServices *services,
- bool is_highlevel, const std::string &name);
-
private:
// The id of the thread that is allowed to use irrlicht directly
threadid_t m_main_thread;
// The irrlicht device
IrrlichtDevice *m_device;
- // The set-constants callback
- ShaderCallback *m_shader_callback;
// Cache of source shaders
// This should be only accessed from the main thread
@@ -332,9 +325,11 @@ private:
// Queued shader fetches (to be processed by the main thread)
RequestQueue<std::string, u32, u8, u8> m_get_shader_queue;
- // Global constant setters
- // TODO: Delete these in the destructor
- std::vector<IShaderConstantSetter*> m_global_setters;
+ // Global constant setter factories
+ std::vector<IShaderConstantSetterFactory *> m_setter_factories;
+
+ // Shader callbacks
+ std::vector<ShaderCallback *> m_callbacks;
};
IWritableShaderSource* createShaderSource(IrrlichtDevice *device)
@@ -347,8 +342,8 @@ IWritableShaderSource* createShaderSource(IrrlichtDevice *device)
*/
ShaderInfo generate_shader(std::string name,
u8 material_type, u8 drawtype,
- IrrlichtDevice *device,
- video::IShaderConstantSetCallBack *callback,
+ IrrlichtDevice *device, std::vector<ShaderCallback *> &callbacks,
+ const std::vector<IShaderConstantSetterFactory*> &setter_factories,
SourceShaderCache *sourcecache);
/*
@@ -364,28 +359,24 @@ ShaderSource::ShaderSource(IrrlichtDevice *device):
{
assert(m_device); // Pre-condition
- m_shader_callback = new ShaderCallback(this, "default");
-
m_main_thread = thr_get_current_thread_id();
// Add a dummy ShaderInfo as the first index, named ""
m_shaderinfo_cache.push_back(ShaderInfo());
// Add main global constant setter
- addGlobalConstantSetter(new MainShaderConstantSetter(device));
+ addShaderConstantSetterFactory(new MainShaderConstantSetterFactory());
}
ShaderSource::~ShaderSource()
{
- for (std::vector<IShaderConstantSetter*>::iterator iter = m_global_setters.begin();
- iter != m_global_setters.end(); ++iter) {
+ for (std::vector<ShaderCallback *>::iterator iter = m_callbacks.begin();
+ iter != m_callbacks.end(); ++iter) {
delete *iter;
}
- m_global_setters.clear();
-
- if (m_shader_callback) {
- m_shader_callback->drop();
- m_shader_callback = NULL;
+ for (std::vector<IShaderConstantSetterFactory *>::iterator iter = m_setter_factories.begin();
+ iter != m_setter_factories.end(); ++iter) {
+ delete *iter;
}
}
@@ -461,8 +452,8 @@ u32 ShaderSource::getShaderIdDirect(const std::string &name,
return 0;
}
- ShaderInfo info = generate_shader(name, material_type, drawtype, m_device,
- m_shader_callback, &m_sourcecache);
+ ShaderInfo info = generate_shader(name, material_type, drawtype,
+ m_device, m_callbacks, m_setter_factories, &m_sourcecache);
/*
Add shader to caches (add dummy shaders too)
@@ -527,22 +518,16 @@ void ShaderSource::rebuildShaders()
ShaderInfo *info = &m_shaderinfo_cache[i];
if(info->name != ""){
*info = generate_shader(info->name, info->material_type,
- info->drawtype, m_device, m_shader_callback, &m_sourcecache);
+ info->drawtype, m_device, m_callbacks,
+ m_setter_factories, &m_sourcecache);
}
}
}
-void ShaderSource::onSetConstants(video::IMaterialRendererServices *services,
- bool is_highlevel, const std::string &name)
-{
- for(u32 i=0; i<m_global_setters.size(); i++){
- IShaderConstantSetter *setter = m_global_setters[i];
- setter->onSetConstants(services, is_highlevel);
- }
-}
ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
- IrrlichtDevice *device, video::IShaderConstantSetCallBack *callback,
+ IrrlichtDevice *device, std::vector<ShaderCallback *> &callbacks,
+ const std::vector<IShaderConstantSetterFactory*> &setter_factories,
SourceShaderCache *sourcecache)
{
ShaderInfo shaderinfo;
@@ -572,7 +557,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
}
bool enable_shaders = g_settings->getBool("enable_shaders");
- if(!enable_shaders)
+ if (!enable_shaders)
return shaderinfo;
video::IVideoDriver* driver = device->getVideoDriver();
@@ -766,6 +751,10 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
if (g_settings->getBool("tone_mapping"))
shaders_header += "#define ENABLE_TONE_MAPPING\n";
+ shaders_header += "#define FOG_START ";
+ shaders_header += ftos(rangelim(g_settings->getFloat("fog_start"), 0.0f, 0.99f));
+ shaders_header += "\n";
+
// Call addHighLevelShaderMaterial() or addShaderMaterial()
const c8* vertex_program_ptr = 0;
const c8* pixel_program_ptr = 0;
@@ -782,6 +771,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
geometry_program = shaders_header + geometry_program;
geometry_program_ptr = geometry_program.c_str();
}
+ ShaderCallback *cb = new ShaderCallback(setter_factories);
s32 shadermat = -1;
if(is_highlevel){
infostream<<"Compiling high level shaders for "<<name<<std::endl;
@@ -798,7 +788,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
scene::EPT_TRIANGLES, // Geometry shader input
scene::EPT_TRIANGLE_STRIP, // Geometry shader output
0, // Support maximum number of vertices
- callback, // Set-constant callback
+ cb, // Set-constant callback
shaderinfo.base_material, // Base material
1 // Userdata passed to callback
);
@@ -810,6 +800,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
dumpShaderProgram(warningstream, "Vertex", vertex_program);
dumpShaderProgram(warningstream, "Pixel", pixel_program);
dumpShaderProgram(warningstream, "Geometry", geometry_program);
+ delete cb;
return shaderinfo;
}
}
@@ -818,7 +809,7 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
shadermat = gpu->addShaderMaterial(
vertex_program_ptr, // Vertex shader program
pixel_program_ptr, // Pixel shader program
- callback, // Set-constant callback
+ cb, // Set-constant callback
shaderinfo.base_material, // Base material
0 // Userdata passed to callback
);
@@ -830,9 +821,11 @@ ShaderInfo generate_shader(std::string name, u8 material_type, u8 drawtype,
<<std::endl;
dumpShaderProgram(warningstream, "Vertex", vertex_program);
dumpShaderProgram(warningstream,"Pixel", pixel_program);
+ delete cb;
return shaderinfo;
}
}
+ callbacks.push_back(cb);
// HACK, TODO: investigate this better
// Grab the material renderer once more so minetest doesn't crash on exit
diff --git a/src/shader.h b/src/shader.h
index b8aa88bce..766871f02 100644
--- a/src/shader.h
+++ b/src/shader.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef SHADER_HEADER
#define SHADER_HEADER
+#include <IMaterialRendererServices.h>
#include "irrlichttypes_extrabloated.h"
#include "threads.h"
#include <string>
@@ -43,8 +44,7 @@ class IGameDef;
std::string getShaderPath(const std::string &name_of_shader,
const std::string &filename);
-struct ShaderInfo
-{
+struct ShaderInfo {
std::string name;
video::E_MATERIAL_TYPE base_material;
video::E_MATERIAL_TYPE material;
@@ -66,20 +66,66 @@ namespace irr { namespace video {
class IMaterialRendererServices;
} }
-class IShaderConstantSetter
-{
+
+class IShaderConstantSetter {
public:
virtual ~IShaderConstantSetter(){};
virtual void onSetConstants(video::IMaterialRendererServices *services,
bool is_highlevel) = 0;
};
+
+class IShaderConstantSetterFactory {
+public:
+ virtual ~IShaderConstantSetterFactory() {};
+ virtual IShaderConstantSetter* create() = 0;
+};
+
+
+template <typename T, std::size_t count=1>
+class CachedShaderSetting {
+ const char *m_name;
+ T m_sent[count];
+ bool has_been_set;
+ bool is_pixel;
+protected:
+ CachedShaderSetting(const char *name, bool is_pixel) :
+ m_name(name), has_been_set(false), is_pixel(is_pixel)
+ {}
+public:
+ void set(const T value[count], video::IMaterialRendererServices *services)
+ {
+ if (has_been_set && std::equal(m_sent, m_sent + count, value))
+ return;
+ if (is_pixel)
+ services->setPixelShaderConstant(m_name, value, count);
+ else
+ services->setVertexShaderConstant(m_name, value, count);
+ std::copy(value, value + count, m_sent);
+ has_been_set = true;
+ }
+};
+
+template <typename T, std::size_t count = 1>
+class CachedPixelShaderSetting : public CachedShaderSetting<T, count> {
+public:
+ CachedPixelShaderSetting(const char *name) :
+ CachedShaderSetting<T, count>(name, true){}
+};
+
+template <typename T, std::size_t count = 1>
+class CachedVertexShaderSetting : public CachedShaderSetting<T, count> {
+public:
+ CachedVertexShaderSetting(const char *name) :
+ CachedShaderSetting<T, count>(name, false){}
+};
+
+
/*
ShaderSource creates and caches shaders.
*/
-class IShaderSource
-{
+class IShaderSource {
public:
IShaderSource(){}
virtual ~IShaderSource(){}
@@ -90,8 +136,7 @@ public:
const u8 material_type, const u8 drawtype){return 0;}
};
-class IWritableShaderSource : public IShaderSource
-{
+class IWritableShaderSource : public IShaderSource {
public:
IWritableShaderSource(){}
virtual ~IWritableShaderSource(){}
@@ -105,7 +150,7 @@ public:
virtual void insertSourceShader(const std::string &name_of_shader,
const std::string &filename, const std::string &program)=0;
virtual void rebuildShaders()=0;
- virtual void addGlobalConstantSetter(IShaderConstantSetter *setter)=0;
+ virtual void addShaderConstantSetterFactory(IShaderConstantSetterFactory *setter) = 0;
};
IWritableShaderSource* createShaderSource(IrrlichtDevice *device);
diff --git a/src/sky.cpp b/src/sky.cpp
index 682ff05e3..211a2dcdc 100644
--- a/src/sky.cpp
+++ b/src/sky.cpp
@@ -4,37 +4,37 @@
#include "ICameraSceneNode.h"
#include "S3DVertex.h"
#include "client/tile.h"
-#include "noise.h" // easeCurve
+#include "noise.h" // easeCurve
#include "profiler.h"
#include "util/numeric.h"
#include <cmath>
#include "settings.h"
-#include "camera.h" // CameraModes
+#include "camera.h" // CameraModes
+
-//! constructor
Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
ITextureSource *tsrc):
scene::ISceneNode(parent, mgr, id),
m_visible(true),
- m_fallback_bg_color(255,255,255,255),
+ m_fallback_bg_color(255, 255, 255, 255),
m_first_update(true),
m_brightness(0.5),
m_cloud_brightness(0.5),
- m_bgcolor_bright_f(1,1,1,1),
- m_skycolor_bright_f(1,1,1,1),
- m_cloudcolor_bright_f(1,1,1,1)
+ m_bgcolor_bright_f(1, 1, 1, 1),
+ m_skycolor_bright_f(1, 1, 1, 1),
+ m_cloudcolor_bright_f(1, 1, 1, 1)
{
setAutomaticCulling(scene::EAC_OFF);
- m_box.MaxEdge.set(0,0,0);
- m_box.MinEdge.set(0,0,0);
+ m_box.MaxEdge.set(0, 0, 0);
+ m_box.MinEdge.set(0, 0, 0);
- // create material
+ // Create material
video::SMaterial mat;
mat.Lighting = false;
mat.ZBuffer = video::ECFN_NEVER;
mat.ZWriteEnable = false;
- mat.AntiAliasing=0;
+ mat.AntiAliasing = 0;
mat.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
mat.TextureLayer[0].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
mat.BackfaceCulling = false;
@@ -59,14 +59,15 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
m_moon_tonemap = tsrc->isKnownSourceImage("moon_tonemap.png") ?
tsrc->getTexture("moon_tonemap.png") : NULL;
- if (m_sun_texture){
+ if (m_sun_texture) {
m_materials[3] = mat;
m_materials[3].setTexture(0, m_sun_texture);
m_materials[3].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
if (m_sun_tonemap)
m_materials[3].Lighting = true;
}
- if (m_moon_texture){
+
+ if (m_moon_texture) {
m_materials[4] = mat;
m_materials[4].setTexture(0, m_moon_texture);
m_materials[4].MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -74,11 +75,11 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
m_materials[4].Lighting = true;
}
- for(u32 i=0; i<SKY_STAR_COUNT; i++){
+ for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
m_stars[i] = v3f(
- myrand_range(-10000,10000),
- myrand_range(-10000,10000),
- myrand_range(-10000,10000)
+ myrand_range(-10000, 10000),
+ myrand_range(-10000, 10000),
+ myrand_range(-10000, 10000)
);
m_stars[i].normalize();
}
@@ -86,6 +87,7 @@ Sky::Sky(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id,
m_directional_colored_fog = g_settings->getBool("directional_colored_fog");
}
+
void Sky::OnRegisterSceneNode()
{
if (IsVisible)
@@ -94,10 +96,10 @@ void Sky::OnRegisterSceneNode()
scene::ISceneNode::OnRegisterSceneNode();
}
-//! renders the node.
+
void Sky::render()
{
- if(!m_visible)
+ if (!m_visible)
return;
video::IVideoDriver* driver = SceneManager->getVideoDriver();
@@ -108,7 +110,7 @@ void Sky::render()
ScopeProfiler sp(g_profiler, "Sky::render()", SPT_AVG);
- // draw perspective skybox
+ // Draw perspective skybox
core::matrix4 translate(AbsoluteTransformation);
translate.setTranslation(camera->getAbsolutePosition());
@@ -120,16 +122,15 @@ void Sky::render()
driver->setTransform(video::ETS_WORLD, translate * scale);
- if(m_sunlight_seen)
- {
+ if (m_sunlight_seen) {
float sunsize = 0.07;
video::SColorf suncolor_f(1, 1, 0, 1);
suncolor_f.r = 1;
- suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.7+m_time_brightness*(0.5)));
- suncolor_f.b = MYMAX(0.0, m_brightness*0.95);
+ suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.7 + m_time_brightness * 0.5));
+ suncolor_f.b = MYMAX(0.0, m_brightness * 0.95);
video::SColorf suncolor2_f(1, 1, 1, 1);
suncolor_f.r = 1;
- suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.85+m_time_brightness*(0.5)));
+ suncolor_f.g = MYMAX(0.3, MYMIN(1.0, 0.85 + m_time_brightness * 0.5));
suncolor_f.b = MYMAX(0.0, m_brightness);
float moonsize = 0.04;
@@ -139,12 +140,12 @@ void Sky::render()
float nightlength = 0.415;
float wn = nightlength / 2;
float wicked_time_of_day = 0;
- if(m_time_of_day > wn && m_time_of_day < 1.0 - wn)
- wicked_time_of_day = (m_time_of_day - wn)/(1.0-wn*2)*0.5 + 0.25;
- else if(m_time_of_day < 0.5)
+ if (m_time_of_day > wn && m_time_of_day < 1.0 - wn)
+ wicked_time_of_day = (m_time_of_day - wn) / (1.0 - wn * 2) * 0.5 + 0.25;
+ else if (m_time_of_day < 0.5)
wicked_time_of_day = m_time_of_day / wn * 0.25;
else
- wicked_time_of_day = 1.0 - ((1.0-m_time_of_day) / wn * 0.25);
+ wicked_time_of_day = 1.0 - ((1.0 - m_time_of_day) / wn * 0.25);
/*std::cerr<<"time_of_day="<<m_time_of_day<<" -> "
<<"wicked_time_of_day="<<wicked_time_of_day<<std::endl;*/
@@ -154,98 +155,108 @@ void Sky::render()
video::SColor mooncolor2 = mooncolor2_f.toSColor();
// Calculate offset normalized to the X dimension of a 512x1 px tonemap
- float offset=(1.0-fabs(sin((m_time_of_day - 0.5)*irr::core::PI)))*511;
+ float offset = (1.0 - fabs(sin((m_time_of_day - 0.5) * irr::core::PI))) * 511;
- if (m_sun_tonemap){
+ if (m_sun_tonemap) {
u8 * texels = (u8 *)m_sun_tonemap->lock();
video::SColor* texel = (video::SColor *)(texels + (u32)offset * 4);
- video::SColor texel_color (255,texel->getRed(),texel->getGreen(), texel->getBlue());
+ video::SColor texel_color (255, texel->getRed(),
+ texel->getGreen(), texel->getBlue());
m_sun_tonemap->unlock();
m_materials[3].EmissiveColor = texel_color;
}
- if (m_moon_tonemap){
+
+ if (m_moon_tonemap) {
u8 * texels = (u8 *)m_moon_tonemap->lock();
video::SColor* texel = (video::SColor *)(texels + (u32)offset * 4);
- video::SColor texel_color (255,texel->getRed(),texel->getGreen(), texel->getBlue());
+ video::SColor texel_color (255, texel->getRed(),
+ texel->getGreen(), texel->getBlue());
m_moon_tonemap->unlock();
m_materials[4].EmissiveColor = texel_color;
}
const f32 t = 1.0f;
const f32 o = 0.0f;
- static const u16 indices[4] = {0,1,2,3};
+ static const u16 indices[4] = {0, 1, 2, 3};
video::S3DVertex vertices[4];
driver->setMaterial(m_materials[1]);
- //video::SColor cloudyfogcolor(255,255,255,255);
video::SColor cloudyfogcolor = m_bgcolor;
- //video::SColor cloudyfogcolor = m_bgcolor.getInterpolated(m_skycolor, 0.5);
- // Draw far cloudy fog thing
- for(u32 j=0; j<4; j++)
- {
+ // Draw far cloudy fog thing blended with skycolor
+ for (u32 j = 0; j < 4; j++) {
video::SColor c = cloudyfogcolor.getInterpolated(m_skycolor, 0.45);
- vertices[0] = video::S3DVertex(-1, 0.08,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( 1, 0.08,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( 1, 0.12,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-1, 0.12,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
- if(j==0)
+ vertices[0] = video::S3DVertex(-1, 0.08, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( 1, 0.08, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( 1, 0.12, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-1, 0.12, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
+ if (j == 0)
// Don't switch
{}
- else if(j==1)
+ else if (j == 1)
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
- else if(j==2)
+ else if (j == 2)
// Switch from -Z (south) to -X (west)
vertices[i].Pos.rotateXZBy(-90);
else
- // Switch from -Z (south) to -Z (north)
+ // Switch from -Z (south) to +Z (north)
vertices[i].Pos.rotateXZBy(-180);
}
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
}
- for(u32 j=0; j<4; j++)
- {
+
+ // Draw far cloudy fog thing
+ for (u32 j = 0; j < 4; j++) {
video::SColor c = cloudyfogcolor;
- vertices[0] = video::S3DVertex(-1,-1.0,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( 1,-1.0,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( 1, 0.08,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-1, 0.08,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
- if(j==0)
+ vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( 1, 0.08, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-1, 0.08, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
+ if (j == 0)
// Don't switch
{}
- else if(j==1)
+ else if (j == 1)
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
- else if(j==2)
+ else if (j == 2)
// Switch from -Z (south) to -X (west)
vertices[i].Pos.rotateXZBy(-90);
else
- // Switch from -Z (south) to -Z (north)
+ // Switch from -Z (south) to +Z (north)
vertices[i].Pos.rotateXZBy(-180);
}
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
}
+ // Draw bottom far cloudy fog thing
+ video::SColor c = cloudyfogcolor;
+ vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 1, 0, c, t, t);
+ vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 1, 0, c, o, t);
+ vertices[2] = video::S3DVertex( 1, -1.0, 1, 0, 1, 0, c, o, o);
+ vertices[3] = video::S3DVertex(-1, -1.0, 1, 0, 1, 0, c, t, o);
+ driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
+
driver->setMaterial(m_materials[2]);
+ // Draw sunrise/sunset horizon glow texture (textures/base/pack/sunrisebg.png)
{
float mid1 = 0.25;
- float mid = (wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1));
+ float mid = wicked_time_of_day < 0.5 ? mid1 : (1.0 - mid1);
float a_ = 1.0 - fabs(wicked_time_of_day - mid) * 35.0;
float a = easeCurve(MYMAX(0, MYMIN(1, a_)));
//std::cerr<<"a_="<<a_<<" a="<<a<<std::endl;
- video::SColor c(255,255,255,255);
- float y = -(1.0 - a) * 0.2;
- vertices[0] = video::S3DVertex(-1,-0.05+y,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( 1,-0.05+y,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( 1, 0.2+y,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-1, 0.2+y,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
- if(wicked_time_of_day < 0.5)
+ video::SColor c(255, 255, 255, 255);
+ float y = -(1.0 - a) * 0.22;
+ vertices[0] = video::S3DVertex(-1, -0.05 + y, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( 1, -0.05 + y, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( 1, 0.2 + y, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-1, 0.2 + y, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
+ if (wicked_time_of_day < 0.5)
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
else
@@ -256,17 +267,17 @@ void Sky::render()
}
// Draw sun
- if(wicked_time_of_day > 0.15 && wicked_time_of_day < 0.85){
- if (!m_sun_texture){
+ if (wicked_time_of_day > 0.15 && wicked_time_of_day < 0.85) {
+ if (!m_sun_texture) {
driver->setMaterial(m_materials[1]);
float d = sunsize * 1.7;
video::SColor c = suncolor;
- c.setAlpha(0.05*255);
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
+ c.setAlpha(0.05 * 255);
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -275,12 +286,12 @@ void Sky::render()
d = sunsize * 1.2;
c = suncolor;
- c.setAlpha(0.15*255);
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
+ c.setAlpha(0.15 * 255);
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -288,11 +299,11 @@ void Sky::render()
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
d = sunsize;
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, suncolor, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, suncolor, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, suncolor, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, suncolor, t, o);
- for(u32 i=0; i<4; i++){
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, suncolor, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, suncolor, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, suncolor, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, suncolor, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -300,11 +311,11 @@ void Sky::render()
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
d = sunsize * 0.7;
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, suncolor2, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, suncolor2, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, suncolor2, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, suncolor2, t, o);
- for(u32 i=0; i<4; i++){
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, suncolor2, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, suncolor2, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, suncolor2, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, suncolor2, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -315,14 +326,14 @@ void Sky::render()
float d = sunsize * 1.7;
video::SColor c;
if (m_sun_tonemap)
- c = video::SColor (0,0,0,0);
+ c = video::SColor (0, 0, 0, 0);
else
- c = video::SColor (255,255,255,255);
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
+ c = video::SColor (255, 255, 255, 255);
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, c, t, o);
+ for(u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -332,18 +343,17 @@ void Sky::render()
}
// Draw moon
- if(wicked_time_of_day < 0.3 || wicked_time_of_day > 0.7)
- {
- if (!m_moon_texture){
+ if (wicked_time_of_day < 0.3 || wicked_time_of_day > 0.7) {
+ if (!m_moon_texture) {
driver->setMaterial(m_materials[1]);
float d = moonsize * 1.9;
video::SColor c = mooncolor;
- c.setAlpha(0.05*255);
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
+ c.setAlpha(0.05 * 255);
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to -X (west)
vertices[i].Pos.rotateXZBy(-90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -352,12 +362,12 @@ void Sky::render()
d = moonsize * 1.3;
c = mooncolor;
- c.setAlpha(0.15*255);
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
+ c.setAlpha(0.15 * 255);
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to -X (west)
vertices[i].Pos.rotateXZBy(-90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -365,11 +375,11 @@ void Sky::render()
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
d = moonsize;
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, mooncolor, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, mooncolor, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, mooncolor, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, mooncolor, t, o);
- for(u32 i=0; i<4; i++){
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, mooncolor, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, mooncolor, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, mooncolor, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, mooncolor, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to -X (west)
vertices[i].Pos.rotateXZBy(-90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -377,11 +387,11 @@ void Sky::render()
driver->drawIndexedTriangleFan(&vertices[0], 4, indices, 2);
float d2 = moonsize * 0.6;
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, mooncolor2, t, t);
- vertices[1] = video::S3DVertex( d2,-d,-1, 0,0,1, mooncolor2, o, t);
- vertices[2] = video::S3DVertex( d2, d2,-1, 0,0,1, mooncolor2, o, o);
- vertices[3] = video::S3DVertex(-d, d2,-1, 0,0,1, mooncolor2, t, o);
- for(u32 i=0; i<4; i++){
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, mooncolor2, t, t);
+ vertices[1] = video::S3DVertex( d2,-d, -1, 0, 0, 1, mooncolor2, o, t);
+ vertices[2] = video::S3DVertex( d2, d2, -1, 0, 0, 1, mooncolor2, o, o);
+ vertices[3] = video::S3DVertex(-d, d2, -1, 0, 0, 1, mooncolor2, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to -X (west)
vertices[i].Pos.rotateXZBy(-90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -392,14 +402,14 @@ void Sky::render()
float d = moonsize * 1.9;
video::SColor c;
if (m_moon_tonemap)
- c = video::SColor (0,0,0,0);
+ c = video::SColor (0, 0, 0, 0);
else
- c = video::SColor (255,255,255,255);
- vertices[0] = video::S3DVertex(-d,-d,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( d,-d,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( d, d,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-d, d,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
+ c = video::SColor (255, 255, 255, 255);
+ vertices[0] = video::S3DVertex(-d, -d, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( d, -d, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( d, d, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-d, d, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
// Switch from -Z (south) to -X (west)
vertices[i].Pos.rotateXZBy(-90);
vertices[i].Pos.rotateXYBy(wicked_time_of_day * 360 - 90);
@@ -408,64 +418,63 @@ void Sky::render()
}
}
- // Stars
+ // Draw stars
driver->setMaterial(m_materials[1]);
- do{
+ do {
float starbrightness = MYMAX(0, MYMIN(1,
- (0.285 - fabs(wicked_time_of_day < 0.5 ?
- wicked_time_of_day : (1.0 - wicked_time_of_day))) * 10));
+ (0.285 - fabs(wicked_time_of_day < 0.5 ?
+ wicked_time_of_day : (1.0 - wicked_time_of_day))) * 10));
float f = starbrightness;
float d = 0.007;
- video::SColor starcolor(255, f*90,f*90,f*90);
- if(starcolor.getBlue() < m_skycolor.getBlue())
+ video::SColor starcolor(255, f * 90, f * 90, f * 90);
+ if (starcolor.getBlue() < m_skycolor.getBlue())
break;
- u16 indices[SKY_STAR_COUNT*4];
- video::S3DVertex vertices[SKY_STAR_COUNT*4];
- for(u32 i=0; i<SKY_STAR_COUNT; i++){
- indices[i*4+0] = i*4+0;
- indices[i*4+1] = i*4+1;
- indices[i*4+2] = i*4+2;
- indices[i*4+3] = i*4+3;
+ u16 indices[SKY_STAR_COUNT * 4];
+ video::S3DVertex vertices[SKY_STAR_COUNT * 4];
+ for (u32 i = 0; i < SKY_STAR_COUNT; i++) {
+ indices[i * 4 + 0] = i * 4 + 0;
+ indices[i * 4 + 1] = i * 4 + 1;
+ indices[i * 4 + 2] = i * 4 + 2;
+ indices[i * 4 + 3] = i * 4 + 3;
v3f p = m_stars[i];
core::CMatrix4<f32> a;
- a.buildRotateFromTo(v3f(0,1,0), v3f(d,1+d/2,0));
+ a.buildRotateFromTo(v3f(0, 1, 0), v3f(d, 1 + d / 2, 0));
v3f p1 = p;
a.rotateVect(p1);
- a.buildRotateFromTo(v3f(0,1,0), v3f(d,1,d));
+ a.buildRotateFromTo(v3f(0, 1, 0), v3f(d, 1, d));
v3f p2 = p;
a.rotateVect(p2);
- a.buildRotateFromTo(v3f(0,1,0), v3f(0,1-d/2,d));
+ a.buildRotateFromTo(v3f(0, 1, 0), v3f(0, 1 - d / 2, d));
v3f p3 = p;
a.rotateVect(p3);
p.rotateXYBy(wicked_time_of_day * 360 - 90);
p1.rotateXYBy(wicked_time_of_day * 360 - 90);
p2.rotateXYBy(wicked_time_of_day * 360 - 90);
p3.rotateXYBy(wicked_time_of_day * 360 - 90);
- vertices[i*4+0].Pos = p;
- vertices[i*4+0].Color = starcolor;
- vertices[i*4+1].Pos = p1;
- vertices[i*4+1].Color = starcolor;
- vertices[i*4+2].Pos = p2;
- vertices[i*4+2].Color = starcolor;
- vertices[i*4+3].Pos = p3;
- vertices[i*4+3].Color = starcolor;
+ vertices[i * 4 + 0].Pos = p;
+ vertices[i * 4 + 0].Color = starcolor;
+ vertices[i * 4 + 1].Pos = p1;
+ vertices[i * 4 + 1].Color = starcolor;
+ vertices[i * 4 + 2].Pos = p2;
+ vertices[i * 4 + 2].Color = starcolor;
+ vertices[i * 4 + 3].Pos = p3;
+ vertices[i * 4 + 3].Color = starcolor;
}
- driver->drawVertexPrimitiveList(vertices, SKY_STAR_COUNT*4,
- indices, SKY_STAR_COUNT, video::EVT_STANDARD,
- scene::EPT_QUADS, video::EIT_16BIT);
- }while(0);
+ driver->drawVertexPrimitiveList(vertices, SKY_STAR_COUNT * 4,
+ indices, SKY_STAR_COUNT, video::EVT_STANDARD,
+ scene::EPT_QUADS, video::EIT_16BIT);
+ } while(0);
- for(u32 j=0; j<2; j++)
- {
- //video::SColor c = m_skycolor;
+ // Draw far cloudy fog thing below east and west horizons
+ for (u32 j = 0; j < 2; j++) {
video::SColor c = cloudyfogcolor;
- vertices[0] = video::S3DVertex(-1,-1.0,-1, 0,0,1, c, t, t);
- vertices[1] = video::S3DVertex( 1,-1.0,-1, 0,0,1, c, o, t);
- vertices[2] = video::S3DVertex( 1,-0.02,-1, 0,0,1, c, o, o);
- vertices[3] = video::S3DVertex(-1,-0.02,-1, 0,0,1, c, t, o);
- for(u32 i=0; i<4; i++){
- //if(wicked_time_of_day < 0.5)
- if(j==0)
+ vertices[0] = video::S3DVertex(-1, -1.0, -1, 0, 0, 1, c, t, t);
+ vertices[1] = video::S3DVertex( 1, -1.0, -1, 0, 0, 1, c, o, t);
+ vertices[2] = video::S3DVertex( 1, -0.02, -1, 0, 0, 1, c, o, o);
+ vertices[3] = video::S3DVertex(-1, -0.02, -1, 0, 0, 1, c, t, o);
+ for (u32 i = 0; i < 4; i++) {
+ //if (wicked_time_of_day < 0.5)
+ if (j == 0)
// Switch from -Z (south) to +X (east)
vertices[i].Pos.rotateXZBy(90);
else
@@ -477,20 +486,21 @@ void Sky::render()
}
}
+
void Sky::update(float time_of_day, float time_brightness,
float direct_brightness, bool sunlight_seen,
CameraMode cam_mode, float yaw, float pitch)
{
// Stabilize initial brightness and color values by flooding updates
- if(m_first_update){
+ if (m_first_update) {
/*dstream<<"First update with time_of_day="<<time_of_day
<<" time_brightness="<<time_brightness
<<" direct_brightness="<<direct_brightness
<<" sunlight_seen="<<sunlight_seen<<std::endl;*/
m_first_update = false;
- for(u32 i=0; i<100; i++){
+ for (u32 i = 0; i < 100; i++) {
update(time_of_day, time_brightness, direct_brightness,
- sunlight_seen, cam_mode, yaw, pitch);
+ sunlight_seen, cam_mode, yaw, pitch);
}
return;
}
@@ -501,39 +511,42 @@ void Sky::update(float time_of_day, float time_brightness,
bool is_dawn = (time_brightness >= 0.20 && time_brightness < 0.35);
- //video::SColorf bgcolor_bright_normal_f(170./255,200./255,230./255, 1.0);
- video::SColorf bgcolor_bright_normal_f(155./255,193./255,240./255, 1.0);
- video::SColorf bgcolor_bright_indoor_f(100./255,100./255,100./255, 1.0);
- //video::SColorf bgcolor_bright_dawn_f(0.666,200./255*0.7,230./255*0.5,1.0);
- //video::SColorf bgcolor_bright_dawn_f(0.666,0.549,0.220,1.0);
- //video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.0, 1.0);
- //video::SColorf bgcolor_bright_dawn_f(0.666*1.2,0.549*1.0,0.220*1.2,1.0);
- video::SColorf bgcolor_bright_dawn_f
- (155./255*1.2,193./255,240./255, 1.0);
-
- video::SColorf skycolor_bright_normal_f =
- video::SColor(255, 140, 186, 250);
- video::SColorf skycolor_bright_dawn_f =
- video::SColor(255, 180, 186, 250);
+ /*
+ Development colours
+
+ video::SColorf bgcolor_bright_normal_f(170. / 255, 200. / 255, 230. / 255, 1.0);
+ video::SColorf bgcolor_bright_dawn_f(0.666, 200. / 255 * 0.7, 230. / 255 * 0.5, 1.0);
+ video::SColorf bgcolor_bright_dawn_f(0.666, 0.549, 0.220, 1.0);
+ video::SColorf bgcolor_bright_dawn_f(0.666 * 1.2, 0.549 * 1.0, 0.220 * 1.0, 1.0);
+ video::SColorf bgcolor_bright_dawn_f(0.666 * 1.2, 0.549 * 1.0, 0.220 * 1.2, 1.0);
+
+ video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4);
+ video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44);
+ video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5);
+ */
+
+ video::SColorf bgcolor_bright_normal_f = video::SColor(255, 155, 193, 240);
+ video::SColorf bgcolor_bright_indoor_f = video::SColor(255, 100, 100, 100);
+ video::SColorf bgcolor_bright_dawn_f = video::SColor(255, 186, 193, 240);
+ video::SColorf bgcolor_bright_night_f = video::SColor(255, 64, 144, 255);
+
+ video::SColorf skycolor_bright_normal_f = video::SColor(255, 140, 186, 250);
+ video::SColorf skycolor_bright_dawn_f = video::SColor(255, 180, 186, 250);
+ video::SColorf skycolor_bright_night_f = video::SColor(255, 0, 107, 255);
- video::SColorf cloudcolor_bright_normal_f =
- video::SColor(255, 240,240,255);
- //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.591, 0.4);
- //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.65, 0.44);
- //video::SColorf cloudcolor_bright_dawn_f(1.0, 0.7, 0.5);
- video::SColorf cloudcolor_bright_dawn_f(1.0, 0.875, 0.75);
+ video::SColorf cloudcolor_bright_normal_f = video::SColor(255, 240, 240, 255);
+ video::SColorf cloudcolor_bright_dawn_f = video::SColor(255, 255, 223, 191);
float cloud_color_change_fraction = 0.95;
- if(sunlight_seen){
- if(fabs(time_brightness - m_brightness) < 0.2){
+ if (sunlight_seen) {
+ if (fabs(time_brightness - m_brightness) < 0.2) {
m_brightness = m_brightness * 0.95 + time_brightness * 0.05;
} else {
m_brightness = m_brightness * 0.80 + time_brightness * 0.20;
cloud_color_change_fraction = 0.0;
}
- }
- else{
- if(direct_brightness < m_brightness)
+ } else {
+ if (direct_brightness < m_brightness)
m_brightness = m_brightness * 0.95 + direct_brightness * 0.05;
else
m_brightness = m_brightness * 0.98 + direct_brightness * 0.02;
@@ -541,29 +554,37 @@ void Sky::update(float time_of_day, float time_brightness,
m_clouds_visible = true;
float color_change_fraction = 0.98;
- if(sunlight_seen){
- if(is_dawn){
+ if (sunlight_seen) {
+ if (is_dawn) { // Dawn
m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
- bgcolor_bright_dawn_f, color_change_fraction);
+ bgcolor_bright_dawn_f, color_change_fraction);
m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
- skycolor_bright_dawn_f, color_change_fraction);
+ skycolor_bright_dawn_f, color_change_fraction);
m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated(
- cloudcolor_bright_dawn_f, color_change_fraction);
+ cloudcolor_bright_dawn_f, color_change_fraction);
} else {
- m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
+ if (time_brightness < 0.07) { // Night
+ m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
+ bgcolor_bright_night_f, color_change_fraction);
+ m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
+ skycolor_bright_night_f, color_change_fraction);
+ } else { // Day
+ m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
bgcolor_bright_normal_f, color_change_fraction);
- m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
+ m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
skycolor_bright_normal_f, color_change_fraction);
+ }
+
m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated(
- cloudcolor_bright_normal_f, color_change_fraction);
+ cloudcolor_bright_normal_f, color_change_fraction);
}
} else {
m_bgcolor_bright_f = m_bgcolor_bright_f.getInterpolated(
- bgcolor_bright_indoor_f, color_change_fraction);
+ bgcolor_bright_indoor_f, color_change_fraction);
m_skycolor_bright_f = m_skycolor_bright_f.getInterpolated(
- bgcolor_bright_indoor_f, color_change_fraction);
+ bgcolor_bright_indoor_f, color_change_fraction);
m_cloudcolor_bright_f = m_cloudcolor_bright_f.getInterpolated(
- cloudcolor_bright_normal_f, color_change_fraction);
+ cloudcolor_bright_normal_f, color_change_fraction);
m_clouds_visible = false;
}
@@ -572,63 +593,71 @@ void Sky::update(float time_of_day, float time_brightness,
255,
bgcolor_bright.getRed() * m_brightness,
bgcolor_bright.getGreen() * m_brightness,
- bgcolor_bright.getBlue() * m_brightness);
+ bgcolor_bright.getBlue() * m_brightness
+ );
video::SColor skycolor_bright = m_skycolor_bright_f.toSColor();
m_skycolor = video::SColor(
255,
skycolor_bright.getRed() * m_brightness,
skycolor_bright.getGreen() * m_brightness,
- skycolor_bright.getBlue() * m_brightness);
+ skycolor_bright.getBlue() * m_brightness
+ );
// Horizon coloring based on sun and moon direction during sunset and sunrise
video::SColor pointcolor = video::SColor(255, 255, 255, m_bgcolor.getAlpha());
if (m_directional_colored_fog) {
- if (m_horizon_blend() != 0)
- {
- // calculate hemisphere value from yaw, (inverted in third person front view)
+ if (m_horizon_blend() != 0) {
+ // Calculate hemisphere value from yaw, (inverted in third person front view)
s8 dir_factor = 1;
if (cam_mode > CAMERA_MODE_THIRD)
dir_factor = -1;
- f32 pointcolor_blend = wrapDegrees_0_360( yaw*dir_factor + 90);
+ f32 pointcolor_blend = wrapDegrees_0_360(yaw * dir_factor + 90);
if (pointcolor_blend > 180)
pointcolor_blend = 360 - pointcolor_blend;
pointcolor_blend /= 180;
- // bound view angle to determine where transition starts and ends
- pointcolor_blend = rangelim(1 - pointcolor_blend * 1.375, 0, 1 / 1.375) * 1.375;
- // combine the colors when looking up or down, otherwise turning looks weird
- pointcolor_blend += (0.5 - pointcolor_blend) * (1 - MYMIN((90 - std::abs(pitch)) / 90 * 1.5, 1));
- // invert direction to match where the sun and moon are rising
+ // Bound view angle to determine where transition starts and ends
+ pointcolor_blend = rangelim(1 - pointcolor_blend * 1.375, 0, 1 / 1.375) *
+ 1.375;
+ // Combine the colors when looking up or down, otherwise turning looks weird
+ pointcolor_blend += (0.5 - pointcolor_blend) *
+ (1 - MYMIN((90 - std::fabs(pitch)) / 90 * 1.5, 1));
+ // Invert direction to match where the sun and moon are rising
if (m_time_of_day > 0.5)
pointcolor_blend = 1 - pointcolor_blend;
- // horizon colors of sun and moon
+ // Horizon colors of sun and moon
f32 pointcolor_light = rangelim(m_time_brightness * 3, 0.2, 1);
video::SColorf pointcolor_sun_f(1, 1, 1, 1);
- if (m_sun_tonemap)
- {
- pointcolor_sun_f.r = pointcolor_light * (float)m_materials[3].EmissiveColor.getRed() / 255;
- pointcolor_sun_f.b = pointcolor_light * (float)m_materials[3].EmissiveColor.getBlue() / 255;
- pointcolor_sun_f.g = pointcolor_light * (float)m_materials[3].EmissiveColor.getGreen() / 255;
- }
- else
- {
+ if (m_sun_tonemap) {
+ pointcolor_sun_f.r = pointcolor_light *
+ (float)m_materials[3].EmissiveColor.getRed() / 255;
+ pointcolor_sun_f.b = pointcolor_light *
+ (float)m_materials[3].EmissiveColor.getBlue() / 255;
+ pointcolor_sun_f.g = pointcolor_light *
+ (float)m_materials[3].EmissiveColor.getGreen() / 255;
+ } else {
pointcolor_sun_f.r = pointcolor_light * 1;
- pointcolor_sun_f.b = pointcolor_light * (0.25 + (rangelim(m_time_brightness, 0.25, 0.75) - 0.25) * 2 * 0.75);
- pointcolor_sun_f.g = pointcolor_light * (pointcolor_sun_f.b * 0.375 + (rangelim(m_time_brightness, 0.05, 0.15) - 0.05) * 10 * 0.625);
+ pointcolor_sun_f.b = pointcolor_light *
+ (0.25 + (rangelim(m_time_brightness, 0.25, 0.75) - 0.25) * 2 * 0.75);
+ pointcolor_sun_f.g = pointcolor_light * (pointcolor_sun_f.b * 0.375 +
+ (rangelim(m_time_brightness, 0.05, 0.15) - 0.05) * 10 * 0.625);
}
- video::SColorf pointcolor_moon_f(0.5 * pointcolor_light, 0.6 * pointcolor_light, 0.8 * pointcolor_light, 1);
- if (m_moon_tonemap)
- {
- pointcolor_moon_f.r = pointcolor_light * (float)m_materials[4].EmissiveColor.getRed() / 255;
- pointcolor_moon_f.b = pointcolor_light * (float)m_materials[4].EmissiveColor.getBlue() / 255;
- pointcolor_moon_f.g = pointcolor_light * (float)m_materials[4].EmissiveColor.getGreen() / 255;
+ video::SColorf pointcolor_moon_f(0.5 * pointcolor_light,
+ 0.6 * pointcolor_light, 0.8 * pointcolor_light, 1);
+ if (m_moon_tonemap) {
+ pointcolor_moon_f.r = pointcolor_light *
+ (float)m_materials[4].EmissiveColor.getRed() / 255;
+ pointcolor_moon_f.b = pointcolor_light *
+ (float)m_materials[4].EmissiveColor.getBlue() / 255;
+ pointcolor_moon_f.g = pointcolor_light *
+ (float)m_materials[4].EmissiveColor.getGreen() / 255;
}
video::SColor pointcolor_sun = pointcolor_sun_f.toSColor();
video::SColor pointcolor_moon = pointcolor_moon_f.toSColor();
- // calculate the blend color
+ // Calculate the blend color
pointcolor = m_mix_scolor(pointcolor_moon, pointcolor_sun, pointcolor_blend);
}
m_bgcolor = m_mix_scolor(m_bgcolor, pointcolor, m_horizon_blend() * 0.5);
@@ -636,29 +665,29 @@ void Sky::update(float time_of_day, float time_brightness,
}
float cloud_direct_brightness = 0;
- if(sunlight_seen) {
+ if (sunlight_seen) {
if (!m_directional_colored_fog) {
cloud_direct_brightness = time_brightness;
- if(time_brightness >= 0.2 && time_brightness < 0.7)
+ if (time_brightness >= 0.2 && time_brightness < 0.7)
cloud_direct_brightness *= 1.3;
- }
- else {
- cloud_direct_brightness = MYMIN(m_horizon_blend() * 0.15 + m_time_brightness, 1);
+ } else {
+ cloud_direct_brightness = MYMIN(m_horizon_blend() * 0.15 +
+ m_time_brightness, 1);
}
} else {
cloud_direct_brightness = direct_brightness;
}
+
m_cloud_brightness = m_cloud_brightness * cloud_color_change_fraction +
- cloud_direct_brightness * (1.0 - cloud_color_change_fraction);
+ cloud_direct_brightness * (1.0 - cloud_color_change_fraction);
m_cloudcolor_f = video::SColorf(
- m_cloudcolor_bright_f.r * m_cloud_brightness,
- m_cloudcolor_bright_f.g * m_cloud_brightness,
- m_cloudcolor_bright_f.b * m_cloud_brightness,
- 1.0);
+ m_cloudcolor_bright_f.r * m_cloud_brightness,
+ m_cloudcolor_bright_f.g * m_cloud_brightness,
+ m_cloudcolor_bright_f.b * m_cloud_brightness,
+ 1.0
+ );
if (m_directional_colored_fog) {
- m_cloudcolor_f = m_mix_scolorf(m_cloudcolor_f, video::SColorf(pointcolor), m_horizon_blend() * 0.25);
+ m_cloudcolor_f = m_mix_scolorf(m_cloudcolor_f,
+ video::SColorf(pointcolor), m_horizon_blend() * 0.25);
}
-
}
-
-
diff --git a/src/sound_openal.cpp b/src/sound_openal.cpp
index e2b6d937a..317667f52 100644
--- a/src/sound_openal.cpp
+++ b/src/sound_openal.cpp
@@ -41,9 +41,9 @@ with this program; ifnot, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "util/numeric.h" // myrand()
#include "porting.h"
-#include <map>
#include <vector>
#include <fstream>
+#include "util/cpp11_container.h"
#define BUFFER_SIZE 30000
@@ -144,6 +144,7 @@ SoundBuffer *load_opened_ogg_file(OggVorbis_File *oggFile,
ov_clear(oggFile);
infostream << "Audio: Error decoding "
<< filename_for_logging << std::endl;
+ delete snd;
return NULL;
}
@@ -270,8 +271,8 @@ private:
ALCdevice *m_device;
ALCcontext *m_context;
int m_next_id;
- std::map<std::string, std::vector<SoundBuffer*> > m_buffers;
- std::map<int, PlayingSound*> m_sounds_playing;
+ UNORDERED_MAP<std::string, std::vector<SoundBuffer*> > m_buffers;
+ UNORDERED_MAP<int, PlayingSound*> m_sounds_playing;
v3f m_listener_pos;
public:
bool m_is_initialized;
@@ -336,7 +337,7 @@ public:
alcCloseDevice(m_device);
m_device = NULL;
- for (std::map<std::string, std::vector<SoundBuffer*> >::iterator i = m_buffers.begin();
+ for (UNORDERED_MAP<std::string, std::vector<SoundBuffer*> >::iterator i = m_buffers.begin();
i != m_buffers.end(); ++i) {
for (std::vector<SoundBuffer*>::iterator iter = (*i).second.begin();
iter != (*i).second.end(); ++iter) {
@@ -350,7 +351,7 @@ public:
void addBuffer(const std::string &name, SoundBuffer *buf)
{
- std::map<std::string, std::vector<SoundBuffer*> >::iterator i =
+ UNORDERED_MAP<std::string, std::vector<SoundBuffer*> >::iterator i =
m_buffers.find(name);
if(i != m_buffers.end()){
i->second.push_back(buf);
@@ -364,7 +365,7 @@ public:
SoundBuffer* getBuffer(const std::string &name)
{
- std::map<std::string, std::vector<SoundBuffer*> >::iterator i =
+ UNORDERED_MAP<std::string, std::vector<SoundBuffer*> >::iterator i =
m_buffers.find(name);
if(i == m_buffers.end())
return NULL;
@@ -442,8 +443,7 @@ public:
void deleteSound(int id)
{
- std::map<int, PlayingSound*>::iterator i =
- m_sounds_playing.find(id);
+ UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.find(id);
if(i == m_sounds_playing.end())
return;
PlayingSound *sound = i->second;
@@ -483,10 +483,8 @@ public:
<<m_sounds_playing.size()<<" playing sounds, "
<<m_buffers.size()<<" sound names loaded"<<std::endl;
std::set<int> del_list;
- for(std::map<int, PlayingSound*>::iterator
- i = m_sounds_playing.begin();
- i != m_sounds_playing.end(); ++i)
- {
+ for(UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.begin();
+ i != m_sounds_playing.end(); ++i) {
int id = i->first;
PlayingSound *sound = i->second;
// If not playing, remove it
@@ -582,9 +580,8 @@ public:
}
void updateSoundPosition(int id, v3f pos)
{
- std::map<int, PlayingSound*>::iterator i =
- m_sounds_playing.find(id);
- if(i == m_sounds_playing.end())
+ UNORDERED_MAP<int, PlayingSound*>::iterator i = m_sounds_playing.find(id);
+ if (i == m_sounds_playing.end())
return;
PlayingSound *sound = i->second;
diff --git a/src/subgame.cpp b/src/subgame.cpp
index 7e9a0b368..55bbd3954 100644
--- a/src/subgame.cpp
+++ b/src/subgame.cpp
@@ -313,8 +313,8 @@ bool loadGameConfAndInitWorld(const std::string &path, const SubgameSpec &gamesp
Settings conf;
MapgenParams params;
- params.load(*g_settings);
- params.save(conf);
+ params.readParams(g_settings);
+ params.writeParams(&conf);
conf.writeLines(oss);
oss << "[end_of_params]\n";
diff --git a/src/terminal_chat_console.cpp b/src/terminal_chat_console.cpp
index c86a960fa..a8c4ebaef 100644
--- a/src/terminal_chat_console.cpp
+++ b/src/terminal_chat_console.cpp
@@ -345,9 +345,11 @@ void TerminalChatConsole::step(int ch)
if (p.first > m_log_level)
continue;
- m_chat_backend.addMessage(
- utf8_to_wide(Logger::getLevelLabel(p.first)),
- utf8_to_wide(p.second));
+ std::wstring error_message = utf8_to_wide(Logger::getLevelLabel(p.first));
+ if (!g_settings->getBool("disable_escape_sequences")) {
+ error_message = L"\x1b(c@red)" + error_message + L"\x1b(c@white)";
+ }
+ m_chat_backend.addMessage(error_message, utf8_to_wide(p.second));
}
// handle input
@@ -438,7 +440,7 @@ void TerminalChatConsole::draw_text()
continue;
for (u32 i = 0; i < line.fragments.size(); ++i) {
const ChatFormattedFragment& fragment = line.fragments[i];
- addstr(wide_to_utf8(fragment.text).c_str());
+ addstr(wide_to_utf8(fragment.text.getString()).c_str());
}
}
}
diff --git a/src/threading/event.cpp b/src/threading/event.cpp
index 165f9d83f..0d5928f10 100644
--- a/src/threading/event.cpp
+++ b/src/threading/event.cpp
@@ -27,8 +27,8 @@ DEALINGS IN THE SOFTWARE.
Event::Event()
{
-#if __cplusplus < 201103L
-# ifdef _WIN32
+#ifndef USE_CPP11_MUTEX
+# if USE_WIN_MUTEX
event = CreateEvent(NULL, false, false, NULL);
# else
pthread_cond_init(&cv, NULL);
@@ -38,10 +38,10 @@ Event::Event()
#endif
}
-#if __cplusplus < 201103L
+#ifndef USE_CPP11_MUTEX
Event::~Event()
{
-#ifdef _WIN32
+#if USE_WIN_MUTEX
CloseHandle(event);
#else
pthread_cond_destroy(&cv);
@@ -53,13 +53,13 @@ Event::~Event()
void Event::wait()
{
-#if __cplusplus >= 201103L
+#if USE_CPP11_MUTEX
MutexAutoLock lock(mutex);
while (!notified) {
cv.wait(lock);
}
notified = false;
-#elif defined(_WIN32)
+#elif USE_WIN_MUTEX
WaitForSingleObject(event, INFINITE);
#else
pthread_mutex_lock(&mutex);
@@ -74,11 +74,11 @@ void Event::wait()
void Event::signal()
{
-#if __cplusplus >= 201103L
+#if USE_CPP11_MUTEX
MutexAutoLock lock(mutex);
notified = true;
cv.notify_one();
-#elif defined(_WIN32)
+#elif USE_WIN_MUTEX
SetEvent(event);
#else
pthread_mutex_lock(&mutex);
diff --git a/src/threading/event.h b/src/threading/event.h
index dd5164576..26cb8997a 100644
--- a/src/threading/event.h
+++ b/src/threading/event.h
@@ -26,17 +26,12 @@ DEALINGS IN THE SOFTWARE.
#ifndef THREADING_EVENT_H
#define THREADING_EVENT_H
-#if __cplusplus >= 201103L
+#include "threads.h"
+
+#if USE_CPP11_MUTEX
#include <condition_variable>
#include "threading/mutex.h"
#include "threading/mutex_auto_lock.h"
-#elif defined(_WIN32)
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif
- #include <windows.h>
-#else
- #include <pthread.h>
#endif
@@ -49,18 +44,18 @@ DEALINGS IN THE SOFTWARE.
class Event {
public:
Event();
-#if __cplusplus < 201103L
+#ifndef USE_CPP11_MUTEX
~Event();
#endif
void wait();
void signal();
private:
-#if __cplusplus >= 201103L
+#if USE_CPP11_MUTEX
std::condition_variable cv;
Mutex mutex;
bool notified;
-#elif defined(_WIN32)
+#elif USE_WIN_MUTEX
HANDLE event;
#else
pthread_cond_t cv;
diff --git a/src/threading/mutex.cpp b/src/threading/mutex.cpp
index f2b07bec3..0908b5d37 100644
--- a/src/threading/mutex.cpp
+++ b/src/threading/mutex.cpp
@@ -23,14 +23,13 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
-// Windows std::mutex is much slower than the critical section API
-#if __cplusplus < 201103L || defined(_WIN32)
+#include "threads.h"
+
+#ifndef USE_CPP11_MUTEX
#include "threading/mutex.h"
-#ifndef _WIN32
- #include <cassert>
-#endif
+#include <cassert>
#define UNUSED(expr) do { (void)(expr); } while (0)
@@ -47,7 +46,7 @@ Mutex::Mutex(bool recursive)
void Mutex::init_mutex(bool recursive)
{
-#ifdef _WIN32
+#if USE_WIN_MUTEX
// Windows critical sections are recursive by default
UNUSED(recursive);
@@ -69,7 +68,7 @@ void Mutex::init_mutex(bool recursive)
Mutex::~Mutex()
{
-#ifdef _WIN32
+#if USE_WIN_MUTEX
DeleteCriticalSection(&mutex);
#else
int ret = pthread_mutex_destroy(&mutex);
@@ -80,7 +79,7 @@ Mutex::~Mutex()
void Mutex::lock()
{
-#ifdef _WIN32
+#if USE_WIN_MUTEX
EnterCriticalSection(&mutex);
#else
int ret = pthread_mutex_lock(&mutex);
@@ -91,7 +90,7 @@ void Mutex::lock()
void Mutex::unlock()
{
-#ifdef _WIN32
+#if USE_WIN_MUTEX
LeaveCriticalSection(&mutex);
#else
int ret = pthread_mutex_unlock(&mutex);
@@ -104,5 +103,5 @@ RecursiveMutex::RecursiveMutex()
: Mutex(true)
{}
-#endif
+#endif // C++11
diff --git a/src/threading/mutex.h b/src/threading/mutex.h
index dadbd050c..fb5c029fc 100644
--- a/src/threading/mutex.h
+++ b/src/threading/mutex.h
@@ -26,14 +26,15 @@ DEALINGS IN THE SOFTWARE.
#ifndef THREADING_MUTEX_H
#define THREADING_MUTEX_H
-// Windows std::mutex is much slower than the critical section API
-#if __cplusplus >= 201103L && !defined(_WIN32)
+#include "threads.h"
+
+#if USE_CPP11_MUTEX
#include <mutex>
using Mutex = std::mutex;
using RecursiveMutex = std::recursive_mutex;
#else
-#ifdef _WIN32
+#if USE_WIN_MUTEX
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
@@ -41,7 +42,7 @@ DEALINGS IN THE SOFTWARE.
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
-#else // pthread
+#else
#include <pthread.h>
#endif
@@ -59,9 +60,9 @@ protected:
Mutex(bool recursive);
void init_mutex(bool recursive);
private:
-#ifdef _WIN32
+#if USE_WIN_MUTEX
CRITICAL_SECTION mutex;
-#else // pthread
+#else
pthread_mutex_t mutex;
#endif
@@ -76,6 +77,6 @@ public:
DISABLE_CLASS_COPY(RecursiveMutex);
};
-#endif // C++11
+#endif // C++11
#endif
diff --git a/src/threading/mutex_auto_lock.h b/src/threading/mutex_auto_lock.h
index 25caf7e14..d79c68a93 100644
--- a/src/threading/mutex_auto_lock.h
+++ b/src/threading/mutex_auto_lock.h
@@ -26,7 +26,9 @@ DEALINGS IN THE SOFTWARE.
#ifndef THREADING_MUTEX_AUTO_LOCK_H
#define THREADING_MUTEX_AUTO_LOCK_H
-#if __cplusplus >= 201103L
+#include "threads.h"
+
+#if USE_CPP11_MUTEX
#include <mutex>
using MutexAutoLock = std::unique_lock<std::mutex>;
using RecursiveMutexAutoLock = std::unique_lock<std::recursive_mutex>;
diff --git a/src/threading/thread.cpp b/src/threading/thread.cpp
index 5161a6c01..fbe4ba1f3 100644
--- a/src/threading/thread.cpp
+++ b/src/threading/thread.cpp
@@ -54,7 +54,7 @@ DEALINGS IN THE SOFTWARE.
// for setName
-#if defined(linux) || defined(__linux)
+#if defined(__linux__)
#include <sys/prctl.h>
#elif defined(__FreeBSD__) || defined(__OpenBSD__)
#include <pthread_np.h>
@@ -70,7 +70,7 @@ DEALINGS IN THE SOFTWARE.
// for bindToProcessor
#if __FreeBSD_version >= 702106
typedef cpuset_t cpu_set_t;
-#elif defined(__linux) || defined(linux)
+#elif defined(__linux__)
#include <sched.h>
#elif defined(__sun) || defined(sun)
#include <sys/types.h>
@@ -198,7 +198,7 @@ bool Thread::kill()
m_running = false;
-#ifdef _WIN32
+#if USE_WIN_THREADS
TerminateThread(m_thread_handle, 0);
CloseHandle(m_thread_handle);
#else
@@ -261,7 +261,7 @@ DWORD WINAPI Thread::threadProc(LPVOID param)
void Thread::setName(const std::string &name)
{
-#if defined(linux) || defined(__linux)
+#if defined(__linux__)
// It would be cleaner to do this with pthread_setname_np,
// which was added to glibc in version 2.12, but some major
@@ -310,10 +310,16 @@ void Thread::setName(const std::string &name)
unsigned int Thread::getNumberOfProcessors()
{
-#if __cplusplus >= 201103L
+#if USE_CPP11_THREADS
return std::thread::hardware_concurrency();
+#elif USE_WIN_THREADS
+
+ SYSTEM_INFO sysinfo;
+ GetSystemInfo(&sysinfo);
+ return sysinfo.dwNumberOfProcessors;
+
#elif defined(_SC_NPROCESSORS_ONLN)
return sysconf(_SC_NPROCESSORS_ONLN);
@@ -335,12 +341,6 @@ unsigned int Thread::getNumberOfProcessors()
return get_nprocs();
-#elif defined(_WIN32)
-
- SYSTEM_INFO sysinfo;
- GetSystemInfo(&sysinfo);
- return sysinfo.dwNumberOfProcessors;
-
#elif defined(PTW32_VERSION) || defined(__hpux)
return pthread_num_processors_np();
@@ -359,11 +359,11 @@ bool Thread::bindToProcessor(unsigned int proc_number)
return false;
-#elif defined(_WIN32)
+#elif USE_WIN_THREADS
return SetThreadAffinityMask(getThreadHandle(), 1 << proc_number);
-#elif __FreeBSD_version >= 702106 || defined(__linux) || defined(linux)
+#elif __FreeBSD_version >= 702106 || defined(__linux__)
cpu_set_t cpuset;
@@ -407,7 +407,7 @@ bool Thread::bindToProcessor(unsigned int proc_number)
bool Thread::setPriority(int prio)
{
-#if defined(_WIN32)
+#if USE_WIN_THREADS
return SetThreadPriority(getThreadHandle(), prio);
diff --git a/src/threading/thread.h b/src/threading/thread.h
index de800ecb7..14a0e13ab 100644
--- a/src/threading/thread.h
+++ b/src/threading/thread.h
@@ -32,9 +32,6 @@ DEALINGS IN THE SOFTWARE.
#include "threads.h"
#include <string>
-#if USE_CPP11_THREADS
- #include <thread> // for std::thread
-#endif
#ifdef _AIX
#include <sys/thread.h> // for tid_t
#endif
@@ -157,9 +154,11 @@ private:
Atomic<bool> m_running;
Mutex m_mutex;
-#ifndef USE_CPP11_THREADS
+#if USE_CPP11_THREADS
+ std::thread *m_thread_obj;
+#else
threadhandle_t m_thread_handle;
-# if _WIN32
+# if USE_WIN_THREADS
threadid_t m_thread_id;
# endif
#endif
@@ -172,10 +171,6 @@ private:
tid_t m_kernel_thread_id;
#endif
-#if USE_CPP11_THREADS
- std::thread *m_thread_obj;
-#endif
-
DISABLE_CLASS_COPY(Thread);
};
diff --git a/src/threads.h b/src/threads.h
index d4306f631..ce98593cd 100644
--- a/src/threads.h
+++ b/src/threads.h
@@ -21,7 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define THREADS_HEADER
//
-// Determine which threading API we will use
+// Determine which threading APIs we will use
//
#if __cplusplus >= 201103L
#define USE_CPP11_THREADS 1
@@ -31,11 +31,27 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define USE_POSIX_THREADS 1
#endif
+#if defined(_WIN32)
+ // Prefer critical section API because std::mutex is much slower on Windows
+ #define USE_WIN_MUTEX 1
+#elif __cplusplus >= 201103L
+ #define USE_CPP11_MUTEX 1
+#else
+ #define USE_POSIX_MUTEX 1
+#endif
+
///////////////
#if USE_CPP11_THREADS
#include <thread>
+#elif USE_POSIX_THREADS
+ #include <pthread.h>
+#else
+ #ifndef WIN32_LEAN_AND_MEAN
+ #define WIN32_LEAN_AND_MEAN
+ #endif
+ #include <windows.h>
#endif
#include "threading/mutex.h"
diff --git a/src/tool.cpp b/src/tool.cpp
index 54b9f15f4..20b71fb31 100644
--- a/src/tool.cpp
+++ b/src/tool.cpp
@@ -34,24 +34,23 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const
writeF1000(os, full_punch_interval);
writeS16(os, max_drop_level);
writeU32(os, groupcaps.size());
- for(std::map<std::string, ToolGroupCap>::const_iterator
- i = groupcaps.begin(); i != groupcaps.end(); ++i){
+ for (ToolGCMap::const_iterator i = groupcaps.begin(); i != groupcaps.end(); ++i) {
const std::string *name = &i->first;
const ToolGroupCap *cap = &i->second;
os<<serializeString(*name);
writeS16(os, cap->uses);
writeS16(os, cap->maxlevel);
writeU32(os, cap->times.size());
- for(std::map<int, float>::const_iterator
- i = cap->times.begin(); i != cap->times.end(); ++i){
+ for (UNORDERED_MAP<int, float>::const_iterator
+ i = cap->times.begin(); i != cap->times.end(); ++i) {
writeS16(os, i->first);
writeF1000(os, i->second);
}
}
if(protocol_version > 17){
writeU32(os, damageGroups.size());
- for(std::map<std::string, s16>::const_iterator
- i = damageGroups.begin(); i != damageGroups.end(); ++i){
+ for (DamageGroup::const_iterator i = damageGroups.begin();
+ i != damageGroups.end(); ++i) {
os<<serializeString(i->first);
writeS16(os, i->second);
}
@@ -106,7 +105,7 @@ DigParams getDigParams(const ItemGroupList &groups,
default:
break;
}
-
+
// Values to be returned (with a bit of conversion)
bool result_diggable = false;
float result_time = 0.0;
@@ -115,8 +114,8 @@ DigParams getDigParams(const ItemGroupList &groups,
int level = itemgroup_get(groups, "level");
//infostream<<"level="<<level<<std::endl;
- for(std::map<std::string, ToolGroupCap>::const_iterator
- i = tp->groupcaps.begin(); i != tp->groupcaps.end(); ++i){
+ for (ToolGCMap::const_iterator i = tp->groupcaps.begin();
+ i != tp->groupcaps.end(); ++i) {
const std::string &name = i->first;
//infostream<<"group="<<name<<std::endl;
const ToolGroupCap &cap = i->second;
@@ -163,8 +162,8 @@ HitParams getHitParams(const ItemGroupList &armor_groups,
s16 damage = 0;
float full_punch_interval = tp->full_punch_interval;
- for(std::map<std::string, s16>::const_iterator
- i = tp->damageGroups.begin(); i != tp->damageGroups.end(); ++i){
+ for (DamageGroup::const_iterator i = tp->damageGroups.begin();
+ i != tp->damageGroups.end(); ++i) {
s16 armor = itemgroup_get(armor_groups, i->first);
damage += i->second * rangelim(time_from_last_punch / full_punch_interval, 0.0, 1.0)
* armor / 100.0;
@@ -197,7 +196,7 @@ PunchDamageResult getPunchDamage(
do_hit = false;
}
}
-
+
PunchDamageResult result;
if(do_hit)
{
diff --git a/src/tool.h b/src/tool.h
index 509561a16..ebba5b749 100644
--- a/src/tool.h
+++ b/src/tool.h
@@ -23,12 +23,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes.h"
#include <string>
#include <iostream>
-#include <map>
+#include "util/cpp11_container.h"
#include "itemgroup.h"
struct ToolGroupCap
{
- std::map<int, float> times;
+ UNORDERED_MAP<int, float> times;
int maxlevel;
int uses;
@@ -39,8 +39,8 @@ struct ToolGroupCap
bool getTime(int rating, float *time) const
{
- std::map<int, float>::const_iterator i = times.find(rating);
- if(i == times.end()){
+ UNORDERED_MAP<int, float>::const_iterator i = times.find(rating);
+ if (i == times.end()) {
*time = 0;
return false;
}
@@ -50,22 +50,19 @@ struct ToolGroupCap
};
-// CLANG SUCKS DONKEY BALLS
-typedef std::map<std::string, struct ToolGroupCap> ToolGCMap;
-typedef std::map<std::string, s16> DamageGroup;
+typedef UNORDERED_MAP<std::string, struct ToolGroupCap> ToolGCMap;
+typedef UNORDERED_MAP<std::string, s16> DamageGroup;
struct ToolCapabilities
{
float full_punch_interval;
int max_drop_level;
- // CLANG SUCKS DONKEY BALLS
ToolGCMap groupcaps;
DamageGroup damageGroups;
ToolCapabilities(
float full_punch_interval_=1.4,
int max_drop_level_=1,
- // CLANG SUCKS DONKEY BALLS
ToolGCMap groupcaps_=ToolGCMap(),
DamageGroup damageGroups_=DamageGroup()
):
diff --git a/src/touchscreengui.cpp b/src/touchscreengui.cpp
index f51b2d5fa..8d210c63a 100644
--- a/src/touchscreengui.cpp
+++ b/src/touchscreengui.cpp
@@ -177,8 +177,10 @@ void AutoHideButtonBar::init(ISimpleTextureSource* tsrc,
AutoHideButtonBar::~AutoHideButtonBar()
{
- m_starter.guibutton->setVisible(false);
- m_starter.guibutton->drop();
+ if (m_starter.guibutton) {
+ m_starter.guibutton->setVisible(false);
+ m_starter.guibutton->drop();
+ }
}
void AutoHideButtonBar::addButton(touch_gui_button_id button_id,
@@ -414,7 +416,7 @@ void AutoHideButtonBar::show()
TouchScreenGUI::TouchScreenGUI(IrrlichtDevice *device, IEventReceiver* receiver):
m_device(device),
m_guienv(device->getGUIEnvironment()),
- m_camera_yaw(0.0),
+ m_camera_yaw_change(0.0),
m_camera_pitch(0.0),
m_visible(false),
m_move_id(-1),
@@ -835,17 +837,11 @@ void TouchScreenGUI::translateEvent(const SEvent &event)
/* adapt to similar behaviour as pc screen */
double d = g_settings->getFloat("mouse_sensitivity") *4;
- double old_yaw = m_camera_yaw;
+ double old_yaw = m_camera_yaw_change;
double old_pitch = m_camera_pitch;
- m_camera_yaw -= dx * d;
- m_camera_pitch = MYMIN(MYMAX( m_camera_pitch + (dy * d),-180),180);
-
- while (m_camera_yaw < 0)
- m_camera_yaw += 360;
-
- while (m_camera_yaw > 360)
- m_camera_yaw -= 360;
+ m_camera_yaw_change -= dx * d;
+ m_camera_pitch = MYMIN(MYMAX(m_camera_pitch + (dy * d), -180), 180);
// update shootline
m_shootline = m_device
diff --git a/src/touchscreengui.h b/src/touchscreengui.h
index d8106a260..53fc6d683 100644
--- a/src/touchscreengui.h
+++ b/src/touchscreengui.h
@@ -75,7 +75,7 @@ struct button_info {
float repeatdelay;
irr::EKEY_CODE keycode;
std::vector<int> ids;
- IGUIButton* guibutton;
+ IGUIButton* guibutton = NULL;
bool immediate_release;
};
@@ -147,8 +147,14 @@ public:
void init(ISimpleTextureSource* tsrc);
- double getYaw() { return m_camera_yaw; }
+ double getYawChange() {
+ double res = m_camera_yaw_change;
+ m_camera_yaw_change = 0;
+ return res;
+ }
+
double getPitch() { return m_camera_pitch; }
+
line3d<f32> getShootline() { return m_shootline; }
void step(float dtime);
@@ -170,7 +176,7 @@ private:
bool m_visible; // is the gui visible
/* value in degree */
- double m_camera_yaw;
+ double m_camera_yaw_change;
double m_camera_pitch;
line3d<f32> m_shootline;
diff --git a/src/treegen.cpp b/src/treegen.cpp
index 208f34552..f37bf0e86 100644
--- a/src/treegen.cpp
+++ b/src/treegen.cpp
@@ -31,7 +31,7 @@ namespace treegen
{
void make_tree(MMVManip &vmanip, v3s16 p0,
- bool is_apple_tree, INodeDefManager *ndef, int seed)
+ bool is_apple_tree, INodeDefManager *ndef, s32 seed)
{
/*
NOTE: Tree-placing code is currently duplicated in the engine
@@ -149,7 +149,7 @@ treegen::error make_ltree(MMVManip &vmanip, v3s16 p0,
INodeDefManager *ndef, TreeDef tree_definition)
{
MapNode dirtnode(ndef->getId("mapgen_dirt"));
- int seed;
+ s32 seed;
if (tree_definition.explicit_seed)
seed = tree_definition.seed + 14002;
else
@@ -649,7 +649,7 @@ v3f transposeMatrix(irr::core::matrix4 M, v3f v)
}
-void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
+void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
{
/*
NOTE: Tree-placing code is currently duplicated in the engine
@@ -748,7 +748,7 @@ void make_jungletree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed
}
-void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
+void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
{
/*
NOTE: Tree-placing code is currently duplicated in the engine
@@ -770,9 +770,9 @@ void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
MapNode snownode(c_snow);
PseudoRandom pr(seed);
- s16 trunk_h = pr.range(9, 13);
+ u16 trunk_h = pr.range(9, 13);
v3s16 p1 = p0;
- for (s16 ii = 0; ii < trunk_h; ii++) {
+ for (u16 ii = 0; ii < trunk_h; ii++) {
if (vmanip.m_area.contains(p1)) {
u32 vi = vmanip.m_area.index(p1);
vmanip.m_data[vi] = treenode;
@@ -790,7 +790,7 @@ void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, int seed)
leaves_d[i] = 0;
// Upper branches
- s16 dev = 3;
+ u16 dev = 3;
for (s16 yy = -1; yy <= 1; yy++) {
for (s16 zz = -dev; zz <= dev; zz++) {
u32 i = leaves_a.index(v3s16(-dev, yy, zz));
diff --git a/src/treegen.h b/src/treegen.h
index 4b0089d1e..4e6f95e67 100644
--- a/src/treegen.h
+++ b/src/treegen.h
@@ -54,19 +54,19 @@ namespace treegen {
bool thin_branches;
MapNode fruitnode;
int fruit_chance;
- int seed;
+ s32 seed;
bool explicit_seed;
};
// Add default tree
void make_tree(MMVManip &vmanip, v3s16 p0,
- bool is_apple_tree, INodeDefManager *ndef, int seed);
+ bool is_apple_tree, INodeDefManager *ndef, s32 seed);
// Add jungle tree
void make_jungletree(MMVManip &vmanip, v3s16 p0,
- INodeDefManager *ndef, int seed);
+ INodeDefManager *ndef, s32 seed);
// Add pine tree
void make_pine_tree(MMVManip &vmanip, v3s16 p0,
- INodeDefManager *ndef, int seed);
+ INodeDefManager *ndef, s32 seed);
// Add L-Systems tree (used by engine)
treegen::error make_ltree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef,
diff --git a/src/unittest/CMakeLists.txt b/src/unittest/CMakeLists.txt
index a07ed8ba5..7ad38099c 100644
--- a/src/unittest/CMakeLists.txt
+++ b/src/unittest/CMakeLists.txt
@@ -6,11 +6,13 @@ set (UNITTEST_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/test_connection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_filepath.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_inventory.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test_map_settings_manager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_mapnode.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_nodedef.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_noderesolver.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_noise.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_objdef.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test_player.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_profiler.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_random.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_schematic.cpp
@@ -22,3 +24,7 @@ set (UNITTEST_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/test_voxelalgorithms.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test_voxelmanipulator.cpp
PARENT_SCOPE)
+
+set (UNITTEST_CLIENT_SRCS
+ ${CMAKE_CURRENT_SOURCE_DIR}/test_keycode.cpp
+ PARENT_SCOPE)
diff --git a/src/unittest/test_filepath.cpp b/src/unittest/test_filepath.cpp
index 6ea7ac076..ac2d69b5a 100644
--- a/src/unittest/test_filepath.cpp
+++ b/src/unittest/test_filepath.cpp
@@ -252,6 +252,9 @@ void TestFilePath::testRemoveRelativePathComponent()
path = p(".");
result = fs::RemoveRelativePathComponents(path);
UASSERT(result == "");
+ path = p("../a");
+ result = fs::RemoveRelativePathComponents(path);
+ UASSERT(result == "");
path = p("./subdir/../..");
result = fs::RemoveRelativePathComponents(path);
UASSERT(result == "");
diff --git a/src/unittest/test_keycode.cpp b/src/unittest/test_keycode.cpp
new file mode 100644
index 000000000..dd3d75a5b
--- /dev/null
+++ b/src/unittest/test_keycode.cpp
@@ -0,0 +1,129 @@
+/*
+Minetest
+Copyright (C) 2016 sfan5 <sfan5@live.de>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "test.h"
+
+#include <string>
+#include "exceptions.h"
+#include "keycode.h"
+
+class TestKeycode : public TestBase {
+public:
+ TestKeycode() { TestManager::registerTestModule(this); }
+ const char *getName() { return "TestKeycode"; }
+
+ void runTests(IGameDef *gamedef);
+
+ void testCreateFromString();
+ void testCreateFromSKeyInput();
+ void testCompare();
+};
+
+static TestKeycode g_test_instance;
+
+void TestKeycode::runTests(IGameDef *gamedef)
+{
+ TEST(testCreateFromString);
+ TEST(testCreateFromSKeyInput);
+ TEST(testCompare);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define UASSERTEQ_STR(one, two) UASSERT(strcmp(one, two) == 0)
+
+void TestKeycode::testCreateFromString()
+{
+ KeyPress k;
+
+ // Character key, from char
+ k = KeyPress("R");
+ UASSERTEQ_STR(k.sym(), "KEY_KEY_R");
+ UASSERTCMP(int, >, strlen(k.name()), 0); // should have human description
+
+ // Character key, from identifier
+ k = KeyPress("KEY_KEY_B");
+ UASSERTEQ_STR(k.sym(), "KEY_KEY_B");
+ UASSERTCMP(int, >, strlen(k.name()), 0);
+
+ // Non-Character key, from identifier
+ k = KeyPress("KEY_UP");
+ UASSERTEQ_STR(k.sym(), "KEY_UP");
+ UASSERTCMP(int, >, strlen(k.name()), 0);
+
+ k = KeyPress("KEY_F6");
+ UASSERTEQ_STR(k.sym(), "KEY_F6");
+ UASSERTCMP(int, >, strlen(k.name()), 0);
+
+ // Irrlicht-unknown key, from char
+ k = KeyPress("/");
+ UASSERTEQ_STR(k.sym(), "/");
+ UASSERTCMP(int, >, strlen(k.name()), 0);
+}
+
+void TestKeycode::testCreateFromSKeyInput()
+{
+ KeyPress k;
+ irr::SEvent::SKeyInput in;
+
+ // Character key
+ in.Key = irr::KEY_KEY_3;
+ in.Char = L'3';
+ k = KeyPress(in);
+ UASSERTEQ_STR(k.sym(), "KEY_KEY_3");
+
+ // Non-Character key
+ in.Key = irr::KEY_RSHIFT;
+ in.Char = L'\0';
+ k = KeyPress(in);
+ UASSERTEQ_STR(k.sym(), "KEY_RSHIFT");
+
+ // Irrlicht-unknown key
+ in.Key = irr::KEY_KEY_CODES_COUNT;
+ in.Char = L'?';
+ k = KeyPress(in);
+ UASSERTEQ_STR(k.sym(), "?");
+
+ // prefer_character mode
+ in.Key = irr::KEY_COMMA;
+ in.Char = L'G';
+ k = KeyPress(in, true);
+ UASSERTEQ_STR(k.sym(), "KEY_KEY_G");
+}
+
+void TestKeycode::testCompare()
+{
+ // Basic comparison
+ UASSERT(KeyPress("5") == KeyPress("KEY_KEY_5"));
+ UASSERT(!(KeyPress("5") == KeyPress("KEY_NUMPAD_5")));
+
+ // Matching char suffices
+ // note: This is a real-world example, Irrlicht maps XK_equal to irr::KEY_PLUS on Linux
+ irr::SEvent::SKeyInput in;
+ in.Key = irr::KEY_PLUS;
+ in.Char = L'=';
+ UASSERT(KeyPress("=") == KeyPress(in));
+
+ // Matching keycode suffices
+ irr::SEvent::SKeyInput in2;
+ in.Key = in2.Key = irr::KEY_OEM_CLEAR;
+ in.Char = L'\0';
+ in2.Char = L';';
+ UASSERT(KeyPress(in) == KeyPress(in2));
+}
diff --git a/src/unittest/test_map_settings_manager.cpp b/src/unittest/test_map_settings_manager.cpp
new file mode 100644
index 000000000..4f5ac80f2
--- /dev/null
+++ b/src/unittest/test_map_settings_manager.cpp
@@ -0,0 +1,261 @@
+ /*
+Minetest
+Copyright (C) 2010-2014 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "test.h"
+
+#include "noise.h"
+#include "settings.h"
+#include "mapgen_v5.h"
+#include "util/sha1.h"
+#include "map_settings_manager.h"
+
+class TestMapSettingsManager : public TestBase {
+public:
+ TestMapSettingsManager() { TestManager::registerTestModule(this); }
+ const char *getName() { return "TestMapSettingsManager"; }
+
+ void makeUserConfig(Settings *conf);
+ std::string makeMetaFile(bool make_corrupt);
+
+ void runTests(IGameDef *gamedef);
+
+ void testMapSettingsManager();
+ void testMapMetaSaveLoad();
+ void testMapMetaFailures();
+};
+
+static TestMapSettingsManager g_test_instance;
+
+void TestMapSettingsManager::runTests(IGameDef *gamedef)
+{
+ TEST(testMapSettingsManager);
+ TEST(testMapMetaSaveLoad);
+ TEST(testMapMetaFailures);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+
+void check_noise_params(const NoiseParams *np1, const NoiseParams *np2)
+{
+ UASSERTEQ(float, np1->offset, np2->offset);
+ UASSERTEQ(float, np1->scale, np2->scale);
+ UASSERT(np1->spread == np2->spread);
+ UASSERTEQ(s32, np1->seed, np2->seed);
+ UASSERTEQ(u16, np1->octaves, np2->octaves);
+ UASSERTEQ(float, np1->persist, np2->persist);
+ UASSERTEQ(float, np1->lacunarity, np2->lacunarity);
+ UASSERTEQ(u32, np1->flags, np2->flags);
+}
+
+
+std::string read_file_to_string(const std::string &filepath)
+{
+ std::string buf;
+ FILE *f = fopen(filepath.c_str(), "rb");
+ if (!f)
+ return "";
+
+ fseek(f, 0, SEEK_END);
+
+ long filesize = ftell(f);
+ if (filesize == -1) {
+ fclose(f);
+ return "";
+ }
+ rewind(f);
+
+ buf.resize(filesize);
+
+ UASSERTEQ(size_t, fread(&buf[0], 1, filesize, f), 1);
+
+ fclose(f);
+ return buf;
+}
+
+
+void TestMapSettingsManager::makeUserConfig(Settings *conf)
+{
+ conf->set("mg_name", "v7");
+ conf->set("seed", "5678");
+ conf->set("water_level", "20");
+ conf->set("mgv5_np_factor", "0, 12, (500, 250, 500), 920382, 5, 0.45, 3.0");
+ conf->set("mgv5_np_height", "0, 15, (500, 250, 500), 841746, 5, 0.5, 3.0");
+ conf->set("mgv5_np_filler_depth", "20, 1, (150, 150, 150), 261, 4, 0.7, 1.0");
+ conf->set("mgv5_np_ground", "-43, 40, (80, 80, 80), 983240, 4, 0.55, 2.0");
+}
+
+
+std::string TestMapSettingsManager::makeMetaFile(bool make_corrupt)
+{
+ std::string metafile = getTestTempFile();
+
+ const char *metafile_contents =
+ "mg_name = v5\n"
+ "seed = 1234\n"
+ "mg_flags = light\n"
+ "mgv5_np_filler_depth = 20, 1, (150, 150, 150), 261, 4, 0.7, 1.0\n"
+ "mgv5_np_height = 20, 10, (250, 250, 250), 84174, 4, 0.5, 1.0\n";
+
+ FILE *f = fopen(metafile.c_str(), "wb");
+ UASSERT(f != NULL);
+
+ fputs(metafile_contents, f);
+ if (!make_corrupt)
+ fputs("[end_of_params]\n", f);
+
+ fclose(f);
+
+ return metafile;
+}
+
+
+void TestMapSettingsManager::testMapSettingsManager()
+{
+ Settings user_settings;
+ makeUserConfig(&user_settings);
+
+ std::string test_mapmeta_path = makeMetaFile(false);
+
+ MapSettingsManager mgr(&user_settings, test_mapmeta_path);
+ std::string value;
+
+ UASSERT(mgr.getMapSetting("mg_name", &value));
+ UASSERT(value == "v7");
+
+ // Pretend we're initializing the ServerMap
+ UASSERT(mgr.loadMapMeta());
+
+ // Pretend some scripts are requesting mapgen params
+ UASSERT(mgr.getMapSetting("mg_name", &value));
+ UASSERT(value == "v5");
+ UASSERT(mgr.getMapSetting("seed", &value));
+ UASSERT(value == "1234");
+ UASSERT(mgr.getMapSetting("water_level", &value));
+ UASSERT(value == "20");
+
+ // Pretend we have some mapgen settings configured from the scripting
+ UASSERT(mgr.setMapSetting("water_level", "15"));
+ UASSERT(mgr.setMapSetting("seed", "02468"));
+ UASSERT(mgr.setMapSetting("mg_flags", "nolight", true));
+
+ NoiseParams script_np_filler_depth(0, 100, v3f(200, 100, 200), 261, 4, 0.7, 2.0);
+ NoiseParams script_np_factor(0, 100, v3f(50, 50, 50), 920381, 3, 0.45, 2.0);
+ NoiseParams script_np_height(0, 100, v3f(450, 450, 450), 84174, 4, 0.5, 2.0);
+ NoiseParams meta_np_height(20, 10, v3f(250, 250, 250), 84174, 4, 0.5, 1.0);
+ NoiseParams user_np_ground(-43, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED);
+
+ mgr.setMapSettingNoiseParams("mgv5_np_filler_depth", &script_np_filler_depth, true);
+ mgr.setMapSettingNoiseParams("mgv5_np_height", &script_np_height);
+ mgr.setMapSettingNoiseParams("mgv5_np_factor", &script_np_factor);
+
+ // Now make our Params and see if the values are correctly sourced
+ MapgenParams *params = mgr.makeMapgenParams();
+ UASSERT(params->mgtype == MAPGEN_V5);
+ UASSERT(params->chunksize == 5);
+ UASSERT(params->water_level == 15);
+ UASSERT(params->seed == 1234);
+ UASSERT((params->flags & MG_LIGHT) == 0);
+
+ MapgenV5Params *v5params = (MapgenV5Params *)params;
+
+ check_noise_params(&v5params->np_filler_depth, &script_np_filler_depth);
+ check_noise_params(&v5params->np_factor, &script_np_factor);
+ check_noise_params(&v5params->np_height, &meta_np_height);
+ check_noise_params(&v5params->np_ground, &user_np_ground);
+
+ UASSERT(mgr.setMapSetting("foobar", "25") == false);
+
+ // Pretend the ServerMap is shutting down
+ UASSERT(mgr.saveMapMeta());
+
+ // Make sure our interface expectations are met
+ UASSERT(mgr.mapgen_params == params);
+ UASSERT(mgr.makeMapgenParams() == params);
+
+#if 0
+ // TODO(paramat or hmmmm): change this to compare the result against a static file
+
+ // Load the resulting map_meta.txt and make sure it contains what we expect
+ unsigned char expected_contents_hash[20] = {
+ 0x48, 0x3f, 0x88, 0x5a, 0xc0, 0x7a, 0x14, 0x48, 0xa4, 0x71,
+ 0x78, 0x56, 0x95, 0x2d, 0xdc, 0x6a, 0xf7, 0x61, 0x36, 0x5f
+ };
+
+ SHA1 ctx;
+ std::string metafile_contents = read_file_to_string(test_mapmeta_path);
+ ctx.addBytes(&metafile_contents[0], metafile_contents.size());
+ unsigned char *sha1_result = ctx.getDigest();
+ int resultdiff = memcmp(sha1_result, expected_contents_hash, 20);
+ free(sha1_result);
+
+ UASSERT(!resultdiff);
+#endif
+}
+
+
+void TestMapSettingsManager::testMapMetaSaveLoad()
+{
+ Settings conf;
+ std::string path = getTestTempDirectory()
+ + DIR_DELIM + "foobar" + DIR_DELIM + "map_meta.txt";
+
+ // Create a set of mapgen params and save them to map meta
+ conf.set("seed", "12345");
+ conf.set("water_level", "5");
+ MapSettingsManager mgr1(&conf, path);
+ MapgenParams *params1 = mgr1.makeMapgenParams();
+ UASSERT(params1);
+ UASSERT(mgr1.saveMapMeta());
+
+ // Now try loading the map meta to mapgen params
+ conf.set("seed", "67890");
+ conf.set("water_level", "32");
+ MapSettingsManager mgr2(&conf, path);
+ UASSERT(mgr2.loadMapMeta());
+ MapgenParams *params2 = mgr2.makeMapgenParams();
+ UASSERT(params2);
+
+ // Check that both results are correct
+ UASSERTEQ(u64, params1->seed, 12345);
+ UASSERTEQ(s16, params1->water_level, 5);
+ UASSERTEQ(u64, params2->seed, 12345);
+ UASSERTEQ(s16, params2->water_level, 5);
+}
+
+
+void TestMapSettingsManager::testMapMetaFailures()
+{
+ std::string test_mapmeta_path;
+ Settings conf;
+
+ // Check to see if it'll fail on a non-existent map meta file
+ test_mapmeta_path = "woobawooba/fgdfg/map_meta.txt";
+ UASSERT(!fs::PathExists(test_mapmeta_path));
+
+ MapSettingsManager mgr1(&conf, test_mapmeta_path);
+ UASSERT(!mgr1.loadMapMeta());
+
+ // Check to see if it'll fail on a corrupt map meta file
+ test_mapmeta_path = makeMetaFile(true);
+ UASSERT(fs::PathExists(test_mapmeta_path));
+
+ MapSettingsManager mgr2(&conf, test_mapmeta_path);
+ UASSERT(!mgr2.loadMapMeta());
+}
diff --git a/src/unittest/test_player.cpp b/src/unittest/test_player.cpp
new file mode 100644
index 000000000..85fbc8b2d
--- /dev/null
+++ b/src/unittest/test_player.cpp
@@ -0,0 +1,88 @@
+/*
+Minetest
+Copyright (C) 2010-2016 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "test.h"
+
+#include "exceptions.h"
+#include "remoteplayer.h"
+#include "content_sao.h"
+#include "server.h"
+
+class TestPlayer : public TestBase {
+public:
+ TestPlayer() { TestManager::registerTestModule(this); }
+ const char *getName() { return "TestPlayer"; }
+
+ void runTests(IGameDef *gamedef);
+
+ void testSave(IGameDef *gamedef);
+ void testLoad(IGameDef *gamedef);
+};
+
+static TestPlayer g_test_instance;
+
+void TestPlayer::runTests(IGameDef *gamedef)
+{
+ TEST(testSave, gamedef);
+ TEST(testLoad, gamedef);
+}
+
+void TestPlayer::testSave(IGameDef *gamedef)
+{
+ RemotePlayer rplayer("testplayer_save", gamedef->idef());
+ PlayerSAO sao(NULL, 1, false);
+ sao.initialize(&rplayer, std::set<std::string>());
+ rplayer.setPlayerSAO(&sao);
+ sao.setBreath(10);
+ sao.setHPRaw(8);
+ sao.setYaw(0.1f);
+ sao.setPitch(0.6f);
+ sao.setBasePosition(v3f(450.2f, -15.7f, 68.1f));
+ rplayer.save(".", gamedef);
+ UASSERT(fs::PathExists("testplayer_save"));
+}
+
+void TestPlayer::testLoad(IGameDef *gamedef)
+{
+ RemotePlayer rplayer("testplayer_load", gamedef->idef());
+ PlayerSAO sao(NULL, 1, false);
+ sao.initialize(&rplayer, std::set<std::string>());
+ rplayer.setPlayerSAO(&sao);
+ sao.setBreath(10);
+ sao.setHPRaw(8);
+ sao.setYaw(0.1f);
+ sao.setPitch(0.6f);
+ sao.setBasePosition(v3f(450.2f, -15.7f, 68.1f));
+ rplayer.save(".", gamedef);
+ UASSERT(fs::PathExists("testplayer_load"));
+
+ RemotePlayer rplayer_load("testplayer_load", gamedef->idef());
+ PlayerSAO sao_load(NULL, 2, false);
+ std::ifstream is("testplayer_load", std::ios_base::binary);
+ UASSERT(is.good());
+ rplayer_load.deSerialize(is, "testplayer_load", &sao_load);
+ is.close();
+
+ UASSERT(strcmp(rplayer_load.getName(), "testplayer_load") == 0);
+ UASSERT(sao_load.getBreath() == 10);
+ UASSERT(sao_load.getHP() == 8);
+ UASSERT(sao_load.getYaw() == 0.1f);
+ UASSERT(sao_load.getPitch() == 0.6f);
+ UASSERT(sao_load.getBasePosition() == v3f(450.2f, -15.7f, 68.1f));
+}
diff --git a/src/unittest/test_settings.cpp b/src/unittest/test_settings.cpp
index a82d734f0..733c7e92a 100644
--- a/src/unittest/test_settings.cpp
+++ b/src/unittest/test_settings.cpp
@@ -32,7 +32,7 @@ public:
void testAllSettings();
static const char *config_text_before;
- static const char *config_text_after;
+ static const std::string config_text_after;
};
static TestSettings g_test_instance;
@@ -69,7 +69,7 @@ const char *TestSettings::config_text_before =
"np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.7, 2.4\n"
"zoop = true";
-const char *TestSettings::config_text_after =
+const std::string TestSettings::config_text_after =
"leet = 1337\n"
"leetleet = 13371337\n"
"leetleet_neg = -13371337\n"
@@ -197,7 +197,10 @@ void TestSettings::testAllSettings()
UASSERT(s.updateConfigObject(is, os, "", 0) == true);
//printf(">>>> expected config:\n%s\n", TEST_CONFIG_TEXT_AFTER);
//printf(">>>> actual config:\n%s\n", os.str().c_str());
+#if __cplusplus < 201103L
+ // This test only works in older C++ versions than C++11 because we use unordered_map
UASSERT(os.str() == config_text_after);
+#endif
} catch (SettingNotFoundException &e) {
UASSERT(!"Setting not found!");
}
diff --git a/src/unittest/test_threading.cpp b/src/unittest/test_threading.cpp
index f0df85b2d..cdbf9674e 100644
--- a/src/unittest/test_threading.cpp
+++ b/src/unittest/test_threading.cpp
@@ -39,7 +39,9 @@ static TestThreading g_test_instance;
void TestThreading::runTests(IGameDef *gamedef)
{
+#if !(defined(__MACH__) && defined(__APPLE__))
TEST(testStartStopWait);
+#endif
TEST(testThreadKill);
TEST(testAtomicSemaphoreThread);
}
@@ -161,6 +163,7 @@ private:
void TestThreading::testAtomicSemaphoreThread()
{
Atomic<u32> val;
+ val = 0;
Semaphore trigger;
static const u8 num_threads = 4;
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
index 0e7cbad07..f571ab22c 100644
--- a/src/util/CMakeLists.txt
+++ b/src/util/CMakeLists.txt
@@ -3,6 +3,7 @@ set(UTIL_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/auth.cpp
${CMAKE_CURRENT_SOURCE_DIR}/base64.cpp
${CMAKE_CURRENT_SOURCE_DIR}/directiontables.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/enriched_string.cpp
${CMAKE_CURRENT_SOURCE_DIR}/numeric.cpp
${CMAKE_CURRENT_SOURCE_DIR}/pointedthing.cpp
${CMAKE_CURRENT_SOURCE_DIR}/serialize.cpp
diff --git a/src/util/areastore.cpp b/src/util/areastore.cpp
index 58f08a8c2..cef67da2c 100644
--- a/src/util/areastore.cpp
+++ b/src/util/areastore.cpp
@@ -95,6 +95,7 @@ void AreaStore::deserialize(std::istream &is)
is.read(data, data_len);
a.data = std::string(data, data_len);
insertArea(&a);
+ delete [] data;
}
}
diff --git a/src/util/auth.h b/src/util/auth.h
index 1fd6ab453..7cdc7d74d 100644
--- a/src/util/auth.h
+++ b/src/util/auth.h
@@ -45,6 +45,6 @@ std::string encode_srp_verifier(const std::string &verifier,
/// Reads the DB-formatted SRP verifier and gets the verifier
/// and salt components.
bool decode_srp_verifier_and_salt(const std::string &encoded,
- std::string *salt, std::string *bytes_v);
+ std::string *verifier, std::string *salt);
#endif
diff --git a/src/util/cpp11_container.h b/src/util/cpp11_container.h
new file mode 100644
index 000000000..88317c9c4
--- /dev/null
+++ b/src/util/cpp11_container.h
@@ -0,0 +1,43 @@
+/*
+Minetest
+Copyright (C) 2016 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef MT_CPP11CONTAINER_HEADER
+#define MT_CPP11CONTAINER_HEADER
+
+#if __cplusplus >= 201103L
+#define USE_UNORDERED_CONTAINERS
+#endif
+
+#if _MSC_VER >= 1600
+#define USE_UNORDERED_CONTAINERS
+#endif
+
+#ifdef USE_UNORDERED_CONTAINERS
+ #include <unordered_map>
+ #include <unordered_set>
+ #define UNORDERED_MAP std::unordered_map
+ #define UNORDERED_SET std::unordered_set
+#else
+ #include <map>
+ #include <set>
+ #define UNORDERED_MAP std::map
+ #define UNORDERED_SET std::set
+#endif
+
+#endif
diff --git a/src/util/enriched_string.cpp b/src/util/enriched_string.cpp
new file mode 100644
index 000000000..a7fc3a828
--- /dev/null
+++ b/src/util/enriched_string.cpp
@@ -0,0 +1,166 @@
+/*
+Copyright (C) 2013 xyz, Ilya Zhuravlev <whatever@xyz.is>
+Copyright (C) 2016 Nore, Nathanaël Courant <nore@mesecons.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include "enriched_string.h"
+#include "util/string.h"
+#include "log.h"
+using namespace irr::video;
+
+EnrichedString::EnrichedString()
+{
+ clear();
+}
+
+EnrichedString::EnrichedString(const std::wstring &string,
+ const std::vector<SColor> &colors):
+ m_string(string),
+ m_colors(colors),
+ m_has_background(false)
+{}
+
+EnrichedString::EnrichedString(const std::wstring &s, const SColor &color)
+{
+ clear();
+ addAtEnd(s, color);
+}
+
+EnrichedString::EnrichedString(const wchar_t *str, const SColor &color)
+{
+ clear();
+ addAtEnd(std::wstring(str), color);
+}
+
+void EnrichedString::operator=(const wchar_t *str)
+{
+ clear();
+ addAtEnd(std::wstring(str), SColor(255, 255, 255, 255));
+}
+
+void EnrichedString::addAtEnd(const std::wstring &s, const SColor &initial_color)
+{
+ SColor color(initial_color);
+ size_t i = 0;
+ while (i < s.length()) {
+ if (s[i] != L'\x1b') {
+ m_string += s[i];
+ m_colors.push_back(color);
+ ++i;
+ continue;
+ }
+ ++i;
+ size_t start_index = i;
+ size_t length;
+ if (i == s.length()) {
+ break;
+ }
+ if (s[i] == L'(') {
+ ++i;
+ ++start_index;
+ while (i < s.length() && s[i] != L')') {
+ if (s[i] == L'\\') {
+ ++i;
+ }
+ ++i;
+ }
+ length = i - start_index;
+ ++i;
+ } else {
+ ++i;
+ length = 1;
+ }
+ std::wstring escape_sequence(s, start_index, length);
+ std::vector<std::wstring> parts = split(escape_sequence, L'@');
+ if (parts[0] == L"c") {
+ if (parts.size() < 2) {
+ continue;
+ }
+ parseColorString(wide_to_utf8(parts[1]), color, true);
+ } else if (parts[0] == L"b") {
+ if (parts.size() < 2) {
+ continue;
+ }
+ parseColorString(wide_to_utf8(parts[1]), m_background, true);
+ m_has_background = true;
+ }
+ continue;
+ }
+}
+
+void EnrichedString::addChar(const EnrichedString &source, size_t i)
+{
+ m_string += source.m_string[i];
+ m_colors.push_back(source.m_colors[i]);
+}
+
+void EnrichedString::addCharNoColor(wchar_t c)
+{
+ m_string += c;
+ if (m_colors.empty()) {
+ m_colors.push_back(SColor(255, 255, 255, 255));
+ } else {
+ m_colors.push_back(m_colors[m_colors.size() - 1]);
+ }
+}
+
+EnrichedString EnrichedString::operator+(const EnrichedString &other) const
+{
+ std::vector<SColor> result;
+ result.insert(result.end(), m_colors.begin(), m_colors.end());
+ result.insert(result.end(), other.m_colors.begin(), other.m_colors.end());
+ return EnrichedString(m_string + other.m_string, result);
+}
+
+void EnrichedString::operator+=(const EnrichedString &other)
+{
+ m_string += other.m_string;
+ m_colors.insert(m_colors.end(), other.m_colors.begin(), other.m_colors.end());
+}
+
+EnrichedString EnrichedString::substr(size_t pos, size_t len) const
+{
+ if (pos == m_string.length()) {
+ return EnrichedString();
+ }
+ if (len == std::string::npos || pos + len > m_string.length()) {
+ return EnrichedString(
+ m_string.substr(pos, std::string::npos),
+ std::vector<SColor>(m_colors.begin() + pos, m_colors.end())
+ );
+ } else {
+ return EnrichedString(
+ m_string.substr(pos, len),
+ std::vector<SColor>(m_colors.begin() + pos, m_colors.begin() + pos + len)
+ );
+ }
+}
+
+const wchar_t *EnrichedString::c_str() const
+{
+ return m_string.c_str();
+}
+
+const std::vector<SColor> &EnrichedString::getColors() const
+{
+ return m_colors;
+}
+
+const std::wstring &EnrichedString::getString() const
+{
+ return m_string;
+}
diff --git a/src/util/enriched_string.h b/src/util/enriched_string.h
new file mode 100644
index 000000000..1aca8948a
--- /dev/null
+++ b/src/util/enriched_string.h
@@ -0,0 +1,91 @@
+/*
+Copyright (C) 2013 xyz, Ilya Zhuravlev <whatever@xyz.is>
+Copyright (C) 2016 Nore, Nathanaël Courant <nore@mesecons.net>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License along
+with this program; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#ifndef ENRICHEDSTRING_HEADER
+#define ENRICHEDSTRING_HEADER
+
+#include <string>
+#include <vector>
+#include <SColor.h>
+
+class EnrichedString {
+public:
+ EnrichedString();
+ EnrichedString(const std::wstring &s,
+ const irr::video::SColor &color = irr::video::SColor(255, 255, 255, 255));
+ EnrichedString(const wchar_t *str,
+ const irr::video::SColor &color = irr::video::SColor(255, 255, 255, 255));
+ EnrichedString(const std::wstring &string,
+ const std::vector<irr::video::SColor> &colors);
+ void operator=(const wchar_t *str);
+ void addAtEnd(const std::wstring &s, const irr::video::SColor &color);
+
+ // Adds the character source[i] at the end.
+ // An EnrichedString should always be able to be copied
+ // to the end of an existing EnrichedString that way.
+ void addChar(const EnrichedString &source, size_t i);
+
+ // Adds a single character at the end, without specifying its
+ // color. The color used will be the one from the last character.
+ void addCharNoColor(wchar_t c);
+
+ EnrichedString substr(size_t pos = 0, size_t len = std::string::npos) const;
+ EnrichedString operator+(const EnrichedString &other) const;
+ void operator+=(const EnrichedString &other);
+ const wchar_t *c_str() const;
+ const std::vector<irr::video::SColor> &getColors() const;
+ const std::wstring &getString() const;
+ inline bool operator==(const EnrichedString &other) const
+ {
+ return (m_string == other.m_string && m_colors == other.m_colors);
+ }
+ inline bool operator!=(const EnrichedString &other) const
+ {
+ return !(*this == other);
+ }
+ inline void clear()
+ {
+ m_string.clear();
+ m_colors.clear();
+ m_has_background = false;
+ }
+ inline bool empty() const
+ {
+ return m_string.empty();
+ }
+ inline size_t size() const
+ {
+ return m_string.size();
+ }
+ inline bool hasBackground() const
+ {
+ return m_has_background;
+ }
+ inline irr::video::SColor getBackground() const
+ {
+ return m_background;
+ }
+private:
+ std::wstring m_string;
+ std::vector<irr::video::SColor> m_colors;
+ bool m_has_background;
+ irr::video::SColor m_background;
+};
+
+#endif
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index 42ebd9022..a9e7ae584 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -27,7 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <string.h>
#include <iostream>
-std::map<u16, std::vector<v3s16> > FacePositionCache::m_cache;
+UNORDERED_MAP<u16, std::vector<v3s16> > FacePositionCache::m_cache;
Mutex FacePositionCache::m_cache_mutex;
// Calculate the borders of a "d-radius" cube
// TODO: Make it work without mutex and data races, probably thread-local
@@ -188,14 +188,19 @@ u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed)
}
/*
- blockpos: position of block in block coordinates
+ blockpos_b: position of block in block coordinates
camera_pos: position of camera in nodes
camera_dir: an unit vector pointing to camera direction
range: viewing range
+ distance_ptr: return location for distance from the camera
*/
bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
f32 camera_fov, f32 range, f32 *distance_ptr)
{
+ // Maximum radius of a block. The magic number is
+ // sqrt(3.0) / 2.0 in literal form.
+ const f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
+
v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE;
// Block center position
@@ -209,7 +214,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
v3f blockpos_relative = blockpos - camera_pos;
// Total distance
- f32 d = blockpos_relative.getLength();
+ f32 d = MYMAX(0, blockpos_relative.getLength() - block_max_radius);
if(distance_ptr)
*distance_ptr = d;
@@ -218,13 +223,9 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
if(d > range)
return false;
- // Maximum radius of a block. The magic number is
- // sqrt(3.0) / 2.0 in literal form.
- f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
-
// If block is (nearly) touching the camera, don't
// bother validating further (that is, render it anyway)
- if(d < block_max_radius)
+ if(d == 0)
return true;
// Adjust camera position, for purposes of computing the angle,
diff --git a/src/util/numeric.h b/src/util/numeric.h
index 615327864..4cdc254c3 100644
--- a/src/util/numeric.h
+++ b/src/util/numeric.h
@@ -26,8 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "../irr_v3d.h"
#include "../irr_aabb3d.h"
#include "../threading/mutex.h"
+#include "cpp11_container.h"
#include <list>
-#include <map>
#include <vector>
@@ -41,26 +41,10 @@ public:
static std::vector<v3s16> getFacePositions(u16 d);
private:
static void generateFacePosition(u16 d);
- static std::map<u16, std::vector<v3s16> > m_cache;
+ static UNORDERED_MAP<u16, std::vector<v3s16> > m_cache;
static Mutex m_cache_mutex;
};
-class IndentationRaiser
-{
-public:
- IndentationRaiser(u16 *indentation)
- {
- m_indentation = indentation;
- (*m_indentation)++;
- }
- ~IndentationRaiser()
- {
- (*m_indentation)--;
- }
-private:
- u16 *m_indentation;
-};
-
inline s16 getContainerPos(s16 p, s16 d)
{
return (p>=0 ? p : p-d+1) / d;
@@ -149,23 +133,6 @@ inline bool isInArea(v3s16 p, v3s16 d)
#define rangelim(d, min, max) ((d) < (min) ? (min) : ((d)>(max)?(max):(d)))
#define myfloor(x) ((x) > 0.0 ? (int)(x) : (int)(x) - 1)
-inline v3s16 arealim(v3s16 p, s16 d)
-{
- if(p.X < 0)
- p.X = 0;
- if(p.Y < 0)
- p.Y = 0;
- if(p.Z < 0)
- p.Z = 0;
- if(p.X > d-1)
- p.X = d-1;
- if(p.Y > d-1)
- p.Y = d-1;
- if(p.Z > d-1)
- p.Z = d-1;
- return p;
-}
-
// The naive swap performs better than the xor version
#define SWAP(t, x, y) do { \
t temp = x; \
diff --git a/src/util/srp.cpp b/src/util/srp.cpp
index 0d3c938a3..77c1816e8 100644
--- a/src/util/srp.cpp
+++ b/src/util/srp.cpp
@@ -542,7 +542,7 @@ static SRP_Result fill_buff()
if (!fp) return SRP_ERR;
- if (fread(g_rand_buff, sizeof(g_rand_buff), 1, fp) != 1) return SRP_ERR;
+ if (fread(g_rand_buff, sizeof(g_rand_buff), 1, fp) != 1) { fclose(fp); return SRP_ERR; }
if (fclose(fp)) return SRP_ERR;
#endif
return SRP_OK;
diff --git a/src/util/string.cpp b/src/util/string.cpp
index 2c4143c76..94064ef93 100644
--- a/src/util/string.cpp
+++ b/src/util/string.cpp
@@ -314,7 +314,7 @@ std::string wide_to_narrow(const std::wstring &wcs)
#endif
-std::string urlencode(std::string str)
+std::string urlencode(const std::string &str)
{
// Encodes non-unreserved URI characters by a percent sign
// followed by two hex digits. See RFC 3986, section 2.3.
@@ -322,17 +322,18 @@ std::string urlencode(std::string str)
std::ostringstream oss(std::ios::binary);
for (u32 i = 0; i < str.size(); i++) {
unsigned char c = str[i];
- if (isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~')
+ if (isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') {
oss << c;
- else
+ } else {
oss << "%"
<< url_hex_chars[(c & 0xf0) >> 4]
<< url_hex_chars[c & 0x0f];
+ }
}
return oss.str();
}
-std::string urldecode(std::string str)
+std::string urldecode(const std::string &str)
{
// Inverse of urlencode
std::ostringstream oss(std::ios::binary);
@@ -343,18 +344,20 @@ std::string urldecode(std::string str)
hex_digit_decode(str[i+2], lowvalue)) {
oss << (char) ((highvalue << 4) | lowvalue);
i += 2;
- }
- else
+ } else {
oss << str[i];
+ }
}
return oss.str();
}
u32 readFlagString(std::string str, const FlagDesc *flagdesc, u32 *flagmask)
{
- u32 result = 0, mask = 0;
+ u32 result = 0;
+ u32 mask = 0;
char *s = &str[0];
- char *flagstr, *strpos = NULL;
+ char *flagstr;
+ char *strpos = NULL;
while ((flagstr = strtok_r(s, ",", &strpos))) {
s = NULL;
diff --git a/src/util/string.h b/src/util/string.h
index 40ef3e4d3..572c37150 100644
--- a/src/util/string.h
+++ b/src/util/string.h
@@ -21,12 +21,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define UTIL_STRING_HEADER
#include "irrlichttypes_bloated.h"
+#include "cpp11_container.h"
#include <stdlib.h>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <sstream>
+#include <iomanip>
#include <cctype>
#define STRINGIFY(x) #x
@@ -53,7 +55,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
(((unsigned char)(x) < 0xe0) ? 2 : \
(((unsigned char)(x) < 0xf0) ? 3 : 4))
-typedef std::map<std::string, std::string> StringMap;
+typedef UNORDERED_MAP<std::string, std::string> StringMap;
struct FlagDesc {
const char *name;
@@ -77,8 +79,8 @@ wchar_t *narrow_to_wide_c(const char *str);
std::wstring narrow_to_wide(const std::string &mbs);
std::string wide_to_narrow(const std::wstring &wcs);
-std::string urlencode(std::string str);
-std::string urldecode(std::string str);
+std::string urlencode(const std::string &str);
+std::string urldecode(const std::string &str);
u32 readFlagString(std::string str, const FlagDesc *flagdesc, u32 *flagmask);
std::string writeFlagString(u32 flags, const FlagDesc *flagdesc, u32 flagmask);
size_t mystrlcpy(char *dst, const char *src, size_t size);
@@ -350,23 +352,57 @@ inline T from_string(const std::string &str)
/// Returns a 64-bit signed value represented by the string \p str (decimal).
inline s64 stoi64(const std::string &str) { return from_string<s64>(str); }
-// TODO: Replace with C++11 std::to_string.
+#if __cplusplus < 201103L
+namespace std {
/// Returns a string representing the value \p val.
template <typename T>
-inline std::string to_string(T val)
+inline string to_string(T val)
{
- std::ostringstream oss;
+ ostringstream oss;
oss << val;
return oss.str();
}
+#define DEFINE_STD_TOSTRING_FLOATINGPOINT(T) \
+ template <> \
+ inline string to_string<T>(T val) \
+ { \
+ ostringstream oss; \
+ oss << std::fixed \
+ << std::setprecision(6) \
+ << val; \
+ return oss.str(); \
+ }
+DEFINE_STD_TOSTRING_FLOATINGPOINT(float)
+DEFINE_STD_TOSTRING_FLOATINGPOINT(double)
+DEFINE_STD_TOSTRING_FLOATINGPOINT(long double)
+
+#undef DEFINE_STD_TOSTRING_FLOATINGPOINT
+
+/// Returns a wide string representing the value \p val
+template <typename T>
+inline wstring to_wstring(T val)
+{
+ return utf8_to_wide(to_string(val));
+}
+}
+#endif
/// Returns a string representing the decimal value of the 32-bit value \p i.
-inline std::string itos(s32 i) { return to_string(i); }
+inline std::string itos(s32 i) { return std::to_string(i); }
/// Returns a string representing the decimal value of the 64-bit value \p i.
-inline std::string i64tos(s64 i) { return to_string(i); }
+inline std::string i64tos(s64 i) { return std::to_string(i); }
+
+// std::to_string uses the '%.6f' conversion, which is inconsistent with
+// std::ostream::operator<<() and impractical too. ftos() uses the
+// more generic and std::ostream::operator<<()-compatible '%G' format.
/// Returns a string representing the decimal value of the float value \p f.
-inline std::string ftos(float f) { return to_string(f); }
+inline std::string ftos(float f)
+{
+ std::ostringstream oss;
+ oss << f;
+ return oss.str();
+}
/**
@@ -519,6 +555,38 @@ std::basic_string<T> unescape_enriched(const std::basic_string<T> &s)
return output;
}
+template <typename T>
+std::vector<std::basic_string<T> > split(const std::basic_string<T> &s, T delim)
+{
+ std::vector<std::basic_string<T> > tokens;
+
+ std::basic_string<T> current;
+ bool last_was_escape = false;
+ for (size_t i = 0; i < s.length(); i++) {
+ T si = s[i];
+ if (last_was_escape) {
+ current += '\\';
+ current += si;
+ last_was_escape = false;
+ } else {
+ if (si == delim) {
+ tokens.push_back(current);
+ current = std::basic_string<T>();
+ last_was_escape = false;
+ } else if (si == '\\') {
+ last_was_escape = true;
+ } else {
+ current += si;
+ last_was_escape = false;
+ }
+ }
+ }
+ //push last element
+ tokens.push_back(current);
+
+ return tokens;
+}
+
/**
* Checks that all characters in \p to_check are a decimal digits.
*
diff --git a/src/voxelalgorithms.cpp b/src/voxelalgorithms.cpp
index f067a221a..93cc33acc 100644
--- a/src/voxelalgorithms.cpp
+++ b/src/voxelalgorithms.cpp
@@ -19,6 +19,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "voxelalgorithms.h"
#include "nodedef.h"
+#include "mapblock.h"
+#include "map.h"
namespace voxalgo
{
@@ -153,5 +155,597 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a,
return SunlightPropagateResult(bottom_sunlight_valid);
}
+/*!
+ * A direction.
+ * 0=X+
+ * 1=Y+
+ * 2=Z+
+ * 3=Z-
+ * 4=Y-
+ * 5=X-
+ * 6=no direction
+ * Two directions are opposite only if their sum is 5.
+ */
+typedef u8 direction;
+/*!
+ * Relative node position.
+ * This represents a node's position in its map block.
+ * All coordinates must be between 0 and 15.
+ */
+typedef v3s16 relative_v3;
+/*!
+ * Position of a map block (block coordinates).
+ * One block_pos unit is as long as 16 node position units.
+ */
+typedef v3s16 mapblock_v3;
+
+//! Contains information about a node whose light is about to change.
+struct ChangingLight {
+ //! Relative position of the node in its map block.
+ relative_v3 rel_position;
+ //! Position of the node's block.
+ mapblock_v3 block_position;
+ //! Pointer to the node's block.
+ MapBlock *block;
+ /*!
+ * Direction from the node that caused this node's changing
+ * to this node.
+ */
+ direction source_direction;
+
+ ChangingLight() :
+ rel_position(),
+ block_position(),
+ block(NULL),
+ source_direction(6)
+ {}
+
+ ChangingLight(relative_v3 rel_pos, mapblock_v3 block_pos,
+ MapBlock *b, direction source_dir) :
+ rel_position(rel_pos),
+ block_position(block_pos),
+ block(b),
+ source_direction(source_dir)
+ {}
+};
+
+/*!
+ * A fast, priority queue-like container to contain ChangingLights.
+ * The ChangingLights are ordered by the given light levels.
+ * The brightest ChangingLight is returned first.
+ */
+struct LightQueue {
+ //! For each light level there is a vector.
+ std::vector<ChangingLight> lights[LIGHT_SUN + 1];
+ //! Light of the brightest ChangingLight in the queue.
+ u8 max_light;
+
+ /*!
+ * Creates a LightQueue.
+ * \param reserve for each light level that many slots are reserved.
+ */
+ LightQueue(size_t reserve)
+ {
+ max_light = LIGHT_SUN;
+ for (u8 i = 0; i <= LIGHT_SUN; i++) {
+ lights[i].reserve(reserve);
+ }
+ }
+
+ /*!
+ * Returns the next brightest ChangingLight and
+ * removes it from the queue.
+ * If there were no elements in the queue, the given parameters
+ * remain unmodified.
+ * \param light light level of the popped ChangingLight
+ * \param data the ChangingLight that was popped
+ * \returns true if there was a ChangingLight in the queue.
+ */
+ bool next(u8 &light, ChangingLight &data)
+ {
+ while (lights[max_light].empty()) {
+ if (max_light == 0) {
+ return false;
+ }
+ max_light--;
+ }
+ light = max_light;
+ data = lights[max_light].back();
+ lights[max_light].pop_back();
+ return true;
+ }
+
+ /*!
+ * Adds an element to the queue.
+ * The parameters are the same as in ChangingLight's constructor.
+ * \param light light level of the ChangingLight
+ */
+ inline void push(u8 light, const relative_v3 &rel_pos,
+ const mapblock_v3 &block_pos, MapBlock *block,
+ direction source_dir)
+ {
+ assert(light <= LIGHT_SUN);
+ lights[light].push_back(
+ ChangingLight(rel_pos, block_pos, block, source_dir));
+ }
+};
+
+/*!
+ * This type of light queue is for unlighting.
+ * A node can be pushed in it only if its raw light is zero.
+ * This prevents pushing nodes twice into this queue.
+ * The light of the pushed ChangingLight must be the
+ * light of the node before unlighting it.
+ */
+typedef LightQueue UnlightQueue;
+/*!
+ * This type of light queue is for spreading lights.
+ * While spreading lights, all the nodes in it must
+ * have the same light as the light level the ChangingLights
+ * were pushed into this queue with. This prevents unnecessary
+ * re-pushing of the nodes into the queue.
+ * If a node doesn't let light trough but emits light, it can be added
+ * too.
+ */
+typedef LightQueue ReLightQueue;
+
+/*!
+ * neighbor_dirs[i] points towards
+ * the direction i.
+ * See the definition of the type "direction"
+ */
+const static v3s16 neighbor_dirs[6] = {
+ v3s16(1, 0, 0), // right
+ v3s16(0, 1, 0), // top
+ v3s16(0, 0, 1), // back
+ v3s16(0, 0, -1), // front
+ v3s16(0, -1, 0), // bottom
+ v3s16(-1, 0, 0), // left
+};
+
+/*!
+ * Transforms the given map block offset by one node towards
+ * the specified direction.
+ * \param dir the direction of the transformation
+ * \param rel_pos the node's relative position in its map block
+ * \param block_pos position of the node's block
+ */
+bool step_rel_block_pos(direction dir, relative_v3 &rel_pos,
+ mapblock_v3 &block_pos)
+{
+ switch (dir) {
+ case 0:
+ if (rel_pos.X < MAP_BLOCKSIZE - 1) {
+ rel_pos.X++;
+ } else {
+ rel_pos.X = 0;
+ block_pos.X++;
+ return true;
+ }
+ break;
+ case 1:
+ if (rel_pos.Y < MAP_BLOCKSIZE - 1) {
+ rel_pos.Y++;
+ } else {
+ rel_pos.Y = 0;
+ block_pos.Y++;
+ return true;
+ }
+ break;
+ case 2:
+ if (rel_pos.Z < MAP_BLOCKSIZE - 1) {
+ rel_pos.Z++;
+ } else {
+ rel_pos.Z = 0;
+ block_pos.Z++;
+ return true;
+ }
+ break;
+ case 3:
+ if (rel_pos.Z > 0) {
+ rel_pos.Z--;
+ } else {
+ rel_pos.Z = MAP_BLOCKSIZE - 1;
+ block_pos.Z--;
+ return true;
+ }
+ break;
+ case 4:
+ if (rel_pos.Y > 0) {
+ rel_pos.Y--;
+ } else {
+ rel_pos.Y = MAP_BLOCKSIZE - 1;
+ block_pos.Y--;
+ return true;
+ }
+ break;
+ case 5:
+ if (rel_pos.X > 0) {
+ rel_pos.X--;
+ } else {
+ rel_pos.X = MAP_BLOCKSIZE - 1;
+ block_pos.X--;
+ return true;
+ }
+ break;
+ }
+ return false;
+}
+
+/*
+ * Removes all light that is potentially emitted by the specified
+ * light sources. These nodes will have zero light.
+ * Returns all nodes whose light became zero but should be re-lighted.
+ *
+ * \param bank the light bank in which the procedure operates
+ * \param from_nodes nodes whose light is removed
+ * \param light_sources nodes that should be re-lighted
+ * \param modified_blocks output, all modified map blocks are added to this
+ */
+void unspread_light(Map *map, INodeDefManager *nodemgr, LightBank bank,
+ UnlightQueue &from_nodes, ReLightQueue &light_sources,
+ std::map<v3s16, MapBlock*> &modified_blocks)
+{
+ // Stores data popped from from_nodes
+ u8 current_light;
+ ChangingLight current;
+ // Data of the current neighbor
+ mapblock_v3 neighbor_block_pos;
+ relative_v3 neighbor_rel_pos;
+ // A dummy boolean
+ bool is_valid_position;
+ // Direction of the brightest neighbor of the node
+ direction source_dir;
+ while (from_nodes.next(current_light, current)) {
+ // For all nodes that need unlighting
+
+ // There is no brightest neighbor
+ source_dir = 6;
+ // The current node
+ const MapNode &node = current.block->getNodeNoCheck(
+ current.rel_position, &is_valid_position);
+ const ContentFeatures &f = nodemgr->get(node);
+ // If the node emits light, it behaves like it had a
+ // brighter neighbor.
+ u8 brightest_neighbor_light = f.light_source + 1;
+ for (direction i = 0; i < 6; i++) {
+ //For each neighbor
+
+ // The node that changed this node has already zero light
+ // and it can't give light to this node
+ if (current.source_direction + i == 5) {
+ continue;
+ }
+ // Get the neighbor's position and block
+ neighbor_rel_pos = current.rel_position;
+ neighbor_block_pos = current.block_position;
+ MapBlock *neighbor_block;
+ if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) {
+ neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos);
+ if (neighbor_block == NULL) {
+ continue;
+ }
+ } else {
+ neighbor_block = current.block;
+ }
+ // Get the neighbor itself
+ MapNode neighbor = neighbor_block->getNodeNoCheck(neighbor_rel_pos,
+ &is_valid_position);
+ const ContentFeatures &neighbor_f = nodemgr->get(
+ neighbor.getContent());
+ u8 neighbor_light = neighbor.getLightRaw(bank, neighbor_f);
+ // If the neighbor has at least as much light as this node, then
+ // it won't lose its light, since it should have been added to
+ // from_nodes earlier, so its light would be zero.
+ if (neighbor_f.light_propagates && neighbor_light < current_light) {
+ // Unlight, but only if the node has light.
+ if (neighbor_light > 0) {
+ neighbor.setLight(bank, 0, neighbor_f);
+ neighbor_block->setNodeNoCheck(neighbor_rel_pos, neighbor);
+ from_nodes.push(neighbor_light, neighbor_rel_pos,
+ neighbor_block_pos, neighbor_block, i);
+ // The current node was modified earlier, so its block
+ // is in modified_blocks.
+ if (current.block != neighbor_block) {
+ modified_blocks[neighbor_block_pos] = neighbor_block;
+ }
+ }
+ } else {
+ // The neighbor can light up this node.
+ if (neighbor_light < neighbor_f.light_source) {
+ neighbor_light = neighbor_f.light_source;
+ }
+ if (brightest_neighbor_light < neighbor_light) {
+ brightest_neighbor_light = neighbor_light;
+ source_dir = i;
+ }
+ }
+ }
+ // If the brightest neighbor is able to light up this node,
+ // then add this node to the output nodes.
+ if (brightest_neighbor_light > 1 && f.light_propagates) {
+ brightest_neighbor_light--;
+ light_sources.push(brightest_neighbor_light, current.rel_position,
+ current.block_position, current.block,
+ (source_dir == 6) ? 6 : 5 - source_dir
+ /* with opposite direction*/);
+ }
+ }
+}
+
+/*
+ * Spreads light from the specified starting nodes.
+ *
+ * Before calling this procedure, make sure that all ChangingLights
+ * in light_sources have as much light on the map as they have in
+ * light_sources (if the queue contains a node multiple times, the brightest
+ * occurrence counts).
+ *
+ * \param bank the light bank in which the procedure operates
+ * \param light_sources starting nodes
+ * \param modified_blocks output, all modified map blocks are added to this
+ */
+void spread_light(Map *map, INodeDefManager *nodemgr, LightBank bank,
+ LightQueue &light_sources, std::map<v3s16, MapBlock*> &modified_blocks)
+{
+ // The light the current node can provide to its neighbors.
+ u8 spreading_light;
+ // The ChangingLight for the current node.
+ ChangingLight current;
+ // Position of the current neighbor.
+ mapblock_v3 neighbor_block_pos;
+ relative_v3 neighbor_rel_pos;
+ // A dummy boolean.
+ bool is_valid_position;
+ while (light_sources.next(spreading_light, current)) {
+ spreading_light--;
+ for (direction i = 0; i < 6; i++) {
+ // This node can't light up its light source
+ if (current.source_direction + i == 5) {
+ continue;
+ }
+ // Get the neighbor's position and block
+ neighbor_rel_pos = current.rel_position;
+ neighbor_block_pos = current.block_position;
+ MapBlock *neighbor_block;
+ if (step_rel_block_pos(i, neighbor_rel_pos, neighbor_block_pos)) {
+ neighbor_block = map->getBlockNoCreateNoEx(neighbor_block_pos);
+ if (neighbor_block == NULL) {
+ continue;
+ }
+ } else {
+ neighbor_block = current.block;
+ }
+ // Get the neighbor itself
+ MapNode neighbor = neighbor_block->getNodeNoCheck(neighbor_rel_pos,
+ &is_valid_position);
+ const ContentFeatures &f = nodemgr->get(neighbor.getContent());
+ if (f.light_propagates) {
+ // Light up the neighbor, if it has less light than it should.
+ u8 neighbor_light = neighbor.getLightRaw(bank, f);
+ if (neighbor_light < spreading_light) {
+ neighbor.setLight(bank, spreading_light, f);
+ neighbor_block->setNodeNoCheck(neighbor_rel_pos, neighbor);
+ light_sources.push(spreading_light, neighbor_rel_pos,
+ neighbor_block_pos, neighbor_block, i);
+ // The current node was modified earlier, so its block
+ // is in modified_blocks.
+ if (current.block != neighbor_block) {
+ modified_blocks[neighbor_block_pos] = neighbor_block;
+ }
+ }
+ }
+ }
+ }
+}
+
+/*!
+ * Returns true if the node gets sunlight from the
+ * node above it.
+ *
+ * \param pos position of the node.
+ */
+bool is_sunlight_above(Map *map, v3s16 pos, INodeDefManager *ndef)
+{
+ bool sunlight = true;
+ mapblock_v3 source_block_pos;
+ relative_v3 source_rel_pos;
+ getNodeBlockPosWithOffset(pos + v3s16(0, 1, 0), source_block_pos,
+ source_rel_pos);
+ // If the node above has sunlight, this node also can get it.
+ MapBlock *source_block = map->getBlockNoCreateNoEx(source_block_pos);
+ if (source_block == NULL) {
+ // But if there is no node above, then use heuristics
+ MapBlock *node_block = map->getBlockNoCreateNoEx(getNodeBlockPos(pos));
+ if (node_block == NULL) {
+ sunlight = false;
+ } else {
+ sunlight = !node_block->getIsUnderground();
+ }
+ } else {
+ bool is_valid_position;
+ MapNode above = source_block->getNodeNoCheck(source_rel_pos,
+ &is_valid_position);
+ if (is_valid_position) {
+ if (above.getContent() == CONTENT_IGNORE) {
+ // Trust heuristics
+ if (source_block->getIsUnderground()) {
+ sunlight = false;
+ }
+ } else if (above.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN) {
+ // If the node above doesn't have sunlight, this
+ // node is in shadow.
+ sunlight = false;
+ }
+ }
+ }
+ return sunlight;
+}
+
+static const LightBank banks[] = { LIGHTBANK_DAY, LIGHTBANK_NIGHT };
+
+void update_lighting_nodes(Map *map, INodeDefManager *ndef,
+ std::vector<std::pair<v3s16, MapNode> > &oldnodes,
+ std::map<v3s16, MapBlock*> &modified_blocks)
+{
+ // For node getter functions
+ bool is_valid_position;
+
+ // Process each light bank separately
+ for (s32 i = 0; i < 2; i++) {
+ LightBank bank = banks[i];
+ UnlightQueue disappearing_lights(256);
+ ReLightQueue light_sources(256);
+ // For each changed node process sunlight and initialize
+ for (std::vector<std::pair<v3s16, MapNode> >::iterator it =
+ oldnodes.begin(); it < oldnodes.end(); ++it) {
+ // Get position and block of the changed node
+ v3s16 p = it->first;
+ relative_v3 rel_pos;
+ mapblock_v3 block_pos;
+ getNodeBlockPosWithOffset(p, block_pos, rel_pos);
+ MapBlock *block = map->getBlockNoCreateNoEx(block_pos);
+ if (block == NULL || block->isDummy()) {
+ continue;
+ }
+ // Get the new node
+ MapNode n = block->getNodeNoCheck(rel_pos, &is_valid_position);
+ if (!is_valid_position) {
+ break;
+ }
+
+ // Light of the old node
+ u8 old_light = it->second.getLight(bank, ndef);
+
+ // Add the block of the added node to modified_blocks
+ modified_blocks[block_pos] = block;
+
+ // Get new light level of the node
+ u8 new_light = 0;
+ if (ndef->get(n).light_propagates) {
+ if (bank == LIGHTBANK_DAY && ndef->get(n).sunlight_propagates
+ && is_sunlight_above(map, p, ndef)) {
+ new_light = LIGHT_SUN;
+ } else {
+ new_light = ndef->get(n).light_source;
+ for (int i = 0; i < 6; i++) {
+ v3s16 p2 = p + neighbor_dirs[i];
+ bool is_valid;
+ MapNode n2 = map->getNodeNoEx(p2, &is_valid);
+ if (is_valid) {
+ u8 spread = n2.getLight(bank, ndef);
+ // If the neighbor is at least as bright as
+ // this node then its light is not from
+ // this node.
+ // Its light can spread to this node.
+ if (spread > new_light && spread >= old_light) {
+ new_light = spread - 1;
+ }
+ }
+ }
+ }
+ } else {
+ // If this is an opaque node, it still can emit light.
+ new_light = ndef->get(n).light_source;
+ }
+
+ if (new_light > 0) {
+ light_sources.push(new_light, rel_pos, block_pos, block, 6);
+ }
+
+ if (new_light < old_light) {
+ // The node became opaque or doesn't provide as much
+ // light as the previous one, so it must be unlighted.
+
+ // Add to unlight queue
+ n.setLight(bank, 0, ndef);
+ block->setNodeNoCheck(rel_pos, n);
+ disappearing_lights.push(old_light, rel_pos, block_pos, block,
+ 6);
+
+ // Remove sunlight, if there was any
+ if (bank == LIGHTBANK_DAY && old_light == LIGHT_SUN) {
+ for (s16 y = p.Y - 1;; y--) {
+ v3s16 n2pos(p.X, y, p.Z);
+
+ MapNode n2;
+
+ n2 = map->getNodeNoEx(n2pos, &is_valid_position);
+ if (!is_valid_position)
+ break;
+
+ // If this node doesn't have sunlight, the nodes below
+ // it don't have too.
+ if (n2.getLight(LIGHTBANK_DAY, ndef) != LIGHT_SUN) {
+ break;
+ }
+ // Remove sunlight and add to unlight queue.
+ n2.setLight(LIGHTBANK_DAY, 0, ndef);
+ map->setNode(n2pos, n2);
+ relative_v3 rel_pos2;
+ mapblock_v3 block_pos2;
+ getNodeBlockPosWithOffset(n2pos, block_pos2, rel_pos2);
+ MapBlock *block2 = map->getBlockNoCreateNoEx(
+ block_pos2);
+ disappearing_lights.push(LIGHT_SUN, rel_pos2,
+ block_pos2, block2,
+ 4 /* The node above caused the change */);
+ }
+ }
+ } else if (new_light > old_light) {
+ // It is sure that the node provides more light than the previous
+ // one, unlighting is not necessary.
+ // Propagate sunlight
+ if (bank == LIGHTBANK_DAY && new_light == LIGHT_SUN) {
+ for (s16 y = p.Y - 1;; y--) {
+ v3s16 n2pos(p.X, y, p.Z);
+
+ MapNode n2;
+
+ n2 = map->getNodeNoEx(n2pos, &is_valid_position);
+ if (!is_valid_position)
+ break;
+
+ // This should not happen, but if the node has sunlight
+ // then the iteration should stop.
+ if (n2.getLight(LIGHTBANK_DAY, ndef) == LIGHT_SUN) {
+ break;
+ }
+ // If the node terminates sunlight, stop.
+ if (!ndef->get(n2).sunlight_propagates) {
+ break;
+ }
+ relative_v3 rel_pos2;
+ mapblock_v3 block_pos2;
+ getNodeBlockPosWithOffset(n2pos, block_pos2, rel_pos2);
+ MapBlock *block2 = map->getBlockNoCreateNoEx(
+ block_pos2);
+ // Mark node for lighting.
+ light_sources.push(LIGHT_SUN, rel_pos2, block_pos2,
+ block2, 4);
+ }
+ }
+ }
+
+ }
+ // Remove lights
+ unspread_light(map, ndef, bank, disappearing_lights, light_sources,
+ modified_blocks);
+ // Initialize light values for light spreading.
+ for (u8 i = 0; i <= LIGHT_SUN; i++) {
+ const std::vector<ChangingLight> &lights = light_sources.lights[i];
+ for (std::vector<ChangingLight>::const_iterator it = lights.begin();
+ it < lights.end(); it++) {
+ MapNode n = it->block->getNodeNoCheck(it->rel_position,
+ &is_valid_position);
+ n.setLight(bank, i, ndef);
+ it->block->setNodeNoCheck(it->rel_position, n);
+ }
+ }
+ // Spread lights.
+ spread_light(map, ndef, bank, light_sources, modified_blocks);
+ }
+}
+
} // namespace voxalgo
diff --git a/src/voxelalgorithms.h b/src/voxelalgorithms.h
index 2eba6a176..3632546dd 100644
--- a/src/voxelalgorithms.h
+++ b/src/voxelalgorithms.h
@@ -25,6 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <set>
#include <map>
+class Map;
+class MapBlock;
+
namespace voxalgo
{
@@ -52,6 +55,24 @@ SunlightPropagateResult propagateSunlight(VoxelManipulator &v, VoxelArea a,
std::set<v3s16> & light_sources,
INodeDefManager *ndef);
+/*!
+ * Updates the lighting on the map.
+ * The result will be correct only if
+ * no nodes were changed except the given ones.
+ * Before calling this procedure make sure that all new nodes on
+ * the map have zero light level!
+ *
+ * \param oldnodes contains the MapNodes that were replaced by the new
+ * MapNodes and their positions
+ * \param modified_blocks output, contains all map blocks that
+ * the function modified
+ */
+void update_lighting_nodes(
+ Map *map,
+ INodeDefManager *ndef,
+ std::vector<std::pair<v3s16, MapNode> > &oldnodes,
+ std::map<v3s16, MapBlock*> &modified_blocks);
+
} // namespace voxalgo
#endif
diff --git a/textures/base/pack/halo.png b/textures/base/pack/halo.png
index eaea782da..ed3ff9d8c 100644
--- a/textures/base/pack/halo.png
+++ b/textures/base/pack/halo.png
Binary files differ
diff --git a/textures/base/pack/no_screenshot.png b/textures/base/pack/no_screenshot.png
index fbaacc9b0..8c7089897 100644
--- a/textures/base/pack/no_screenshot.png
+++ b/textures/base/pack/no_screenshot.png
Binary files differ
diff --git a/textures/base/pack/smoke_puff.png b/textures/base/pack/smoke_puff.png
index 8824a731c..488b50fe9 100644
--- a/textures/base/pack/smoke_puff.png
+++ b/textures/base/pack/smoke_puff.png
Binary files differ
diff --git a/util/buildbot/buildwin32.sh b/util/buildbot/buildwin32.sh
index 78d189b87..e58c25ccc 100755
--- a/util/buildbot/buildwin32.sh
+++ b/util/buildbot/buildwin32.sh
@@ -13,15 +13,15 @@ packagedir=$builddir/packages
libdir=$builddir/libs
toolchain_file=$dir/toolchain_mingw.cmake
-irrlicht_version=1.8.1
-ogg_version=1.2.1
-vorbis_version=1.3.3
-curl_version=7.38.0
+irrlicht_version=1.8.4
+ogg_version=1.3.2
+vorbis_version=1.3.5
+curl_version=7.50.3
gettext_version=0.14.4
-freetype_version=2.3.5
-sqlite3_version=3.8.7.4
-luajit_version=2.0.1
-leveldb_version=1.15
+freetype_version=2.7
+sqlite3_version=3.14.2
+luajit_version=2.1.0-beta2
+leveldb_version=1.18
zlib_version=1.2.8
mkdir -p $packagedir
@@ -34,44 +34,38 @@ cd $builddir
-c -O $packagedir/irrlicht-$irrlicht_version.zip
[ -e $packagedir/zlib-$zlib_version.zip ] || wget http://minetest.kitsunemimi.pw/zlib-$zlib_version-win32.zip \
-c -O $packagedir/zlib-$zlib_version.zip
-[ -e $packagedir/libogg-$ogg_version-dev.7z ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-dev.7z \
- -c -O $packagedir/libogg-$ogg_version-dev.7z
-[ -e $packagedir/libogg-$ogg_version-dll.7z ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-dll.7z \
- -c -O $packagedir/libogg-$ogg_version-dll.7z
-[ -e $packagedir/libvorbis-$vorbis_version-dev.7z ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-dev.7z \
- -c -O $packagedir/libvorbis-$vorbis_version-dev.7z
-[ -e $packagedir/libvorbis-$vorbis_version-dll.7z ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-dll.7z \
- -c -O $packagedir/libvorbis-$vorbis_version-dll.7z
-[ -e $packagedir/libcurl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/libcurl-$curl_version-win32.zip \
- -c -O $packagedir/libcurl-$curl_version.zip
+[ -e $packagedir/libogg-$ogg_version.zip ] || wget http://minetest.kitsunemimi.pw/libogg-$ogg_version-win32.zip \
+ -c -O $packagedir/libogg-$ogg_version.zip
+[ -e $packagedir/libvorbis-$vorbis_version.zip ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-win32.zip \
+ -c -O $packagedir/libvorbis-$vorbis_version.zip
+[ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win32.zip \
+ -c -O $packagedir/curl-$curl_version.zip
[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version.zip \
-c -O $packagedir/gettext-$gettext_version.zip
-[ -e $packagedir/libfreetype-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/libfreetype-$freetype_version-win32.zip \
- -c -O $packagedir/libfreetype-$freetype_version.zip
+[ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win32.zip \
+ -c -O $packagedir/freetype2-$freetype_version.zip
[ -e $packagedir/sqlite3-$sqlite3_version.zip ] || wget http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win32.zip \
-c -O $packagedir/sqlite3-$sqlite3_version.zip
-[ -e $packagedir/luajit-$luajit_version-static-win32.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-static-win32.zip \
- -c -O $packagedir/luajit-$luajit_version-static-win32.zip
-[ -e $packagedir/libleveldb-$leveldb_version-win32.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win32.zip \
- -c -O $packagedir/libleveldb-$leveldb_version-win32.zip
+[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-win32.zip \
+ -c -O $packagedir/luajit-$luajit_version.zip
+[ -e $packagedir/libleveldb-$leveldb_version.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win32.zip \
+ -c -O $packagedir/libleveldb-$leveldb_version.zip
[ -e $packagedir/openal_stripped.zip ] || wget http://minetest.kitsunemimi.pw/openal_stripped.zip \
-c -O $packagedir/openal_stripped.zip
# Extract stuff
cd $libdir
-[ -d irrlicht-$irrlicht_version ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip
+[ -d irrlicht ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip -d irrlicht
[ -d zlib ] || unzip -o $packagedir/zlib-$zlib_version.zip -d zlib
-[ -d libogg/include ] || 7z x -y -olibogg $packagedir/libogg-$ogg_version-dev.7z
-[ -d libogg/bin ] || 7z x -y -olibogg $packagedir/libogg-$ogg_version-dll.7z
-[ -d libvorbis/include ] || 7z x -y -olibvorbis $packagedir/libvorbis-$vorbis_version-dev.7z
-[ -d libvorbis/bin ] || 7z x -y -olibvorbis $packagedir/libvorbis-$vorbis_version-dll.7z
-[ -d libcurl ] || unzip -o $packagedir/libcurl-$curl_version.zip -d libcurl
+[ -d libogg ] || unzip -o $packagedir/libogg-$ogg_version.zip -d libogg
+[ -d libvorbis ] || unzip -o $packagedir/libvorbis-$vorbis_version.zip -d libvorbis
+[ -d libcurl ] || unzip -o $packagedir/curl-$curl_version.zip -d libcurl
[ -d gettext ] || unzip -o $packagedir/gettext-$gettext_version.zip -d gettext
-[ -d freetype ] || unzip -o $packagedir/libfreetype-$freetype_version.zip -d freetype
+[ -d freetype ] || unzip -o $packagedir/freetype2-$freetype_version.zip -d freetype
[ -d sqlite3 ] || unzip -o $packagedir/sqlite3-$sqlite3_version.zip -d sqlite3
[ -d openal_stripped ] || unzip -o $packagedir/openal_stripped.zip
-[ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version-static-win32.zip -d luajit
-[ -d leveldb ] || unzip -o $packagedir/libleveldb-$leveldb_version-win32.zip -d leveldb
+[ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version.zip -d luajit
+[ -d leveldb ] || unzip -o $packagedir/libleveldb-$leveldb_version.zip -d leveldb
# Get minetest
cd $builddir
@@ -81,7 +75,7 @@ else
[ -d minetest ] && (cd minetest && git pull) || (git clone https://github.com/minetest/minetest)
fi
cd minetest
-git_hash=`git show | head -c14 | tail -c7`
+git_hash=$(git rev-parse --short HEAD)
# Get minetest_game
cd games
@@ -107,14 +101,13 @@ cmake .. \
-DENABLE_FREETYPE=1 \
-DENABLE_LEVELDB=1 \
\
- -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht-$irrlicht_version/include \
- -DIRRLICHT_LIBRARY=$libdir/irrlicht-$irrlicht_version/lib/Win32-gcc/libIrrlicht.dll.a \
- -DIRRLICHT_DLL=$libdir/irrlicht-$irrlicht_version/bin/Win32-gcc/Irrlicht.dll \
+ -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include \
+ -DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/Win32-gcc/libIrrlicht.dll.a \
+ -DIRRLICHT_DLL=$libdir/irrlicht/bin/Win32-gcc/Irrlicht.dll \
\
-DZLIB_INCLUDE_DIR=$libdir/zlib/include \
- -DZLIB_LIBRARIES=$libdir/zlib/lib/zlibwapi.dll.a \
+ -DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \
-DZLIB_DLL=$libdir/zlib/bin/zlib1.dll \
- -DZLIBWAPI_DLL=$libdir/zlib/bin/zlibwapi.dll \
\
-DLUA_INCLUDE_DIR=$libdir/luajit/include \
-DLUA_LIBRARY=$libdir/luajit/libluajit.a \
@@ -145,9 +138,9 @@ cmake .. \
-DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \
\
-DFREETYPE_INCLUDE_DIR_freetype2=$libdir/freetype/include/freetype2 \
- -DFREETYPE_INCLUDE_DIR_ft2build=$libdir/freetype/include \
+ -DFREETYPE_INCLUDE_DIR_ft2build=$libdir/freetype/include/freetype2 \
-DFREETYPE_LIBRARY=$libdir/freetype/lib/libfreetype.dll.a \
- -DFREETYPE_DLL=$libdir/freetype/bin/freetype6.dll \
+ -DFREETYPE_DLL=$libdir/freetype/bin/libfreetype-6.dll \
\
-DSQLITE3_INCLUDE_DIR=$libdir/sqlite3/include \
-DSQLITE3_LIBRARY=$libdir/sqlite3/lib/libsqlite3.dll.a \
diff --git a/util/buildbot/buildwin64.sh b/util/buildbot/buildwin64.sh
index e13cbd024..1c31fe4bd 100755
--- a/util/buildbot/buildwin64.sh
+++ b/util/buildbot/buildwin64.sh
@@ -13,15 +13,15 @@ packagedir=$builddir/packages
libdir=$builddir/libs
toolchain_file=$dir/toolchain_mingw64.cmake
-irrlicht_version=1.8.1
-ogg_version=1.3.1
-vorbis_version=1.3.4
-curl_version=7.38.0
+irrlicht_version=1.8.4
+ogg_version=1.3.2
+vorbis_version=1.3.5
+curl_version=7.50.3
gettext_version=0.18.2
-freetype_version=2.5.3
-sqlite3_version=3.8.7.4
-luajit_version=2.0.3
-leveldb_version=1.15
+freetype_version=2.7
+sqlite3_version=3.14.2
+luajit_version=2.1.0-beta2
+leveldb_version=1.18
zlib_version=1.2.8
mkdir -p $packagedir
@@ -38,15 +38,15 @@ cd $builddir
-c -O $packagedir/libogg-$ogg_version.zip
[ -e $packagedir/libvorbis-$vorbis_version.zip ] || wget http://minetest.kitsunemimi.pw/libvorbis-$vorbis_version-win64.zip \
-c -O $packagedir/libvorbis-$vorbis_version.zip
-[ -e $packagedir/libcurl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/libcurl-$curl_version-win64.zip \
- -c -O $packagedir/libcurl-$curl_version.zip
+[ -e $packagedir/curl-$curl_version.zip ] || wget http://minetest.kitsunemimi.pw/curl-$curl_version-win64.zip \
+ -c -O $packagedir/curl-$curl_version.zip
[ -e $packagedir/gettext-$gettext_version.zip ] || wget http://minetest.kitsunemimi.pw/gettext-$gettext_version-win64.zip \
-c -O $packagedir/gettext-$gettext_version.zip
-[ -e $packagedir/freetype-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/libfreetype-$freetype_version-win64.zip \
- -c -O $packagedir/freetype-$freetype_version.zip
+[ -e $packagedir/freetype2-$freetype_version.zip ] || wget http://minetest.kitsunemimi.pw/freetype2-$freetype_version-win64.zip \
+ -c -O $packagedir/freetype2-$freetype_version.zip
[ -e $packagedir/sqlite3-$sqlite3_version.zip ] || wget http://minetest.kitsunemimi.pw/sqlite3-$sqlite3_version-win64.zip \
-c -O $packagedir/sqlite3-$sqlite3_version.zip
-[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-static-win64.zip \
+[ -e $packagedir/luajit-$luajit_version.zip ] || wget http://minetest.kitsunemimi.pw/luajit-$luajit_version-win64.zip \
-c -O $packagedir/luajit-$luajit_version.zip
[ -e $packagedir/libleveldb-$leveldb_version.zip ] || wget http://minetest.kitsunemimi.pw/libleveldb-$leveldb_version-win64.zip \
-c -O $packagedir/libleveldb-$leveldb_version.zip
@@ -56,13 +56,13 @@ cd $builddir
# Extract stuff
cd $libdir
-[ -d irrlicht-$irrlicht_version ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip
+[ -d irrlicht ] || unzip -o $packagedir/irrlicht-$irrlicht_version.zip -d irrlicht
[ -d zlib ] || unzip -o $packagedir/zlib-$zlib_version.zip -d zlib
[ -d libogg ] || unzip -o $packagedir/libogg-$ogg_version.zip -d libogg
[ -d libvorbis ] || unzip -o $packagedir/libvorbis-$vorbis_version.zip -d libvorbis
-[ -d libcurl ] || unzip -o $packagedir/libcurl-$curl_version.zip -d libcurl
+[ -d libcurl ] || unzip -o $packagedir/curl-$curl_version.zip -d libcurl
[ -d gettext ] || unzip -o $packagedir/gettext-$gettext_version.zip -d gettext
-[ -d freetype ] || unzip -o $packagedir/freetype-$freetype_version.zip -d freetype
+[ -d freetype ] || unzip -o $packagedir/freetype2-$freetype_version.zip -d freetype
[ -d sqlite3 ] || unzip -o $packagedir/sqlite3-$sqlite3_version.zip -d sqlite3
[ -d openal_stripped ] || unzip -o $packagedir/openal_stripped.zip
[ -d luajit ] || unzip -o $packagedir/luajit-$luajit_version.zip -d luajit
@@ -76,7 +76,7 @@ else
[ -d minetest ] && (cd minetest && git pull) || (git clone https://github.com/minetest/minetest)
fi
cd minetest
-git_hash=`git show | head -c14 | tail -c7`
+git_hash=$(git rev-parse --short HEAD)
# Get minetest_game
cd games
@@ -102,9 +102,9 @@ cmake .. \
-DENABLE_FREETYPE=1 \
-DENABLE_LEVELDB=1 \
\
- -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht-$irrlicht_version/include \
- -DIRRLICHT_LIBRARY=$libdir/irrlicht-$irrlicht_version/lib/Win64-gcc/libIrrlicht.dll.a \
- -DIRRLICHT_DLL=$libdir/irrlicht-$irrlicht_version/bin/Win64-gcc/Irrlicht.dll \
+ -DIRRLICHT_INCLUDE_DIR=$libdir/irrlicht/include \
+ -DIRRLICHT_LIBRARY=$libdir/irrlicht/lib/Win64-gcc/libIrrlicht.dll.a \
+ -DIRRLICHT_DLL=$libdir/irrlicht/bin/Win64-gcc/Irrlicht.dll \
\
-DZLIB_INCLUDE_DIR=$libdir/zlib/include \
-DZLIB_LIBRARIES=$libdir/zlib/lib/libz.dll.a \
@@ -131,6 +131,13 @@ cmake .. \
-DCURL_INCLUDE_DIR=$libdir/libcurl/include \
-DCURL_LIBRARY=$libdir/libcurl/lib/libcurl.dll.a \
\
+ -DCUSTOM_GETTEXT_PATH=$libdir/gettext \
+ -DGETTEXT_MSGFMT=`which msgfmt` \
+ -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \
+ -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \
+ -DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \
+ -DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a \
+ \
-DFREETYPE_INCLUDE_DIR_freetype2=$libdir/freetype/include/freetype2 \
-DFREETYPE_INCLUDE_DIR_ft2build=$libdir/freetype/include/freetype2 \
-DFREETYPE_LIBRARY=$libdir/freetype/lib/libfreetype.dll.a \
@@ -142,14 +149,7 @@ cmake .. \
\
-DLEVELDB_INCLUDE_DIR=$libdir/leveldb/include \
-DLEVELDB_LIBRARY=$libdir/leveldb/lib/libleveldb.dll.a \
- -DLEVELDB_DLL=$libdir/leveldb/bin/libleveldb.dll \
- \
- -DCUSTOM_GETTEXT_PATH=$libdir/gettext \
- -DGETTEXT_MSGFMT=`which msgfmt` \
- -DGETTEXT_DLL=$libdir/gettext/bin/libintl-8.dll \
- -DGETTEXT_ICONV_DLL=$libdir/gettext/bin/libiconv-2.dll \
- -DGETTEXT_INCLUDE_DIR=$libdir/gettext/include \
- -DGETTEXT_LIBRARY=$libdir/gettext/lib/libintl.dll.a
+ -DLEVELDB_DLL=$libdir/leveldb/bin/libleveldb.dll
make package -j2
diff --git a/util/travis/before_install.sh b/util/travis/before_install.sh
index 58dc42b17..891371984 100755
--- a/util/travis/before_install.sh
+++ b/util/travis/before_install.sh
@@ -1,29 +1,27 @@
#!/bin/bash -e
+echo "Preparing for $TRAVIS_COMMIT_RANGE"
+. util/travis/common.sh
+
+needs_compile || exit 0
if [[ $TRAVIS_OS_NAME == "linux" ]]; then
- if [[ $CC == "clang" ]]; then
- export PATH="/usr/bin/:$PATH"
- sudo sh -c 'echo "deb http://ppa.launchpad.net/eudoxos/llvm-3.1/ubuntu precise main" >> /etc/apt/sources.list'
- sudo apt-key adv --keyserver pool.sks-keyservers.net --recv-keys 92DE8183
- sudo apt-get update
- sudo apt-get install llvm-3.1
- sudo apt-get install clang
- fi
sudo apt-get update
- sudo apt-get install p7zip-full
+ sudo apt-get install p7zip-full $COMPILER
fi
if [[ $PLATFORM == "Unix" ]]; then
if [[ $TRAVIS_OS_NAME == "linux" ]]; then
sudo apt-get install libirrlicht-dev cmake libbz2-dev libpng12-dev \
libjpeg-dev libxxf86vm-dev libgl1-mesa-dev libsqlite3-dev \
- libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev gettext
+ libhiredis-dev libogg-dev libgmp-dev libvorbis-dev libopenal-dev \
+ gettext libpq-dev postgresql-server-dev-all
# Linking to LevelDB is broken, use a custom build
wget http://minetest.kitsunemimi.pw/libleveldb-1.18-ubuntu12.04.7z
sudo 7z x -o/usr libleveldb-1.18-ubuntu12.04.7z
else
brew update
brew install freetype gettext hiredis irrlicht jpeg leveldb libogg libvorbis luajit
+ #brew upgrade postgresql
fi
elif [[ $PLATFORM == "Win32" ]]; then
wget http://minetest.kitsunemimi.pw/mingw_w64_i686_ubuntu12.04_4.9.1.7z -O mingw.7z
diff --git a/util/travis/common.sh b/util/travis/common.sh
new file mode 100644
index 000000000..16c7db324
--- /dev/null
+++ b/util/travis/common.sh
@@ -0,0 +1,8 @@
+#!/bin/bash -e
+
+# Relative to git-repository root:
+TRIGGER_COMPILE_PATHS="src/|CMakeLists.txt|cmake/Modules/|util/travis/|util/buildbot/"
+
+needs_compile() {
+ git diff --name-only $TRAVIS_COMMIT_RANGE | egrep -q "^($TRIGGER_COMPILE_PATHS)"
+}
diff --git a/util/travis/script.sh b/util/travis/script.sh
index 870954ebb..1bafb26cd 100755
--- a/util/travis/script.sh
+++ b/util/travis/script.sh
@@ -1,9 +1,16 @@
#!/bin/bash -e
+. util/travis/common.sh
+
+needs_compile || exit 0
if [[ $PLATFORM == "Unix" ]]; then
mkdir -p travisbuild
cd travisbuild || exit 1
CMAKE_FLAGS=''
+ if [[ $COMPILER == "g++-6" ]]; then
+ export CC=gcc-6
+ export CXX=g++-6
+ fi
# Clang builds with FreeType fail on Travis
if [[ $CC == "clang" ]]; then
CMAKE_FLAGS+=' -DENABLE_FREETYPE=FALSE'