wsc-dfc
Elias Fleckenstein 2021-02-10 19:50:36 +01:00
commit 1fbbb76825
208 changed files with 30104 additions and 25315 deletions

View File

@ -1,5 +1,7 @@
cmake_minimum_required(VERSION 3.5) cmake_minimum_required(VERSION 3.5)
cmake_policy(SET CMP0025 OLD)
# This can be read from ${PROJECT_NAME} after project() is called # This can be read from ${PROJECT_NAME} after project() is called
project(minetest) project(minetest)
set(PROJECT_NAME_CAPITALIZED "Dragonfire") set(PROJECT_NAME_CAPITALIZED "Dragonfire")

View File

@ -31,10 +31,10 @@ Table of Contents
Further documentation Further documentation
---------------------- ----------------------
- Website: http://minetest.net/ - Website: https://minetest.net/
- Wiki: http://wiki.minetest.net/ - Wiki: https://wiki.minetest.net/
- Developer wiki: http://dev.minetest.net/ - Developer wiki: https://dev.minetest.net/
- Forum: http://forum.minetest.net/ - Forum: https://forum.minetest.net/
- GitHub: https://github.com/minetest/minetest/ - GitHub: https://github.com/minetest/minetest/
- [doc/](doc/) directory of source distribution - [doc/](doc/) directory of source distribution

View File

@ -1,8 +1,8 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 29 compileSdkVersion 29
buildToolsVersion '30.0.2' buildToolsVersion '30.0.3'
ndkVersion '21.3.6528147' ndkVersion '22.0.7026061'
defaultConfig { defaultConfig {
applicationId 'net.minetest.minetest' applicationId 'net.minetest.minetest'
minSdkVersion 16 minSdkVersion 16

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
project.ext.set("versionMajor", 5) // Version Major project.ext.set("versionMajor", 5) // Version Major
project.ext.set("versionMinor", 3) // Version Minor project.ext.set("versionMinor", 4) // Version Minor
project.ext.set("versionPatch", 0) // Version Patch project.ext.set("versionPatch", 0) // Version Patch
project.ext.set("versionExtra", "-dev") // Version Extra project.ext.set("versionExtra", "-dev") // Version Extra
project.ext.set("versionCode", 30) // Android Version Code project.ext.set("versionCode", 30) // Android Version Code
@ -15,7 +15,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.0.1' classpath 'com.android.tools.build:gradle:4.1.1'
classpath 'de.undercouch:gradle-download-task:4.1.1' classpath 'de.undercouch:gradle-download-task:4.1.1'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files

View File

@ -1,6 +1,6 @@
#Mon Sep 07 22:11:10 CEST 2020 #Fri Jan 08 17:52:00 UTC 2020
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip

View File

@ -3,8 +3,8 @@ apply plugin: 'de.undercouch.download'
android { android {
compileSdkVersion 29 compileSdkVersion 29
buildToolsVersion '30.0.2' buildToolsVersion '30.0.3'
ndkVersion '21.3.6528147' ndkVersion '22.0.7026061'
defaultConfig { defaultConfig {
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 29 targetSdkVersion 29
@ -71,7 +71,7 @@ task getDeps(dependsOn: downloadDeps, type: Copy) {
} }
// get sqlite // get sqlite
def sqlite_ver = '3320200' def sqlite_ver = '3340000'
task downloadSqlite(dependsOn: getDeps, type: Download) { task downloadSqlite(dependsOn: getDeps, type: Download) {
src 'https://www.sqlite.org/2020/sqlite-amalgamation-' + sqlite_ver + '.zip' src 'https://www.sqlite.org/2020/sqlite-amalgamation-' + sqlite_ver + '.zip'
dest new File(buildDir, 'sqlite.zip') dest new File(buildDir, 'sqlite.zip')

View File

@ -18,6 +18,8 @@
ui = {} ui = {}
ui.childlist = {} ui.childlist = {}
ui.default = nil ui.default = nil
-- Whether fstk is currently showing its own formspec instead of active ui elements.
ui.overridden = false
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
function ui.add(child) function ui.add(child)
@ -55,6 +57,7 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
function ui.update() function ui.update()
ui.overridden = false
local formspec = {} local formspec = {}
-- handle errors -- handle errors
@ -71,6 +74,7 @@ function ui.update()
"button[2,6.6;4,1;btn_reconnect_yes;" .. fgettext("Reconnect") .. "]", "button[2,6.6;4,1;btn_reconnect_yes;" .. fgettext("Reconnect") .. "]",
"button[8,6.6;4,1;btn_reconnect_no;" .. fgettext("Main menu") .. "]" "button[8,6.6;4,1;btn_reconnect_no;" .. fgettext("Main menu") .. "]"
} }
ui.overridden = true
elseif gamedata ~= nil and gamedata.errormessage ~= nil then elseif gamedata ~= nil and gamedata.errormessage ~= nil then
local error_message = core.formspec_escape(gamedata.errormessage) local error_message = core.formspec_escape(gamedata.errormessage)
@ -89,6 +93,7 @@ function ui.update()
error_title, error_message), error_title, error_message),
"button[5,6.6;4,1;btn_error_confirm;" .. fgettext("OK") .. "]" "button[5,6.6;4,1;btn_error_confirm;" .. fgettext("OK") .. "]"
} }
ui.overridden = true
else else
local active_toplevel_ui_elements = 0 local active_toplevel_ui_elements = 0
for key,value in pairs(ui.childlist) do for key,value in pairs(ui.childlist) do
@ -185,6 +190,16 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
core.event_handler = function(event) core.event_handler = function(event)
-- Handle error messages
if ui.overridden then
if event == "MenuQuit" then
gamedata.errormessage = nil
gamedata.reconnect_requested = false
ui.update()
end
return
end
if ui.handle_events(event) then if ui.handle_events(event) then
ui.update() ui.update()
return return

View File

@ -1,28 +1,5 @@
-- Minetest: builtin/deprecated.lua -- Minetest: builtin/deprecated.lua
--
-- Default material types
--
local function digprop_err()
core.log("deprecated", "The core.digprop_* functions are obsolete and need to be replaced by item groups.")
end
core.digprop_constanttime = digprop_err
core.digprop_stonelike = digprop_err
core.digprop_dirtlike = digprop_err
core.digprop_gravellike = digprop_err
core.digprop_woodlike = digprop_err
core.digprop_leaveslike = digprop_err
core.digprop_glasslike = digprop_err
function core.node_metadata_inventory_move_allow_all()
core.log("deprecated", "core.node_metadata_inventory_move_allow_all is obsolete and does nothing.")
end
function core.add_to_creative_inventory(itemstring)
core.log("deprecated", "core.add_to_creative_inventory is obsolete and does nothing.")
end
-- --
-- EnvRef -- EnvRef
-- --
@ -77,7 +54,7 @@ core.setting_save = setting_proxy("write")
function core.register_on_auth_fail(func) function core.register_on_auth_fail(func)
core.log("deprecated", "core.register_on_auth_fail " .. core.log("deprecated", "core.register_on_auth_fail " ..
"is obsolete and should be replaced by " .. "is deprecated and should be replaced by " ..
"core.register_on_authplayer instead.") "core.register_on_authplayer instead.")
core.register_on_authplayer(function (player_name, ip, is_success) core.register_on_authplayer(function (player_name, ip, is_success)

View File

@ -18,6 +18,7 @@ core.features = {
pathfinder_works = true, pathfinder_works = true,
object_step_has_moveresult = true, object_step_has_moveresult = true,
direct_velocity_on_players = true, direct_velocity_on_players = true,
use_texture_alpha_string_modes = true,
} }
function core.has_feature(arg) function core.has_feature(arg)

View File

@ -544,7 +544,7 @@ function core.node_dig(pos, node, digger)
log("info", diggername .. " tried to dig " log("info", diggername .. " tried to dig "
.. node.name .. " which is not diggable " .. node.name .. " which is not diggable "
.. core.pos_to_string(pos)) .. core.pos_to_string(pos))
return return false
end end
if core.is_protected(pos, diggername) then if core.is_protected(pos, diggername) then
@ -553,7 +553,7 @@ function core.node_dig(pos, node, digger)
.. " at protected position " .. " at protected position "
.. core.pos_to_string(pos)) .. core.pos_to_string(pos))
core.record_protection_violation(pos, diggername) core.record_protection_violation(pos, diggername)
return return false
end end
log('action', diggername .. " digs " log('action', diggername .. " digs "
@ -636,6 +636,8 @@ function core.node_dig(pos, node, digger)
local node_copy = {name=node.name, param1=node.param1, param2=node.param2} local node_copy = {name=node.name, param1=node.param1, param2=node.param2}
callback(pos_copy, node_copy, digger) callback(pos_copy, node_copy, digger)
end end
return true
end end
function core.itemstring_with_palette(item, palette_index) function core.itemstring_with_palette(item, palette_index)
@ -692,10 +694,6 @@ core.nodedef_default = {
on_receive_fields = nil, on_receive_fields = nil,
on_metadata_inventory_move = core.node_metadata_inventory_move_allow_all,
on_metadata_inventory_offer = core.node_metadata_inventory_offer_allow_all,
on_metadata_inventory_take = core.node_metadata_inventory_take_allow_all,
-- Node properties -- Node properties
drawtype = "normal", drawtype = "normal",
visual_scale = 1.0, visual_scale = 1.0,
@ -706,7 +704,6 @@ core.nodedef_default = {
-- {name="", backface_culling=true}, -- {name="", backface_culling=true},
-- {name="", backface_culling=true}, -- {name="", backface_culling=true},
--}, --},
alpha = 255,
post_effect_color = {a=0, r=0, g=0, b=0}, post_effect_color = {a=0, r=0, g=0, b=0},
paramtype = "none", paramtype = "none",
paramtype2 = "none", paramtype2 = "none",

View File

@ -266,3 +266,26 @@ end
function core.cancel_shutdown_requests() function core.cancel_shutdown_requests()
core.request_shutdown("", false, -1) core.request_shutdown("", false, -1)
end end
-- Callback handling for dynamic_add_media
local dynamic_add_media_raw = core.dynamic_add_media_raw
core.dynamic_add_media_raw = nil
function core.dynamic_add_media(filepath, callback)
local ret = dynamic_add_media_raw(filepath)
if ret == false then
return ret
end
if callback == nil then
core.log("deprecated", "Calling minetest.dynamic_add_media without "..
"a callback is deprecated and will stop working in future versions.")
else
-- At the moment async loading is not actually implemented, so we
-- immediately call the callback ourselves
for _, name in ipairs(ret) do
callback(name)
end
end
return true
end

View File

@ -324,13 +324,6 @@ for name in pairs(forbidden_item_names) do
register_alias_raw(name, "") register_alias_raw(name, "")
end end
-- Obsolete:
-- Aliases for core.register_alias (how ironic...)
-- core.alias_node = core.register_alias
-- core.alias_tool = core.register_alias
-- core.alias_craftitem = core.register_alias
-- --
-- Built-in node definitions. Also defined in C. -- Built-in node definitions. Also defined in C.
-- --
@ -617,6 +610,7 @@ core.registered_can_bypass_userlimit, core.register_can_bypass_userlimit = make_
core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration() core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration()
core.registered_on_player_inventory_actions, core.register_on_player_inventory_action = make_registration() core.registered_on_player_inventory_actions, core.register_on_player_inventory_action = make_registration()
core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration() core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration()
core.registered_on_rightclickplayers, core.register_on_rightclickplayer = make_registration()
-- --
-- Compatibility for on_mapgen_init() -- Compatibility for on_mapgen_init()

View File

@ -62,24 +62,6 @@ function image_column(tooltip, flagname)
"5=" .. core.formspec_escape(defaulttexturedir .. "server_ping_1.png") "5=" .. core.formspec_escape(defaulttexturedir .. "server_ping_1.png")
end end
--------------------------------------------------------------------------------
function order_favorite_list(list)
local res = {}
--orders the favorite list after support
for i = 1, #list do
local fav = list[i]
if is_server_protocol_compat(fav.proto_min, fav.proto_max) then
res[#res + 1] = fav
end
end
for i = 1, #list do
local fav = list[i]
if not is_server_protocol_compat(fav.proto_min, fav.proto_max) then
res[#res + 1] = fav
end
end
return res
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
function render_serverlist_row(spec, is_favorite) function render_serverlist_row(spec, is_favorite)
@ -164,35 +146,15 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
os.tempfolder = function() os.tempfolder = function()
if core.settings:get("TMPFolder") then local temp = core.get_temp_path()
return core.settings:get("TMPFolder") .. DIR_DELIM .. "MT_" .. math.random(0,10000) return temp .. DIR_DELIM .. "MT_" .. math.random(0, 10000)
end end
local filetocheck = os.tmpname() --------------------------------------------------------------------------------
os.remove(filetocheck) os.tmpname = function()
local path = os.tempfolder()
-- luacheck: ignore io.open(path, "w"):close()
-- https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1/ return path
-- The C runtime (CRT) function called by os.tmpname is tmpnam.
-- Microsofts tmpnam implementation in older CRT / MSVC releases is defective.
-- tmpnam return values starting with a backslash characterize this behavior.
-- https://sourceforge.net/p/mingw-w64/bugs/555/
-- MinGW tmpnam implementation is forwarded to the CRT directly.
-- https://sourceforge.net/p/mingw-w64/discussion/723797/thread/55520785/
-- MinGW links to an older CRT release (msvcrt.dll).
-- Due to legal concerns MinGW will never use a newer CRT.
--
-- Make use of TEMP to compose the temporary filename if an old
-- style tmpnam return value is detected.
if filetocheck:sub(1, 1) == "\\" then
local tempfolder = os.getenv("TEMP")
return tempfolder .. filetocheck
end
local randname = "MTTempModFolder_" .. math.random(0,10000)
local backstring = filetocheck:reverse()
return filetocheck:sub(0, filetocheck:len() - backstring:find(DIR_DELIM) + 1) ..
randname
end end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -226,41 +188,6 @@ function menu_handle_key_up_down(fields, textlist, settingname)
return false return false
end end
--------------------------------------------------------------------------------
function asyncOnlineFavourites()
if not menudata.public_known then
menudata.public_known = {{
name = fgettext("Loading..."),
description = fgettext_ne("Try reenabling public serverlist and check your internet connection.")
}}
end
menudata.favorites = menudata.public_known
menudata.favorites_is_public = true
if not menudata.public_downloading then
menudata.public_downloading = true
else
return
end
core.handle_async(
function(param)
return core.get_favorites("online")
end,
nil,
function(result)
menudata.public_downloading = nil
local favs = order_favorite_list(result)
if favs[1] then
menudata.public_known = favs
menudata.favorites = menudata.public_known
menudata.favorites_is_public = true
end
core.event_handler("Refresh")
end
)
end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transparency) function text2textlist(xpos, ypos, width, height, tl_name, textlen, text, transparency)
local textlines = core.wrap_text(text, textlen, true) local textlines = core.wrap_text(text, textlen, true)

View File

@ -23,7 +23,9 @@ if not minetest.get_http_api then
return return
end end
local store = { packages = {}, packages_full = {} } -- Unordered preserves the original order of the ContentDB API,
-- before the package list is ordered based on installed state.
local store = { packages = {}, packages_full = {}, packages_full_unordered = {} }
local http = minetest.get_http_api() local http = minetest.get_http_api()
@ -572,6 +574,7 @@ function store.load()
end end
end end
store.packages_full_unordered = store.packages_full
store.packages = store.packages_full store.packages = store.packages_full
store.loaded = true store.loaded = true
end end
@ -580,7 +583,7 @@ function store.update_paths()
local mod_hash = {} local mod_hash = {}
pkgmgr.refresh_globals() pkgmgr.refresh_globals()
for _, mod in pairs(pkgmgr.clientmods:get_list()) do for _, mod in pairs(pkgmgr.clientmods:get_list()) do
if mod.author then if mod.author and mod.release > 0 then
mod_hash[mod.author:lower() .. "/" .. mod.name] = mod mod_hash[mod.author:lower() .. "/" .. mod.name] = mod
end end
end end
@ -588,14 +591,14 @@ function store.update_paths()
local game_hash = {} local game_hash = {}
pkgmgr.update_gamelist() pkgmgr.update_gamelist()
for _, game in pairs(pkgmgr.games) do for _, game in pairs(pkgmgr.games) do
if game.author ~= "" then if game.author ~= "" and game.release > 0 then
game_hash[game.author:lower() .. "/" .. game.id] = game game_hash[game.author:lower() .. "/" .. game.id] = game
end end
end end
local txp_hash = {} local txp_hash = {}
for _, txp in pairs(pkgmgr.get_texture_packs()) do for _, txp in pairs(pkgmgr.get_texture_packs()) do
if txp.author then if txp.author and txp.release > 0 then
txp_hash[txp.author:lower() .. "/" .. txp.name] = txp txp_hash[txp.author:lower() .. "/" .. txp.name] = txp
end end
end end
@ -619,6 +622,33 @@ function store.update_paths()
end end
end end
function store.sort_packages()
local ret = {}
-- Add installed content
for i=1, #store.packages_full_unordered do
local package = store.packages_full_unordered[i]
if package.path then
ret[#ret + 1] = package
end
end
-- Sort installed content by title
table.sort(ret, function(a, b)
return a.title < b.title
end)
-- Add uninstalled content
for i=1, #store.packages_full_unordered do
local package = store.packages_full_unordered[i]
if not package.path then
ret[#ret + 1] = package
end
end
store.packages_full = ret
end
function store.filter_packages(query) function store.filter_packages(query)
if query == "" and filter_type == 1 then if query == "" and filter_type == 1 then
store.packages = store.packages_full store.packages = store.packages_full
@ -652,7 +682,6 @@ function store.filter_packages(query)
store.packages[#store.packages + 1] = package store.packages[#store.packages + 1] = package
end end
end end
end end
function store.get_formspec(dlgdata) function store.get_formspec(dlgdata)
@ -960,6 +989,9 @@ function create_store_dlg(type)
store.load() store.load()
end end
store.update_paths()
store.sort_packages()
search_string = "" search_string = ""
cur_page = 1 cur_page = 1

View File

@ -34,6 +34,7 @@ dofile(basepath .. "fstk" .. DIR_DELIM .. "ui.lua")
dofile(menupath .. DIR_DELIM .. "async_event.lua") dofile(menupath .. DIR_DELIM .. "async_event.lua")
dofile(menupath .. DIR_DELIM .. "common.lua") dofile(menupath .. DIR_DELIM .. "common.lua")
dofile(menupath .. DIR_DELIM .. "pkgmgr.lua") dofile(menupath .. DIR_DELIM .. "pkgmgr.lua")
dofile(menupath .. DIR_DELIM .. "serverlistmgr.lua")
dofile(menupath .. DIR_DELIM .. "textures.lua") dofile(menupath .. DIR_DELIM .. "textures.lua")
dofile(menupath .. DIR_DELIM .. "dlg_config_world.lua") dofile(menupath .. DIR_DELIM .. "dlg_config_world.lua")

View File

@ -72,6 +72,34 @@ local function cleanup_path(temppath)
return temppath return temppath
end end
local function load_texture_packs(txtpath, retval)
local list = core.get_dir_list(txtpath, true)
local current_texture_path = core.settings:get("texture_path")
for _, item in ipairs(list) do
if item ~= "base" then
local name = item
local path = txtpath .. DIR_DELIM .. item .. DIR_DELIM
if path == current_texture_path then
name = fgettext("$1 (Enabled)", name)
end
local conf = Settings(path .. "texture_pack.conf")
retval[#retval + 1] = {
name = item,
author = conf:get("author"),
release = tonumber(conf:get("release") or "0"),
list_name = name,
type = "txp",
path = path,
enabled = path == current_texture_path,
}
end
end
end
function get_mods(path,retval,modpack) function get_mods(path,retval,modpack)
local mods = core.get_dir_list(path, true) local mods = core.get_dir_list(path, true)
@ -112,7 +140,7 @@ function get_mods(path,retval,modpack)
toadd.type = "mod" toadd.type = "mod"
-- Check modpack.txt -- Check modpack.txt
-- Note: modpack.conf is already checked above -- Note: modpack.conf is already checked above
local modpackfile = io.open(prefix .. DIR_DELIM .. "modpack.txt") local modpackfile = io.open(prefix .. DIR_DELIM .. "modpack.txt")
if modpackfile then if modpackfile then
modpackfile:close() modpackfile:close()
@ -136,32 +164,13 @@ pkgmgr = {}
function pkgmgr.get_texture_packs() function pkgmgr.get_texture_packs()
local txtpath = core.get_texturepath() local txtpath = core.get_texturepath()
local list = core.get_dir_list(txtpath, true) local txtpath_system = core.get_texturepath_share()
local retval = {} local retval = {}
local current_texture_path = core.settings:get("texture_path") load_texture_packs(txtpath, retval)
-- on portable versions these two paths coincide. It avoids loading the path twice
for _, item in ipairs(list) do if txtpath ~= txtpath_system then
if item ~= "base" then load_texture_packs(txtpath_system, retval)
local name = item
local path = txtpath .. DIR_DELIM .. item .. DIR_DELIM
if path == current_texture_path then
name = fgettext("$1 (Enabled)", name)
end
local conf = Settings(path .. "texture_pack.conf")
retval[#retval + 1] = {
name = item,
author = conf:get("author"),
release = tonumber(conf:get("release") or "0"),
list_name = name,
type = "txp",
path = path,
enabled = path == current_texture_path,
}
end
end end
table.sort(retval, function(a, b) table.sort(retval, function(a, b)

View File

@ -0,0 +1,250 @@
--Minetest
--Copyright (C) 2020 rubenwardy
--
--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.
serverlistmgr = {}
--------------------------------------------------------------------------------
local function order_server_list(list)
local res = {}
--orders the favorite list after support
for i = 1, #list do
local fav = list[i]
if is_server_protocol_compat(fav.proto_min, fav.proto_max) then
res[#res + 1] = fav
end
end
for i = 1, #list do
local fav = list[i]
if not is_server_protocol_compat(fav.proto_min, fav.proto_max) then
res[#res + 1] = fav
end
end
return res
end
local public_downloading = false
--------------------------------------------------------------------------------
function serverlistmgr.sync()
if not serverlistmgr.servers then
serverlistmgr.servers = {{
name = fgettext("Loading..."),
description = fgettext_ne("Try reenabling public serverlist and check your internet connection.")
}}
end
local serverlist_url = core.settings:get("serverlist_url") or ""
if not core.get_http_api or serverlist_url == "" then
serverlistmgr.servers = {{
name = fgettext("Public server list is disabled"),
description = ""
}}
return
end
if public_downloading then
return
end
public_downloading = true
core.handle_async(
function(param)
local http = core.get_http_api()
local url = ("%s/list?proto_version_min=%d&proto_version_max=%d"):format(
core.settings:get("serverlist_url"),
core.get_min_supp_proto(),
core.get_max_supp_proto())
local response = http.fetch_sync({ url = url })
if not response.succeeded then
return {}
end
local retval = core.parse_json(response.data)
return retval and retval.list or {}
end,
nil,
function(result)
public_downloading = nil
local favs = order_server_list(result)
if favs[1] then
serverlistmgr.servers = favs
end
core.event_handler("Refresh")
end
)
end
--------------------------------------------------------------------------------
local function get_favorites_path()
local base = core.get_user_path() .. DIR_DELIM .. "client" .. DIR_DELIM .. "serverlist" .. DIR_DELIM
return base .. core.settings:get("serverlist_file")
end
--------------------------------------------------------------------------------
local function save_favorites(favorites)
local filename = core.settings:get("serverlist_file")
-- If setting specifies legacy format change the filename to the new one
if filename:sub(#filename - 3):lower() == ".txt" then
core.settings:set("serverlist_file", filename:sub(1, #filename - 4) .. ".json")
end
local path = get_favorites_path()
core.create_dir(path)
core.safe_file_write(path, core.write_json(favorites))
end
--------------------------------------------------------------------------------
function serverlistmgr.read_legacy_favorites(path)
local file = io.open(path, "r")
if not file then
return nil
end
local lines = {}
for line in file:lines() do
lines[#lines + 1] = line
end
file:close()
local favorites = {}
local i = 1
while i < #lines do
local function pop()
local line = lines[i]
i = i + 1
return line and line:trim()
end
if pop():lower() == "[server]" then
local name = pop()
local address = pop()
local port = tonumber(pop())
local description = pop()
if name == "" then
name = nil
end
if description == "" then
description = nil
end
if not address or #address < 3 then
core.log("warning", "Malformed favorites file, missing address at line " .. i)
elseif not port or port < 1 or port > 65535 then
core.log("warning", "Malformed favorites file, missing port at line " .. i)
elseif (name and name:upper() == "[SERVER]") or
(address and address:upper() == "[SERVER]") or
(description and description:upper() == "[SERVER]") then
core.log("warning", "Potentially malformed favorites file, overran at line " .. i)
else
favorites[#favorites + 1] = {
name = name,
address = address,
port = port,
description = description
}
end
end
end
return favorites
end
--------------------------------------------------------------------------------
local function read_favorites()
local path = get_favorites_path()
-- If new format configured fall back to reading the legacy file
if path:sub(#path - 4):lower() == ".json" then
local file = io.open(path, "r")
if file then
local json = file:read("*all")
file:close()
return core.parse_json(json)
end
path = path:sub(1, #path - 5) .. ".txt"
end
local favs = serverlistmgr.read_legacy_favorites(path)
if favs then
save_favorites(favs)
os.remove(path)
end
return favs
end
--------------------------------------------------------------------------------
local function delete_favorite(favorites, del_favorite)
for i=1, #favorites do
local fav = favorites[i]
if fav.address == del_favorite.address and fav.port == del_favorite.port then
table.remove(favorites, i)
return
end
end
end
--------------------------------------------------------------------------------
function serverlistmgr.get_favorites()
if serverlistmgr.favorites then
return serverlistmgr.favorites
end
serverlistmgr.favorites = {}
-- Add favorites, removing duplicates
local seen = {}
for _, fav in ipairs(read_favorites() or {}) do
local key = ("%s:%d"):format(fav.address:lower(), fav.port)
if not seen[key] then
seen[key] = true
serverlistmgr.favorites[#serverlistmgr.favorites + 1] = fav
end
end
return serverlistmgr.favorites
end
--------------------------------------------------------------------------------
function serverlistmgr.add_favorite(new_favorite)
assert(type(new_favorite.port) == "number")
-- Whitelist favorite keys
new_favorite = {
name = new_favorite.name,
address = new_favorite.address,
port = new_favorite.port,
description = new_favorite.description,
}
local favorites = serverlistmgr.get_favorites()
delete_favorite(favorites, new_favorite)
table.insert(favorites, 1, new_favorite)
save_favorites(favorites)
end
--------------------------------------------------------------------------------
function serverlistmgr.delete_favorite(del_favorite)
local favorites = serverlistmgr.get_favorites()
delete_favorite(favorites, del_favorite)
save_favorites(favorites)
end

View File

@ -116,7 +116,7 @@ local function get_formspec(tabview, name, tabdata)
retval = retval .. retval = retval ..
"button[3.9,3.8;2.8,1;world_delete;".. fgettext("Delete") .. "]" .. "button[3.9,3.8;2.8,1;world_delete;".. fgettext("Delete") .. "]" ..
"button[6.55,3.8;2.8,1;world_configure;".. fgettext("Configure") .. "]" .. "button[6.55,3.8;2.8,1;world_configure;".. fgettext("Select Mods") .. "]" ..
"button[9.2,3.8;2.8,1;world_create;".. fgettext("New") .. "]" .. "button[9.2,3.8;2.8,1;world_create;".. fgettext("New") .. "]" ..
"label[3.9,-0.05;".. fgettext("Select World:") .. "]".. "label[3.9,-0.05;".. fgettext("Select World:") .. "]"..
"checkbox[0,-0.20;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. "checkbox[0,-0.20;cb_creative_mode;".. fgettext("Creative Mode") .. ";" ..

View File

@ -20,11 +20,11 @@ local function get_formspec(tabview, name, tabdata)
-- Update the cached supported proto info, -- Update the cached supported proto info,
-- it may have changed after a change by the settings menu. -- it may have changed after a change by the settings menu.
common_update_cached_supp_proto() common_update_cached_supp_proto()
local fav_selected local selected
if menudata.search_result then if menudata.search_result then
fav_selected = menudata.search_result[tabdata.fav_selected] selected = menudata.search_result[tabdata.selected]
else else
fav_selected = menudata.favorites[tabdata.fav_selected] selected = serverlistmgr.servers[tabdata.selected]
end end
if not tabdata.search_for then if not tabdata.search_for then
@ -58,18 +58,18 @@ local function get_formspec(tabview, name, tabdata)
-- Connect -- Connect
"button[9.88,4.9;2.3,1;btn_mp_connect;" .. fgettext("Connect") .. "]" "button[9.88,4.9;2.3,1;btn_mp_connect;" .. fgettext("Connect") .. "]"
if tabdata.fav_selected and fav_selected then if tabdata.selected and selected then
if gamedata.fav then if gamedata.fav then
retval = retval .. "button[7.73,4.9;2.3,1;btn_delete_favorite;" .. retval = retval .. "button[7.73,4.9;2.3,1;btn_delete_favorite;" ..
fgettext("Del. Favorite") .. "]" fgettext("Del. Favorite") .. "]"
end end
if fav_selected.description then if selected.description then
retval = retval .. "textarea[8.1,2.3;4.23,2.9;;;" .. retval = retval .. "textarea[8.1,2.3;4.23,2.9;;;" ..
core.formspec_escape((gamedata.serverdescription or ""), true) .. "]" core.formspec_escape((gamedata.serverdescription or ""), true) .. "]"
end end
end end
--favourites --favorites
retval = retval .. "tablecolumns[" .. retval = retval .. "tablecolumns[" ..
image_column(fgettext("Favorite"), "favorite") .. ";" .. image_column(fgettext("Favorite"), "favorite") .. ";" ..
image_column(fgettext("Ping")) .. ",padding=0.25;" .. image_column(fgettext("Ping")) .. ",padding=0.25;" ..
@ -83,13 +83,12 @@ local function get_formspec(tabview, name, tabdata)
image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" .. image_column(fgettext("PvP enabled"), "pvp") .. ",padding=0.25;" ..
"color,span=1;" .. "color,span=1;" ..
"text,padding=1]" .. "text,padding=1]" ..
"table[-0.15,0.6;7.75,5.15;favourites;" "table[-0.15,0.6;7.75,5.15;favorites;"
if menudata.search_result then if menudata.search_result then
local favs = serverlistmgr.get_favorites()
for i = 1, #menudata.search_result do for i = 1, #menudata.search_result do
local favs = core.get_favorites("local")
local server = menudata.search_result[i] local server = menudata.search_result[i]
for fav_id = 1, #favs do for fav_id = 1, #favs do
if server.address == favs[fav_id].address and if server.address == favs[fav_id].address and
server.port == favs[fav_id].port then server.port == favs[fav_id].port then
@ -103,29 +102,30 @@ local function get_formspec(tabview, name, tabdata)
retval = retval .. render_serverlist_row(server, server.is_favorite) retval = retval .. render_serverlist_row(server, server.is_favorite)
end end
elseif #menudata.favorites > 0 then elseif #serverlistmgr.servers > 0 then
local favs = core.get_favorites("local") local favs = serverlistmgr.get_favorites()
if #favs > 0 then if #favs > 0 then
for i = 1, #favs do for i = 1, #favs do
for j = 1, #menudata.favorites do for j = 1, #serverlistmgr.servers do
if menudata.favorites[j].address == favs[i].address and if serverlistmgr.servers[j].address == favs[i].address and
menudata.favorites[j].port == favs[i].port then serverlistmgr.servers[j].port == favs[i].port then
table.insert(menudata.favorites, i, table.remove(menudata.favorites, j)) table.insert(serverlistmgr.servers, i, table.remove(serverlistmgr.servers, j))
end
end end
end if favs[i].address ~= serverlistmgr.servers[i].address then
if favs[i].address ~= menudata.favorites[i].address then table.insert(serverlistmgr.servers, i, favs[i])
table.insert(menudata.favorites, i, favs[i])
end end
end end
end end
retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0))
for i = 2, #menudata.favorites do retval = retval .. render_serverlist_row(serverlistmgr.servers[1], (#favs > 0))
retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs)) for i = 2, #serverlistmgr.servers do
retval = retval .. "," .. render_serverlist_row(serverlistmgr.servers[i], (i <= #favs))
end end
end end
if tabdata.fav_selected then if tabdata.selected then
retval = retval .. ";" .. tabdata.fav_selected .. "]" retval = retval .. ";" .. tabdata.selected .. "]"
else else
retval = retval .. ";0]" retval = retval .. ";0]"
end end
@ -135,21 +135,20 @@ end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
local function main_button_handler(tabview, fields, name, tabdata) local function main_button_handler(tabview, fields, name, tabdata)
local serverlist = menudata.search_result or menudata.favorites local serverlist = menudata.search_result or serverlistmgr.servers
if fields.te_name then if fields.te_name then
gamedata.playername = fields.te_name gamedata.playername = fields.te_name
core.settings:set("name", fields.te_name) core.settings:set("name", fields.te_name)
end end
if fields.favourites then if fields.favorites then
local event = core.explode_table_event(fields.favourites) local event = core.explode_table_event(fields.favorites)
local fav = serverlist[event.row] local fav = serverlist[event.row]
if event.type == "DCL" then if event.type == "DCL" then
if event.row <= #serverlist then if event.row <= #serverlist then
if menudata.favorites_is_public and if not is_server_protocol_compat_or_error(
not is_server_protocol_compat_or_error(
fav.proto_min, fav.proto_max) then fav.proto_min, fav.proto_max) then
return true return true
end end
@ -178,7 +177,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
if event.type == "CHG" then if event.type == "CHG" then
if event.row <= #serverlist then if event.row <= #serverlist then
gamedata.fav = false gamedata.fav = false
local favs = core.get_favorites("local") local favs = serverlistmgr.get_favorites()
local address = fav.address local address = fav.address
local port = fav.port local port = fav.port
gamedata.serverdescription = fav.description gamedata.serverdescription = fav.description
@ -194,28 +193,28 @@ local function main_button_handler(tabview, fields, name, tabdata)
core.settings:set("address", address) core.settings:set("address", address)
core.settings:set("remote_port", port) core.settings:set("remote_port", port)
end end
tabdata.fav_selected = event.row tabdata.selected = event.row
end end
return true return true
end end
end end
if fields.key_up or fields.key_down then if fields.key_up or fields.key_down then
local fav_idx = core.get_table_index("favourites") local fav_idx = core.get_table_index("favorites")
local fav = serverlist[fav_idx] local fav = serverlist[fav_idx]
if fav_idx then if fav_idx then
if fields.key_up and fav_idx > 1 then if fields.key_up and fav_idx > 1 then
fav_idx = fav_idx - 1 fav_idx = fav_idx - 1
elseif fields.key_down and fav_idx < #menudata.favorites then elseif fields.key_down and fav_idx < #serverlistmgr.servers then
fav_idx = fav_idx + 1 fav_idx = fav_idx + 1
end end
else else
fav_idx = 1 fav_idx = 1
end end
if not menudata.favorites or not fav then if not serverlistmgr.servers or not fav then
tabdata.fav_selected = 0 tabdata.selected = 0
return true return true
end end
@ -227,17 +226,17 @@ local function main_button_handler(tabview, fields, name, tabdata)
core.settings:set("remote_port", port) core.settings:set("remote_port", port)
end end
tabdata.fav_selected = fav_idx tabdata.selected = fav_idx
return true return true
end end
if fields.btn_delete_favorite then if fields.btn_delete_favorite then
local current_favourite = core.get_table_index("favourites") local current_favorite = core.get_table_index("favorites")
if not current_favourite then return end if not current_favorite then return end
core.delete_favorite(current_favourite) serverlistmgr.delete_favorite(serverlistmgr.servers[current_favorite])
asyncOnlineFavourites() serverlistmgr.sync()
tabdata.fav_selected = nil tabdata.selected = nil
core.settings:set("address", "") core.settings:set("address", "")
core.settings:set("remote_port", "30000") core.settings:set("remote_port", "30000")
@ -251,11 +250,11 @@ local function main_button_handler(tabview, fields, name, tabdata)
end end
if fields.btn_mp_search or fields.key_enter_field == "te_search" then if fields.btn_mp_search or fields.key_enter_field == "te_search" then
tabdata.fav_selected = 1 tabdata.selected = 1
local input = fields.te_search:lower() local input = fields.te_search:lower()
tabdata.search_for = fields.te_search tabdata.search_for = fields.te_search
if #menudata.favorites < 2 then if #serverlistmgr.servers < 2 then
return true return true
end end
@ -275,8 +274,8 @@ local function main_button_handler(tabview, fields, name, tabdata)
-- Search the serverlist -- Search the serverlist
local search_result = {} local search_result = {}
for i = 1, #menudata.favorites do for i = 1, #serverlistmgr.servers do
local server = menudata.favorites[i] local server = serverlistmgr.servers[i]
local found = 0 local found = 0
for k = 1, #keywords do for k = 1, #keywords do
local keyword = keywords[k] local keyword = keywords[k]
@ -293,7 +292,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
end end
end end
if found > 0 then if found > 0 then
local points = (#menudata.favorites - i) / 5 + found local points = (#serverlistmgr.servers - i) / 5 + found
server.points = points server.points = points
table.insert(search_result, server) table.insert(search_result, server)
end end
@ -312,7 +311,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
end end
if fields.btn_mp_refresh then if fields.btn_mp_refresh then
asyncOnlineFavourites() serverlistmgr.sync()
return true return true
end end
@ -321,30 +320,36 @@ local function main_button_handler(tabview, fields, name, tabdata)
gamedata.playername = fields.te_name gamedata.playername = fields.te_name
gamedata.password = fields.te_pwd gamedata.password = fields.te_pwd
gamedata.address = fields.te_address gamedata.address = fields.te_address
gamedata.port = fields.te_port gamedata.port = tonumber(fields.te_port)
gamedata.selected_world = 0 gamedata.selected_world = 0
local fav_idx = core.get_table_index("favourites") local fav_idx = core.get_table_index("favorites")
local fav = serverlist[fav_idx] local fav = serverlist[fav_idx]
if fav_idx and fav_idx <= #serverlist and if fav_idx and fav_idx <= #serverlist and
fav.address == fields.te_address and fav.address == gamedata.address and
fav.port == fields.te_port then fav.port == gamedata.port then
serverlistmgr.add_favorite(fav)
gamedata.servername = fav.name gamedata.servername = fav.name
gamedata.serverdescription = fav.description gamedata.serverdescription = fav.description
if menudata.favorites_is_public and if not is_server_protocol_compat_or_error(
not is_server_protocol_compat_or_error(
fav.proto_min, fav.proto_max) then fav.proto_min, fav.proto_max) then
return true return true
end end
else else
gamedata.servername = "" gamedata.servername = ""
gamedata.serverdescription = "" gamedata.serverdescription = ""
serverlistmgr.add_favorite({
address = gamedata.address,
port = gamedata.port,
})
end end
core.settings:set("address", fields.te_address) core.settings:set("address", gamedata.address)
core.settings:set("remote_port", fields.te_port) core.settings:set("remote_port", gamedata.port)
core.start() core.start()
return true return true
@ -354,7 +359,7 @@ end
local function on_change(type, old_tab, new_tab) local function on_change(type, old_tab, new_tab)
if type == "LEAVE" then return end if type == "LEAVE" then return end
asyncOnlineFavourites() serverlistmgr.sync()
end end
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@ -0,0 +1,29 @@
[server]
127.0.0.1
30000
[server]
localhost
30000
[server]
vps.rubenwardy.com
30001
[server]
gundul.ddnss.de
39155
[server]
VanessaE's Dreambuilder creative Server
daconcepts.com
30000
VanessaE's Dreambuilder creative-mode server. Lots of mods, whitelisted buckets.

View File

@ -0,0 +1,36 @@
_G.core = {}
_G.unpack = table.unpack
_G.serverlistmgr = {}
dofile("builtin/common/misc_helpers.lua")
dofile("builtin/mainmenu/serverlistmgr.lua")
local base = "builtin/mainmenu/tests/"
describe("legacy favorites", function()
it("loads well-formed correctly", function()
local favs = serverlistmgr.read_legacy_favorites(base .. "favorites_wellformed.txt")
local expected = {
{
address = "127.0.0.1",
port = 30000,
},
{ address = "localhost", port = 30000 },
{ address = "vps.rubenwardy.com", port = 30001 },
{ address = "gundul.ddnss.de", port = 39155 },
{
address = "daconcepts.com",
port = 30000,
name = "VanessaE's Dreambuilder creative Server",
description = "VanessaE's Dreambuilder creative-mode server. Lots of mods, whitelisted buckets."
},
}
assert.same(expected, favs)
end)
end)

View File

@ -976,7 +976,7 @@ serverlist_url (Serverlist URL) string servers.minetest.net
# File in client/serverlist/ that contains your favorite servers displayed in the # File in client/serverlist/ that contains your favorite servers displayed in the
# Multiplayer Tab. # Multiplayer Tab.
serverlist_file (Serverlist file) string favoriteservers.txt serverlist_file (Serverlist file) string favoriteservers.json
# Maximum size of the out chat queue. # Maximum size of the out chat queue.
# 0 to disable queueing and -1 to make the queue size unlimited. # 0 to disable queueing and -1 to make the queue size unlimited.
@ -1097,7 +1097,7 @@ default_stack_max (Default stack size) int 99
# Enable players getting damage and dying. # Enable players getting damage and dying.
enable_damage (Damage) bool false enable_damage (Damage) bool false
# Enable creative mode for new created maps. # Enable creative mode for all players
creative_mode (Creative) bool false creative_mode (Creative) bool false
# A chosen map seed for a new map, leave empty for random. # A chosen map seed for a new map, leave empty for random.

View File

@ -627,7 +627,7 @@ Helper functions
* `minetest.is_yes(arg)` * `minetest.is_yes(arg)`
* returns whether `arg` can be interpreted as yes * returns whether `arg` can be interpreted as yes
* `minetest.is_nan(arg)` * `minetest.is_nan(arg)`
* returns true true when the passed number represents NaN. * returns true when the passed number represents NaN.
* `table.copy(table)`: returns a table * `table.copy(table)`: returns a table
* returns a deep copy of `table` * returns a deep copy of `table`

View File

@ -1745,8 +1745,9 @@ to games.
### `ObjectRef` groups ### `ObjectRef` groups
* `immortal`: Skips all damage and breath handling for an object. This group * `immortal`: Skips all damage and breath handling for an object. This group
will also hide the integrated HUD status bars for players, and is will also hide the integrated HUD status bars for players. It is
automatically set to all players when damage is disabled on the server. automatically set to all players when damage is disabled on the server and
cannot be reset (subject to change).
* `punch_operable`: For entities; disables the regular damage mechanism for * `punch_operable`: For entities; disables the regular damage mechanism for
players punching it by hand or a non-tool item, so that it can do something players punching it by hand or a non-tool item, so that it can do something
else than take damage. else than take damage.
@ -2113,7 +2114,7 @@ Examples
list[current_player;main;0,3.5;8,4;] list[current_player;main;0,3.5;8,4;]
list[current_player;craft;3,0;3,3;] list[current_player;craft;3,0;3,3;]
list[current_player;craftpreview;7,1;1,1;] list[current_player;craftpreview;7,1;1,1;]
Version History Version History
--------------- ---------------
@ -2226,7 +2227,8 @@ Elements
* Show an inventory list if it has been sent to the client. Nothing will * Show an inventory list if it has been sent to the client. Nothing will
be shown if the inventory list is of size 0. be shown if the inventory list is of size 0.
* **Note**: With the new coordinate system, the spacing between inventory * **Note**: With the new coordinate system, the spacing between inventory
slots is one-fourth the size of an inventory slot. slots is one-fourth the size of an inventory slot by default. Also see
[Styling Formspecs] for changing the size of slots and spacing.
### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]` ### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
@ -2809,6 +2811,7 @@ Some types may inherit styles from parent types.
* image_button * image_button
* item_image_button * item_image_button
* label * label
* list
* model * model
* pwdfield, inherits from field * pwdfield, inherits from field
* scrollbar * scrollbar
@ -2869,14 +2872,14 @@ Some types may inherit styles from parent types.
* noclip - boolean, set to true to allow the element to exceed formspec bounds. * noclip - boolean, set to true to allow the element to exceed formspec bounds.
* padding - rect, adds space between the edges of the button and the content. This value is * padding - rect, adds space between the edges of the button and the content. This value is
relative to bgimg_middle. relative to bgimg_middle.
* sound - a sound to be played when clicked. * sound - a sound to be played when triggered.
* textcolor - color, default white. * textcolor - color, default white.
* checkbox * checkbox
* noclip - boolean, set to true to allow the element to exceed formspec bounds. * noclip - boolean, set to true to allow the element to exceed formspec bounds.
* sound - a sound to be played when clicked. * sound - a sound to be played when triggered.
* dropdown * dropdown
* noclip - boolean, set to true to allow the element to exceed formspec bounds. * noclip - boolean, set to true to allow the element to exceed formspec bounds.
* sound - a sound to be played when clicked. * sound - a sound to be played when the entry is changed.
* field, pwdfield, textarea * field, pwdfield, textarea
* border - set to false to hide the textbox background and border. Default true. * border - set to false to hide the textbox background and border. Default true.
* font - Sets font type. See button `font` property for more information. * font - Sets font type. See button `font` property for more information.
@ -2896,6 +2899,10 @@ Some types may inherit styles from parent types.
* font - Sets font type. See button `font` property for more information. * font - Sets font type. See button `font` property for more information.
* font_size - Sets font size. See button `font_size` property for more information. * font_size - Sets font size. See button `font_size` property for more information.
* noclip - boolean, set to true to allow the element to exceed formspec bounds. * noclip - boolean, set to true to allow the element to exceed formspec bounds.
* list
* noclip - boolean, set to true to allow the element to exceed formspec bounds.
* size - 2d vector, sets the size of inventory slots in coordinates.
* spacing - 2d vector, sets the space between inventory slots in coordinates.
* image_button (additional properties) * image_button (additional properties)
* fgimg - standard image. Defaults to none. * fgimg - standard image. Defaults to none.
* fgimg_hovered - image when hovered. Defaults to fgimg when not provided. * fgimg_hovered - image when hovered. Defaults to fgimg when not provided.
@ -2903,12 +2910,12 @@ Some types may inherit styles from parent types.
* fgimg_pressed - image when pressed. Defaults to fgimg when not provided. * fgimg_pressed - image when pressed. Defaults to fgimg when not provided.
* This is deprecated, use states instead. * This is deprecated, use states instead.
* NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed * NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed
* sound - a sound to be played when clicked. * sound - a sound to be played when triggered.
* scrollbar * scrollbar
* noclip - boolean, set to true to allow the element to exceed formspec bounds. * noclip - boolean, set to true to allow the element to exceed formspec bounds.
* tabheader * tabheader
* noclip - boolean, set to true to allow the element to exceed formspec bounds. * noclip - boolean, set to true to allow the element to exceed formspec bounds.
* sound - a sound to be played when clicked. * sound - a sound to be played when a different tab is selected.
* textcolor - color. Default white. * textcolor - color. Default white.
* table, textlist * table, textlist
* font - Sets font type. See button `font` property for more information. * font - Sets font type. See button `font` property for more information.
@ -3271,7 +3278,8 @@ Helper functions
* Appends all values in `other_table` to `table` - uses `#table + 1` to * Appends all values in `other_table` to `table` - uses `#table + 1` to
find new indices. find new indices.
* `table.key_value_swap(t)`: returns a table with keys and values swapped * `table.key_value_swap(t)`: returns a table with keys and values swapped
* If multiple keys in `t` map to the same value, the result is undefined. * If multiple keys in `t` map to the same value, it is unspecified which
value maps to that key.
* `table.shuffle(table, [from], [to], [random_func])`: * `table.shuffle(table, [from], [to], [random_func])`:
* Shuffles elements `from` to `to` in `table` in place * Shuffles elements `from` to `to` in `table` in place
* `from` defaults to `1` * `from` defaults to `1`
@ -4381,6 +4389,8 @@ Utilities
object_step_has_moveresult = true, object_step_has_moveresult = true,
-- Whether get_velocity() and add_velocity() can be used on players (5.4.0) -- Whether get_velocity() and add_velocity() can be used on players (5.4.0)
direct_velocity_on_players = true, direct_velocity_on_players = true,
-- nodedef's use_texture_alpha accepts new string modes (5.4.0)
use_texture_alpha_string_modes = true,
} }
* `minetest.has_feature(arg)`: returns `boolean, missing_features` * `minetest.has_feature(arg)`: returns `boolean, missing_features`
@ -4589,6 +4599,10 @@ Call these functions only at load time!
the puncher to the punched. the puncher to the punched.
* `damage`: Number that represents the damage calculated by the engine * `damage`: Number that represents the damage calculated by the engine
* should return `true` to prevent the default damage mechanism * should return `true` to prevent the default damage mechanism
* `minetest.register_on_rightclickplayer(function(player, clicker))`
* Called when a player is right-clicked
* `player`: ObjectRef - Player that was right-clicked
* `clicker`: ObjectRef - Object that right-clicked, may or may not be a player
* `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)` * `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)`
* Called when the player gets damaged or healed * Called when the player gets damaged or healed
* `player`: ObjectRef of the player * `player`: ObjectRef of the player
@ -5434,20 +5448,22 @@ Server
* Returns a code (0: successful, 1: no such player, 2: player is connected) * Returns a code (0: successful, 1: no such player, 2: player is connected)
* `minetest.remove_player_auth(name)`: remove player authentication data * `minetest.remove_player_auth(name)`: remove player authentication data
* Returns boolean indicating success (false if player nonexistant) * Returns boolean indicating success (false if player nonexistant)
* `minetest.dynamic_add_media(filepath)` * `minetest.dynamic_add_media(filepath, callback)`
* Adds the file at the given path to the media sent to clients by the server * `filepath`: path to a media file on the filesystem
on startup and also pushes this file to already connected clients. * `callback`: function with arguments `name`, where name is a player name
(previously there was no callback argument; omitting it is deprecated)
* Adds the file to the media sent to clients by the server on startup
and also pushes this file to already connected clients.
The file must be a supported image, sound or model format. It must not be The file must be a supported image, sound or model format. It must not be
modified, deleted, moved or renamed after calling this function. modified, deleted, moved or renamed after calling this function.
The list of dynamically added media is not persisted. The list of dynamically added media is not persisted.
* Returns boolean indicating success (duplicate files count as error) * Returns false on error, true if the request was accepted
* The media will be ready to use (in e.g. entity textures, sound_play) * The given callback will be called for every player as soon as the
immediately after calling this function. media is available on the client.
Old clients that lack support for this feature will not see the media Old clients that lack support for this feature will not see the media
unless they reconnect to the server. unless they reconnect to the server. (callback won't be called)
* Since media transferred this way does not use client caching or HTTP * Since media transferred this way currently does not use client caching
transfers, dynamic media should not be used with big files or performance or HTTP transfers, dynamic media should not be used with big files.
will suffer.
Bans Bans
---- ----
@ -6213,8 +6229,8 @@ object you are working with still exists.
* `time_from_last_punch` = time since last punch action of the puncher * `time_from_last_punch` = time since last punch action of the puncher
* `direction`: can be `nil` * `direction`: can be `nil`
* `right_click(clicker)`; `clicker` is another `ObjectRef` * `right_click(clicker)`; `clicker` is another `ObjectRef`
* `get_hp()`: returns number of hitpoints (2 * number of hearts) * `get_hp()`: returns number of health points
* `set_hp(hp, reason)`: set number of hitpoints (2 * number of hearts). * `set_hp(hp, reason)`: set number of health points
* See reason in register_on_player_hpchange * See reason in register_on_player_hpchange
* Is limited to the range of 0 ... 65535 (2^16 - 1) * Is limited to the range of 0 ... 65535 (2^16 - 1)
* For players: HP are also limited by `hp_max` specified in the player's * For players: HP are also limited by `hp_max` specified in the player's
@ -6237,21 +6253,22 @@ object you are working with still exists.
`frame_loop`. `frame_loop`.
* `set_animation_frame_speed(frame_speed)` * `set_animation_frame_speed(frame_speed)`
* `frame_speed`: number, default: `15.0` * `frame_speed`: number, default: `15.0`
* `set_attach(parent, bone, position, rotation, forced_visible)` * `set_attach(parent[, bone, position, rotation, forced_visible])`
* `bone`: string * `bone`: string. Default is `""`, the root bone
* `position`: `{x=num, y=num, z=num}` (relative) * `position`: `{x=num, y=num, z=num}`, relative, default `{x=0, y=0, z=0}`
* `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees * `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees.
Default `{x=0, y=0, z=0}`
* `forced_visible`: Boolean to control whether the attached entity * `forced_visible`: Boolean to control whether the attached entity
should appear in first person. should appear in first person. Default `false`.
* `get_attach()`: returns parent, bone, position, rotation, forced_visible, * `get_attach()`: returns parent, bone, position, rotation, forced_visible,
or nil if it isn't attached. or nil if it isn't attached.
* `get_children()`: returns a list of ObjectRefs that are attached to the * `get_children()`: returns a list of ObjectRefs that are attached to the
object. object.
* `set_detach()` * `set_detach()`
* `set_bone_position(bone, position, rotation)` * `set_bone_position([bone, position, rotation])`
* `bone`: string * `bone`: string. Default is `""`, the root bone
* `position`: `{x=num, y=num, z=num}` (relative) * `position`: `{x=num, y=num, z=num}`, relative, `default {x=0, y=0, z=0}`
* `rotation`: `{x=num, y=num, z=num}` * `rotation`: `{x=num, y=num, z=num}`, default `{x=0, y=0, z=0}`
* `get_bone_position(bone)`: returns position and rotation of the bone * `get_bone_position(bone)`: returns position and rotation of the bone
* `set_properties(object property table)` * `set_properties(object property table)`
* `get_properties()`: returns object property table * `get_properties()`: returns object property table
@ -6579,8 +6596,8 @@ object you are working with still exists.
* `frame_speed` sets the animations frame speed. Default is 30. * `frame_speed` sets the animations frame speed. Default is 30.
* `get_local_animation()`: returns idle, walk, dig, walk_while_dig tables and * `get_local_animation()`: returns idle, walk, dig, walk_while_dig tables and
`frame_speed`. `frame_speed`.
* `set_eye_offset(firstperson, thirdperson)`: defines offset vectors for camera * `set_eye_offset([firstperson, thirdperson])`: defines offset vectors for
per player. camera per player. An argument defaults to `{x=0, y=0, z=0}` if unspecified.
* in first person view * in first person view
* in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`) * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
* `get_eye_offset()`: returns first and third person offsets. * `get_eye_offset()`: returns first and third person offsets.
@ -6936,7 +6953,11 @@ Player properties need to be saved manually.
-- in mods. -- in mods.
nametag = "", nametag = "",
-- By default empty, for players their name is shown if empty -- The name to display on the head of the object. By default empty.
-- If the object is a player, a nil or empty nametag is replaced by the player's name.
-- For all other objects, a nil or empty string removes the nametag.
-- To hide a nametag, set its color alpha to zero. That will disable it entirely.
nametag_color = <ColorSpec>, nametag_color = <ColorSpec>,
-- Sets color of nametag -- Sets color of nametag
@ -7326,10 +7347,18 @@ Used by `minetest.register_node`.
-- If the node has a palette, then this setting only has an effect in -- If the node has a palette, then this setting only has an effect in
-- the inventory and on the wield item. -- the inventory and on the wield item.
use_texture_alpha = false, use_texture_alpha = ...,
-- Use texture's alpha channel -- Specifies how the texture's alpha channel will be used for rendering.
-- If this is set to false, the node will be rendered fully opaque -- possible values:
-- regardless of any texture transparency. -- * "opaque": Node is rendered opaque regardless of alpha channel
-- * "clip": A given pixel is either fully see-through or opaque
-- depending on the alpha channel being below/above 50% in value
-- * "blend": The alpha channel specifies how transparent a given pixel
-- of the rendered node is
-- The default is "opaque" for drawtypes normal, liquid and flowingliquid;
-- "clip" otherwise.
-- If set to a boolean value (deprecated): true either sets it to blend
-- or clip, false sets it to clip or opaque mode depending on the drawtype.
palette = "palette.png", palette = "palette.png",
-- The node's `param2` is used to select a pixel from the image. -- The node's `param2` is used to select a pixel from the image.
@ -7604,6 +7633,8 @@ Used by `minetest.register_node`.
on_dig = function(pos, node, digger), on_dig = function(pos, node, digger),
-- default: minetest.node_dig -- default: minetest.node_dig
-- By default checks privileges, wears out tool and removes node. -- By default checks privileges, wears out tool and removes node.
-- return true if the node was dug successfully, false otherwise.
-- Deprecated: returning nil is the same as returning true.
on_timer = function(pos, elapsed), on_timer = function(pos, elapsed),
-- default: nil -- default: nil
@ -7643,12 +7674,12 @@ Used by `minetest.register_node`.
-- intensity: 1.0 = mid range of regular TNT. -- intensity: 1.0 = mid range of regular TNT.
-- If defined, called when an explosion touches the node, instead of -- If defined, called when an explosion touches the node, instead of
-- removing the node. -- removing the node.
mod_origin = "modname", mod_origin = "modname",
-- stores which mod actually registered a node -- stores which mod actually registered a node
-- if it can not find a source, returns "??" -- if it can not find a source, returns "??"
-- useful for getting what mod truly registered something -- useful for getting what mod truly registered something
-- example: if a node is registered as ":othermodname:nodename", -- example: if a node is registered as ":othermodname:nodename",
-- nodename will show "othermodname", but mod_orgin will say "modname" -- nodename will show "othermodname", but mod_orgin will say "modname"
} }

View File

@ -85,6 +85,7 @@ core.get_video_drivers()
core.get_mapgen_names([include_hidden=false]) -> table of map generator algorithms core.get_mapgen_names([include_hidden=false]) -> table of map generator algorithms
registered in the core (possible in async calls) registered in the core (possible in async calls)
core.get_cache_path() -> path of cache core.get_cache_path() -> path of cache
core.get_temp_path() -> path of temp folder
HTTP Requests HTTP Requests
@ -253,32 +254,6 @@ Package - content which is downloadable from the content db, may or may not be i
} }
Favorites
---------
core.get_favorites(location) -> list of favorites (possible in async calls)
^ location: "local" or "online"
^ returns {
[1] = {
clients = <number of clients/nil>,
clients_max = <maximum number of clients/nil>,
version = <server version/nil>,
password = <true/nil>,
creative = <true/nil>,
damage = <true/nil>,
pvp = <true/nil>,
description = <server description/nil>,
name = <server name/nil>,
address = <address of server/nil>,
port = <port>
clients_list = <array of clients/nil>
mods = <array of mods/nil>
},
...
}
core.delete_favorite(id, location) -> success
Logging Logging
------- -------

View File

@ -493,19 +493,8 @@ Static objects are persistent freely moving objects in the world.
Object types: Object types:
1: Test object 1: Test object
2: Item
3: Rat (obsolete)
4: Oerkki (obsolete)
5: Firefly (obsolete)
6: MobV2 (obsolete)
7: LuaEntity 7: LuaEntity
1: Item:
u8 version
version 0:
u16 len
u8[len] itemstring
7: LuaEntity: 7: LuaEntity:
u8 compatibility_byte (always 1) u8 compatibility_byte (always 1)
u16 len u16 len

View File

@ -1,4 +1,4 @@
local WATER_ALPHA = 160 local WATER_ALPHA = "^[opacity:" .. 160
local WATER_VISC = 1 local WATER_VISC = 1
local LAVA_VISC = 7 local LAVA_VISC = 7
@ -128,12 +128,12 @@ minetest.register_node("basenodes:water_source", {
"Drowning damage: 1", "Drowning damage: 1",
drawtype = "liquid", drawtype = "liquid",
waving = 3, waving = 3,
tiles = {"default_water.png"}, tiles = {"default_water.png"..WATER_ALPHA},
special_tiles = { special_tiles = {
{name = "default_water.png", backface_culling = false}, {name = "default_water.png"..WATER_ALPHA, backface_culling = false},
{name = "default_water.png", backface_culling = true}, {name = "default_water.png"..WATER_ALPHA, backface_culling = true},
}, },
alpha = WATER_ALPHA, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
pointable = false, pointable = false,
@ -156,10 +156,12 @@ minetest.register_node("basenodes:water_flowing", {
waving = 3, waving = 3,
tiles = {"default_water_flowing.png"}, tiles = {"default_water_flowing.png"},
special_tiles = { special_tiles = {
{name = "default_water_flowing.png", backface_culling = false}, {name = "default_water_flowing.png"..WATER_ALPHA,
{name = "default_water_flowing.png", backface_culling = false}, backface_culling = false},
{name = "default_water_flowing.png"..WATER_ALPHA,
backface_culling = false},
}, },
alpha = WATER_ALPHA, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
paramtype2 = "flowingliquid", paramtype2 = "flowingliquid",
walkable = false, walkable = false,
@ -181,12 +183,12 @@ minetest.register_node("basenodes:river_water_source", {
"Drowning damage: 1", "Drowning damage: 1",
drawtype = "liquid", drawtype = "liquid",
waving = 3, waving = 3,
tiles = { "default_river_water.png" }, tiles = { "default_river_water.png"..WATER_ALPHA },
special_tiles = { special_tiles = {
{name = "default_river_water.png", backface_culling = false}, {name = "default_river_water.png"..WATER_ALPHA, backface_culling = false},
{name = "default_river_water.png", backface_culling = true}, {name = "default_river_water.png"..WATER_ALPHA, backface_culling = true},
}, },
alpha = WATER_ALPHA, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
pointable = false, pointable = false,
@ -209,12 +211,14 @@ minetest.register_node("basenodes:river_water_flowing", {
"Drowning damage: 1", "Drowning damage: 1",
drawtype = "flowingliquid", drawtype = "flowingliquid",
waving = 3, waving = 3,
tiles = {"default_river_water_flowing.png"}, tiles = {"default_river_water_flowing.png"..WATER_ALPHA},
special_tiles = { special_tiles = {
{name = "default_river_water_flowing.png", backface_culling = false}, {name = "default_river_water_flowing.png"..WATER_ALPHA,
{name = "default_river_water_flowing.png", backface_culling = false}, backface_culling = false},
{name = "default_river_water_flowing.png"..WATER_ALPHA,
backface_culling = false},
}, },
alpha = WATER_ALPHA, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
paramtype2 = "flowingliquid", paramtype2 = "flowingliquid",
walkable = false, walkable = false,

View File

@ -60,11 +60,13 @@ minetest.register_node("soundstuff:footstep_liquid", {
description = "Liquid Footstep Sound Node", description = "Liquid Footstep Sound Node",
drawtype = "liquid", drawtype = "liquid",
tiles = { tiles = {
"soundstuff_node_sound.png^[colorize:#0000FF:127", "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190",
}, },
special_tiles = { special_tiles = {
{name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = false}, {name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190",
{name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = true}, backface_culling = false},
{name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190",
backface_culling = true},
}, },
liquids_pointable = true, liquids_pointable = true,
liquidtype = "source", liquidtype = "source",
@ -73,7 +75,7 @@ minetest.register_node("soundstuff:footstep_liquid", {
liquid_renewable = false, liquid_renewable = false,
liquid_range = 0, liquid_range = 0,
liquid_viscosity = 0, liquid_viscosity = 0,
alpha = 190, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
pointable = false, pointable = false,
@ -92,7 +94,6 @@ minetest.register_node("soundstuff:footstep_climbable", {
tiles = { tiles = {
"soundstuff_node_climbable.png", "soundstuff_node_climbable.png",
}, },
alpha = 120,
paramtype = "light", paramtype = "light",
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,

View File

@ -33,6 +33,34 @@ local tabheaders_fs = [[
tabheader[8,6;10,1.5;tabs_size2;Height=1.5;1;false;false] tabheader[8,6;10,1.5;tabs_size2;Height=1.5;1;false;false]
]] ]]
local inv_style_fs = [[
style_type[list;noclip=true]
list[current_player;main;-0.75,0.75;2,2]
real_coordinates[false]
list[current_player;main;1.5,0;3,2]
real_coordinates[true]
real_coordinates[false]
style_type[list;size=1.1;spacing=0.1]
list[current_player;main;5,0;3,2]
real_coordinates[true]
style_type[list;size=.001;spacing=0]
list[current_player;main;7,3.5;8,4]
box[3,3.5;1,1;#000000]
box[5,3.5;1,1;#000000]
box[4,4.5;1,1;#000000]
box[3,5.5;1,1;#000000]
box[5,5.5;1,1;#000000]
style_type[list;spacing=.25,.125;size=.75,.875]
list[current_player;main;3,3.5;3,3]
style_type[list;spacing=0;size=1.1]
list[current_player;main;.5,7;8,4]
]]
local hypertext_basic = [[ local hypertext_basic = [[
<bigger>Normal test</bigger> <bigger>Normal test</bigger>
This is a normal text. This is a normal text.
@ -199,6 +227,7 @@ local scroll_fs =
"box[1,1;8,6;#00aa]".. "box[1,1;8,6;#00aa]"..
"scroll_container[1,1;8,6;scrbar;vertical]".. "scroll_container[1,1;8,6;scrbar;vertical]"..
"button[0,1;1,1;lorem;Lorem]".. "button[0,1;1,1;lorem;Lorem]"..
"animated_image[0,1;4.5,1;clip_animated_image;testformspec_animation.png;4;100]" ..
"button[0,10;1,1;ipsum;Ipsum]".. "button[0,10;1,1;ipsum;Ipsum]"..
"pwdfield[2,2;1,1;lorem2;Lorem]".. "pwdfield[2,2;1,1;lorem2;Lorem]"..
"list[current_player;main;4,4;1,5;]".. "list[current_player;main;4,4;1,5;]"..
@ -211,6 +240,8 @@ local scroll_fs =
"tooltip[0,11;3,2;Buz;#f00;#000]".. "tooltip[0,11;3,2;Buz;#f00;#000]"..
"box[0,11;3,2;#00ff00]".. "box[0,11;3,2;#00ff00]"..
"hypertext[3,13;3,3;;" .. hypertext_basic .. "]" .. "hypertext[3,13;3,3;;" .. hypertext_basic .. "]" ..
"hypertext[3,17;3,3;;Hypertext with no scrollbar\\; the scroll container should scroll.]" ..
"textarea[3,21;3,1;textarea;;More scroll within scroll]" ..
"container[0,18]".. "container[0,18]"..
"box[1,2;3,2;#0a0a]".. "box[1,2;3,2;#0a0a]"..
"scroll_container[1,2;3,2;scrbar2;horizontal;0.06]".. "scroll_container[1,2;3,2;scrbar2;horizontal;0.06]"..
@ -310,6 +341,9 @@ local pages = {
"size[12,13]real_coordinates[true]" .. "size[12,13]real_coordinates[true]" ..
"container[0.5,1.5]" .. tabheaders_fs .. "container_end[]", "container[0.5,1.5]" .. tabheaders_fs .. "container_end[]",
-- Inv
"size[12,13]real_coordinates[true]" .. inv_style_fs,
-- Animation -- Animation
[[ [[
formspec_version[3] formspec_version[3]
@ -341,7 +375,7 @@ Number]
local function show_test_formspec(pname, page_id) local function show_test_formspec(pname, page_id)
page_id = page_id or 2 page_id = page_id or 2
local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Anim,ScrollC;" .. page_id .. ";false;false]" local fs = pages[page_id] .. "tabheader[0,0;8,0.65;maintabs;Real Coord,Styles,Noclip,Hypertext,Tabs,Invs,Anim,ScrollC;" .. page_id .. ";false;false]"
minetest.show_formspec(pname, "testformspec:formspec", fs) minetest.show_formspec(pname, "testformspec:formspec", fs)
end end

View File

@ -350,68 +350,72 @@ minetest.register_node("testnodes:plantlike_rooted_degrotate", {
}) })
-- Demonstrative liquid nodes, source and flowing form. -- Demonstrative liquid nodes, source and flowing form.
minetest.register_node("testnodes:liquid", { -- DRAWTYPE ONLY, NO LIQUID PHYSICS!
description = S("Source Liquid Drawtype Test Node"), -- Liquid ranges 0 to 8
drawtype = "liquid", for r = 0, 8 do
paramtype = "light", minetest.register_node("testnodes:liquid_"..r, {
tiles = { description = S("Source Liquid Drawtype Test Node, Range @1", r),
"testnodes_liquidsource.png", drawtype = "liquid",
}, paramtype = "light",
special_tiles = { tiles = {
{name="testnodes_liquidsource.png", backface_culling=false}, "testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100",
{name="testnodes_liquidsource.png", backface_culling=true}, },
}, special_tiles = {
use_texture_alpha = true, {name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false},
{name="testnodes_liquidsource_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=true},
},
use_texture_alpha = "blend",
walkable = false, walkable = false,
liquidtype = "source", liquid_range = r,
liquid_range = 1, liquid_viscosity = 0,
liquid_viscosity = 0, liquid_alternative_flowing = "testnodes:liquid_flowing_"..r,
liquid_alternative_flowing = "testnodes:liquid_flowing", liquid_alternative_source = "testnodes:liquid_"..r,
liquid_alternative_source = "testnodes:liquid", groups = { dig_immediate = 3 },
groups = { dig_immediate = 3 }, })
}) minetest.register_node("testnodes:liquid_flowing_"..r, {
minetest.register_node("testnodes:liquid_flowing", { description = S("Flowing Liquid Drawtype Test Node, Range @1", r),
description = S("Flowing Liquid Drawtype Test Node"), drawtype = "flowingliquid",
drawtype = "flowingliquid", paramtype = "light",
paramtype = "light", paramtype2 = "flowingliquid",
paramtype2 = "flowingliquid", tiles = {
tiles = { "testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100",
"testnodes_liquidflowing.png", },
}, special_tiles = {
special_tiles = { {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false},
{name="testnodes_liquidflowing.png", backface_culling=false}, {name="testnodes_liquidflowing_r"..r..".png^[colorize:#FFFFFF:100", backface_culling=false},
{name="testnodes_liquidflowing.png", backface_culling=false}, },
}, use_texture_alpha = "blend",
use_texture_alpha = true,
walkable = false, walkable = false,
liquidtype = "flowing", liquid_range = r,
liquid_range = 1, liquid_viscosity = 0,
liquid_viscosity = 0, liquid_alternative_flowing = "testnodes:liquid_flowing_"..r,
liquid_alternative_flowing = "testnodes:liquid_flowing", liquid_alternative_source = "testnodes:liquid_"..r,
liquid_alternative_source = "testnodes:liquid", groups = { dig_immediate = 3 },
groups = { dig_immediate = 3 }, })
})
end
-- Waving liquid test (drawtype only)
minetest.register_node("testnodes:liquid_waving", { minetest.register_node("testnodes:liquid_waving", {
description = S("Waving Source Liquid Drawtype Test Node"), description = S("Waving Source Liquid Drawtype Test Node"),
drawtype = "liquid", drawtype = "liquid",
paramtype = "light", paramtype = "light",
tiles = { tiles = {
"testnodes_liquidsource.png^[brighten", "testnodes_liquidsource.png^[colorize:#0000FF:127",
}, },
special_tiles = { special_tiles = {
{name="testnodes_liquidsource.png^[brighten", backface_culling=false}, {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=false},
{name="testnodes_liquidsource.png^[brighten", backface_culling=true}, {name="testnodes_liquidsource.png^[colorize:#0000FF:127", backface_culling=true},
}, },
use_texture_alpha = true, use_texture_alpha = "blend",
waving = 3, waving = 3,
walkable = false, walkable = false,
liquidtype = "source",
liquid_range = 1, liquid_range = 1,
liquid_viscosity = 0, liquid_viscosity = 0,
liquid_alternative_flowing = "testnodes:liquid_flowing_waving", liquid_alternative_flowing = "testnodes:liquid_flowing_waving",
@ -424,18 +428,17 @@ minetest.register_node("testnodes:liquid_flowing_waving", {
paramtype = "light", paramtype = "light",
paramtype2 = "flowingliquid", paramtype2 = "flowingliquid",
tiles = { tiles = {
"testnodes_liquidflowing.png^[brighten", "testnodes_liquidflowing.png^[colorize:#0000FF:127",
}, },
special_tiles = { special_tiles = {
{name="testnodes_liquidflowing.png^[brighten", backface_culling=false}, {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false},
{name="testnodes_liquidflowing.png^[brighten", backface_culling=false}, {name="testnodes_liquidflowing.png^[colorize:#0000FF:127", backface_culling=false},
}, },
use_texture_alpha = true, use_texture_alpha = "blend",
waving = 3, waving = 3,
walkable = false, walkable = false,
liquidtype = "flowing",
liquid_range = 1, liquid_range = 1,
liquid_viscosity = 0, liquid_viscosity = 0,
liquid_alternative_flowing = "testnodes:liquid_flowing_waving", liquid_alternative_flowing = "testnodes:liquid_flowing_waving",
@ -443,8 +446,6 @@ minetest.register_node("testnodes:liquid_flowing_waving", {
groups = { dig_immediate = 3 }, groups = { dig_immediate = 3 },
}) })
-- Invisible node -- Invisible node
minetest.register_node("testnodes:airlike", { minetest.register_node("testnodes:airlike", {
description = S("Airlike Drawtype Test Node"), description = S("Airlike Drawtype Test Node"),

View File

@ -9,11 +9,9 @@ for d=0, 8 do
{name = "testnodes_liquidsource_r"..d..".png", backface_culling = false}, {name = "testnodes_liquidsource_r"..d..".png", backface_culling = false},
{name = "testnodes_liquidsource_r"..d..".png", backface_culling = true}, {name = "testnodes_liquidsource_r"..d..".png", backface_culling = true},
}, },
alpha = 192, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
pointable = false,
diggable = false,
buildable_to = true, buildable_to = true,
is_ground_content = false, is_ground_content = false,
liquidtype = "source", liquidtype = "source",
@ -30,12 +28,10 @@ for d=0, 8 do
{name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false},
{name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false}, {name = "testnodes_liquidflowing_r"..d..".png", backface_culling = false},
}, },
alpha = 192, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
paramtype2 = "flowingliquid", paramtype2 = "flowingliquid",
walkable = false, walkable = false,
pointable = false,
diggable = false,
buildable_to = true, buildable_to = true,
is_ground_content = false, is_ground_content = false,
liquidtype = "flowing", liquidtype = "flowing",
@ -53,11 +49,9 @@ for d=0, 8 do
{name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false}, {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = false},
{name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true}, {name = "testnodes_liquidsource_r"..d..".png"..mod, backface_culling = true},
}, },
alpha = 192, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
walkable = false, walkable = false,
pointable = false,
diggable = false,
buildable_to = true, buildable_to = true,
is_ground_content = false, is_ground_content = false,
liquidtype = "source", liquidtype = "source",
@ -74,12 +68,10 @@ for d=0, 8 do
{name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false},
{name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false}, {name = "testnodes_liquidflowing_r"..d..".png"..mod, backface_culling = false},
}, },
alpha = 192, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
paramtype2 = "flowingliquid", paramtype2 = "flowingliquid",
walkable = false, walkable = false,
pointable = false,
diggable = false,
buildable_to = true, buildable_to = true,
is_ground_content = false, is_ground_content = false,
liquidtype = "flowing", liquidtype = "flowing",

View File

@ -114,11 +114,10 @@ minetest.register_node("testnodes:liquid_nojump", {
{name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = false}, {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = false},
{name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = true}, {name = "testnodes_liquidsource.png^[colorize:#FF0000:127", backface_culling = true},
}, },
use_texture_alpha = true, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
pointable = false, pointable = false,
liquids_pointable = true, liquids_pointable = true,
diggable = false,
buildable_to = true, buildable_to = true,
is_ground_content = false, is_ground_content = false,
post_effect_color = {a = 70, r = 255, g = 0, b = 200}, post_effect_color = {a = 70, r = 255, g = 0, b = 200},
@ -143,12 +142,11 @@ minetest.register_node("testnodes:liquidflowing_nojump", {
{name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false},
{name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false}, {name = "testnodes_liquidflowing.png^[colorize:#FF0000:127", backface_culling = false},
}, },
use_texture_alpha = true, use_texture_alpha = "blend",
paramtype = "light", paramtype = "light",
paramtype2 = "flowingliquid", paramtype2 = "flowingliquid",
pointable = false, pointable = false,
liquids_pointable = true, liquids_pointable = true,
diggable = false,
buildable_to = true, buildable_to = true,
is_ground_content = false, is_ground_content = false,
post_effect_color = {a = 70, r = 255, g = 0, b = 200}, post_effect_color = {a = 70, r = 255, g = 0, b = 200},

View File

@ -46,77 +46,22 @@ for a=1,#alphas do
tiles = { tiles = {
"testnodes_alpha"..alpha..".png", "testnodes_alpha"..alpha..".png",
}, },
use_texture_alpha = true, use_texture_alpha = "blend",
groups = { dig_immediate = 3 }, groups = { dig_immediate = 3 },
}) })
-- Transparency set via "alpha" parameter -- Transparency set via texture modifier
minetest.register_node("testnodes:alpha_"..alpha, { minetest.register_node("testnodes:alpha_"..alpha, {
description = S("Alpha Test Node (@1)", alpha), description = S("Alpha Test Node (@1)", alpha),
-- It seems that only the liquid drawtype supports the alpha parameter drawtype = "glasslike",
drawtype = "liquid",
paramtype = "light", paramtype = "light",
tiles = { tiles = {
"testnodes_alpha.png", "testnodes_alpha.png^[opacity:" .. alpha,
}, },
alpha = alpha, use_texture_alpha = "blend",
liquidtype = "source",
liquid_range = 0,
liquid_viscosity = 0,
liquid_alternative_source = "testnodes:alpha_"..alpha,
liquid_alternative_flowing = "testnodes:alpha_"..alpha,
groups = { dig_immediate = 3 }, groups = { dig_immediate = 3 },
}) })
end end
-- Bumpmapping and Parallax Occlusion
-- This node has a normal map which corresponds to a pyramid with sides tilted
-- by an angle of 45°, i.e. the normal map contains four vectors which point
-- diagonally away from the surface (e.g. (0.7, 0.7, 0)),
-- and the heights in the height map linearly increase towards the centre,
-- so that the surface corresponds to a simple pyramid.
-- The node can help to determine if e.g. tangent space transformations work
-- correctly.
-- If, for example, the light comes from above, then the (tilted) pyramids
-- should look like they're lit from this light direction on all node faces.
-- The white albedo texture has small black indicators which can be used to see
-- how it is transformed ingame (and thus see if there's rotation around the
-- normal vector).
minetest.register_node("testnodes:height_pyramid", {
description = "Bumpmapping and Parallax Occlusion Tester (height pyramid)",
tiles = {"testnodes_height_pyramid.png"},
groups = {dig_immediate = 3},
})
-- The stairs nodes should help to validate if shading works correctly for
-- rotated nodes (which have rotated textures).
stairs.register_stair_and_slab("height_pyramid", "experimantal:height_pyramid",
{dig_immediate = 3},
{"testnodes_height_pyramid.png"},
"Bumpmapping and Parallax Occlusion Tester Stair (height pyramid)",
"Bumpmapping and Parallax Occlusion Tester Slab (height pyramid)")
-- This node has a simple heightmap for parallax occlusion testing and flat
-- normalmap.
-- When parallax occlusion is enabled, the yellow scrawl should stick out of
-- the texture when viewed at an angle.
minetest.register_node("testnodes:parallax_extruded", {
description = "Parallax Occlusion Tester",
tiles = {"testnodes_parallax_extruded.png"},
groups = {dig_immediate = 3},
})
-- Analogously to the height pyramid stairs nodes,
-- these nodes should help to validate if parallax occlusion works correctly for
-- rotated nodes (which have rotated textures).
stairs.register_stair_and_slab("parallax_extruded",
"experimantal:parallax_extruded",
{dig_immediate = 3},
{"testnodes_parallax_extruded.png"},
"Parallax Occlusion Tester Stair",
"Parallax Occlusion Tester Slab")

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 B

View File

@ -75,10 +75,10 @@
# type: bool # type: bool
# always_fly_fast = true # always_fly_fast = true
# The time in seconds it takes between repeated right clicks when holding the right # The time in seconds it takes between repeated node placements when holding
# mouse button. # the place button.
# type: float min: 0.001 # type: float min: 0.001
# repeat_rightclick_time = 0.25 # repeat_place_time = 0.25
# Automatically jump up single-node obstacles. # Automatically jump up single-node obstacles.
# type: bool # type: bool
@ -130,6 +130,7 @@
# repeat_joystick_button_time = 0.17 # repeat_joystick_button_time = 0.17
# The deadzone of the joystick # The deadzone of the joystick
# type: int
# joystick_deadzone = 2048 # joystick_deadzone = 2048
# The sensitivity of the joystick axes for moving the # The sensitivity of the joystick axes for moving the
@ -169,6 +170,16 @@
# type: key # type: key
# keymap_sneak = KEY_LSHIFT # keymap_sneak = KEY_LSHIFT
# Key for digging.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key
# keymap_dig = KEY_LBUTTON
# Key for placing.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key
# keymap_place = KEY_RBUTTON
# Key for opening the inventory. # Key for opening the inventory.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3 # See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key # type: key
@ -572,8 +583,13 @@
# type: int # type: int
# texture_min_size = 64 # texture_min_size = 64
# Experimental option, might cause visible spaces between blocks # Use multi-sample antialiasing (MSAA) to smooth out block edges.
# when set to higher number than 0. # This algorithm smooths out the 3D viewport while keeping the image sharp,
# but it doesn't affect the insides of textures
# (which is especially noticeable with transparent textures).
# Visible spaces appear between nodes when shaders are disabled.
# If set to 0, MSAA is disabled.
# A restart is required after changing this option.
# type: enum values: 0, 1, 2, 4, 8, 16 # type: enum values: 0, 1, 2, 4, 8, 16
# fsaa = 0 # fsaa = 0
@ -605,37 +621,6 @@
# type: bool # type: bool
# tone_mapping = false # tone_mapping = false
#### Bumpmapping
# Enables bumpmapping for textures. Normalmaps need to be supplied by the texture pack.
# Requires shaders to be enabled.
# type: bool
# enable_bumpmapping = false
#### Parallax Occlusion
# Enables parallax occlusion mapping.
# Requires shaders to be enabled.
# type: bool
# enable_parallax_occlusion = false
# 0 = parallax occlusion with slope information (faster).
# 1 = relief mapping (slower, more accurate).
# type: int min: 0 max: 1
# parallax_occlusion_mode = 1
# Number of parallax occlusion iterations.
# type: int
# parallax_occlusion_iterations = 4
# Overall scale of parallax occlusion effect.
# type: float
# parallax_occlusion_scale = 0.08
# Overall bias of parallax occlusion effect, usually scale/2.
# type: float
# parallax_occlusion_bias = 0.04
#### Waving Nodes #### Waving Nodes
# Set to true to enable waving liquids (like water). # Set to true to enable waving liquids (like water).
@ -684,9 +669,9 @@
# type: int min: 1 # type: int min: 1
# fps_max = 60 # fps_max = 60
# Maximum FPS when game is paused. # Maximum FPS when the window is not focused, or when the game is paused.
# type: int min: 1 # type: int min: 1
# pause_fps_max = 20 # fps_max_unfocused = 20
# Open the pause menu when the window's focus is lost. Does not pause if a formspec is # Open the pause menu when the window's focus is lost. Does not pause if a formspec is
# open. # open.
@ -695,7 +680,7 @@
# View distance in nodes. # View distance in nodes.
# type: int min: 20 max: 4000 # type: int min: 20 max: 4000
# viewing_range = 100 # viewing_range = 190
# Camera 'near clipping plane' distance in nodes, between 0 and 0.25 # Camera 'near clipping plane' distance in nodes, between 0 and 0.25
# Only works on GLES platforms. Most users will not need to change this. # Only works on GLES platforms. Most users will not need to change this.
@ -774,8 +759,8 @@
# The rendering back-end for Irrlicht. # The rendering back-end for Irrlicht.
# A restart is required after changing this. # A restart is required after changing this.
# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise. # Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
# On other platforms, OpenGL is recommended, and its the only driver with # On other platforms, OpenGL is recommended.
# shader support currently. # Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
# type: enum values: null, software, burningsvideo, direct3d8, direct3d9, opengl, ogles1, ogles2 # type: enum values: null, software, burningsvideo, direct3d8, direct3d9, opengl, ogles1, ogles2
# video_driver = opengl # video_driver = opengl
@ -848,10 +833,12 @@
# selectionbox_width = 2 # selectionbox_width = 2
# Crosshair color (R,G,B). # Crosshair color (R,G,B).
# Also controls the object crosshair color
# type: string # type: string
# crosshair_color = (255,255,255) # crosshair_color = (255,255,255)
# Crosshair alpha (opaqueness, between 0 and 255). # Crosshair alpha (opaqueness, between 0 and 255).
# Also controls the object crosshair color
# type: int min: 0 max: 255 # type: int min: 0 max: 255
# crosshair_alpha = 255 # crosshair_alpha = 255
@ -1160,7 +1147,7 @@
# File in client/serverlist/ that contains your favorite servers displayed in the # File in client/serverlist/ that contains your favorite servers displayed in the
# Multiplayer Tab. # Multiplayer Tab.
# type: string # type: string
# serverlist_file = favoriteservers.txt # serverlist_file = favoriteservers.json
# Maximum size of the out chat queue. # Maximum size of the out chat queue.
# 0 to disable queueing and -1 to make the queue size unlimited. # 0 to disable queueing and -1 to make the queue size unlimited.
@ -1181,7 +1168,7 @@
# Maximum number of mapblocks for client to be kept in memory. # Maximum number of mapblocks for client to be kept in memory.
# Set to -1 for unlimited amount. # Set to -1 for unlimited amount.
# type: int # type: int
# client_mapblock_limit = 5000 # client_mapblock_limit = 7500
# Whether to show the client debug info (has the same effect as hitting F5). # Whether to show the client debug info (has the same effect as hitting F5).
# type: bool # type: bool
@ -1269,6 +1256,14 @@
# type: int # type: int
# max_packets_per_iteration = 1024 # max_packets_per_iteration = 1024
# ZLib compression level to use when sending mapblocks to the client.
# -1 - Zlib's default compression level
# 0 - no compresson, fastest
# 9 - best compression, slowest
# (levels 1-3 use Zlib's "fast" method, 4-9 use the normal method)
# type: int min: -1 max: 9
# map_compression_level_net = -1
## Game ## Game
# Default game when creating a new world. # Default game when creating a new world.
@ -1383,7 +1378,7 @@
# to maintain active objects up to this distance in the direction the # to maintain active objects up to this distance in the direction the
# player is looking. (This can avoid mobs suddenly disappearing from view) # player is looking. (This can avoid mobs suddenly disappearing from view)
# type: int # type: int
# active_object_send_range_blocks = 4 # active_object_send_range_blocks = 8
# The radius of the volume of blocks around every player that is subject to the # The radius of the volume of blocks around every player that is subject to the
# active block stuff, stated in mapblocks (16 nodes). # active block stuff, stated in mapblocks (16 nodes).
@ -1391,11 +1386,11 @@
# This is also the minimum range in which active objects (mobs) are maintained. # This is also the minimum range in which active objects (mobs) are maintained.
# This should be configured together with active_object_send_range_blocks. # This should be configured together with active_object_send_range_blocks.
# type: int # type: int
# active_block_range = 3 # active_block_range = 4
# From how far blocks are sent to clients, stated in mapblocks (16 nodes). # From how far blocks are sent to clients, stated in mapblocks (16 nodes).
# type: int # type: int
# max_block_send_distance = 10 # max_block_send_distance = 12
# Maximum number of forceloaded mapblocks. # Maximum number of forceloaded mapblocks.
# type: int # type: int
@ -1488,11 +1483,11 @@
### Advanced ### Advanced
# Handling for deprecated Lua API calls: # Handling for deprecated Lua API calls:
# - legacy: (try to) mimic old behaviour (default for release). # - none: Do not log deprecated calls
# - log: mimic and log backtrace of deprecated call (default for debug). # - log: mimic and log backtrace of deprecated call (default).
# - error: abort on usage of deprecated call (suggested for mod developers). # - error: abort on usage of deprecated call (suggested for mod developers).
# type: enum values: legacy, log, error # type: enum values: none, log, error
# deprecated_lua_api_handling = legacy # deprecated_lua_api_handling = log
# Number of extra blocks that can be loaded by /clearobjects at once. # Number of extra blocks that can be loaded by /clearobjects at once.
# This is a trade-off between sqlite transaction overhead and # This is a trade-off between sqlite transaction overhead and
@ -1513,6 +1508,14 @@
# type: enum values: 0, 1, 2 # type: enum values: 0, 1, 2
# sqlite_synchronous = 2 # sqlite_synchronous = 2
# ZLib compression level to use when saving mapblocks to disk.
# -1 - Zlib's default compression level
# 0 - no compresson, fastest
# 9 - best compression, slowest
# (levels 1-3 use Zlib's "fast" method, 4-9 use the normal method)
# type: int min: -1 max: 9
# map_compression_level_disk = 3
# Length of a server tick and the interval at which objects are generally updated over # Length of a server tick and the interval at which objects are generally updated over
# network. # network.
# type: float # type: float
@ -1526,6 +1529,11 @@
# type: float # type: float
# abm_interval = 1.0 # abm_interval = 1.0
# The time budget allowed for ABMs to execute on each step
# (as a fraction of the ABM Interval)
# type: float min: 0.1 max: 0.9
# abm_time_budget = 0.2
# Length of time between NodeTimer execution cycles # Length of time between NodeTimer execution cycles
# type: float # type: float
# nodetimer_interval = 0.2 # nodetimer_interval = 0.2
@ -1722,13 +1730,6 @@
# type: bool # type: bool
# high_precision_fpu = true # high_precision_fpu = true
# Changes the main menu UI:
# - Full: Multiple singleplayer worlds, game choice, texture pack chooser, etc.
# - Simple: One singleplayer world, no game or texture pack choosers. May be
# necessary for smaller screens.
# type: enum values: full, simple
# main_menu_style = full
# Replaces the default main menu with a custom one. # Replaces the default main menu with a custom one.
# type: string # type: string
# main_menu_script = # main_menu_script =
@ -1755,7 +1756,7 @@
# From how far blocks are generated for clients, stated in mapblocks (16 nodes). # From how far blocks are generated for clients, stated in mapblocks (16 nodes).
# type: int # type: int
# max_block_generate_distance = 8 # max_block_generate_distance = 10
# Limit of map generation, in nodes, in all 6 directions from (0, 0, 0). # Limit of map generation, in nodes, in all 6 directions from (0, 0, 0).
# Only mapchunks completely within the mapgen limit are generated. # Only mapchunks completely within the mapgen limit are generated.
@ -1766,8 +1767,8 @@
# Global map generation attributes. # Global map generation attributes.
# In Mapgen v6 the 'decorations' flag controls all decorations except trees # In Mapgen v6 the 'decorations' flag controls all decorations except trees
# and junglegrass, in all other mapgens this flag controls all decorations. # and junglegrass, in all other mapgens this flag controls all decorations.
# type: flags possible values: caves, dungeons, light, decorations, biomes, nocaves, nodungeons, nolight, nodecorations, nobiomes # type: flags possible values: caves, dungeons, light, decorations, biomes, ores, nocaves, nodungeons, nolight, nodecorations, nobiomes, noores
# mg_flags = caves,dungeons,light,decorations,biomes # mg_flags = caves,dungeons,light,decorations,biomes,ores
## Biome API temperature and humidity noise parameters ## Biome API temperature and humidity noise parameters
@ -2753,8 +2754,8 @@
# Map generation attributes specific to Mapgen Flat. # Map generation attributes specific to Mapgen Flat.
# Occasional lakes and hills can be added to the flat world. # Occasional lakes and hills can be added to the flat world.
# type: flags possible values: lakes, hills, nolakes, nohills # type: flags possible values: lakes, hills, caverns, nolakes, nohills, nocaverns
# mgflat_spflags = nolakes,nohills # mgflat_spflags = nolakes,nohills,nocaverns
# Y of flat ground. # Y of flat ground.
# type: int # type: int
@ -2810,6 +2811,18 @@
# type: float # type: float
# mgflat_hill_steepness = 64.0 # mgflat_hill_steepness = 64.0
# Y-level of cavern upper limit.
# type: int
# mgflat_cavern_limit = -256
# Y-distance over which caverns expand to full size.
# type: int
# mgflat_cavern_taper = 256
# Defines full size of caverns, smaller values create larger caverns.
# type: float
# mgflat_cavern_threshold = 0.7
# Lower Y limit of dungeons. # Lower Y limit of dungeons.
# type: int # type: int
# mgflat_dungeon_ymin = -31000 # mgflat_dungeon_ymin = -31000
@ -2872,6 +2885,19 @@
# flags = # flags =
# } # }
# 3D noise defining giant caverns.
# type: noise_params_3d
# mgflat_np_cavern = {
# offset = 0,
# scale = 1,
# spread = (384, 128, 384),
# seed = 723,
# octaves = 5,
# persistence = 0.63,
# lacunarity = 2.0,
# flags =
# }
# 3D noise that determines number of dungeons per mapchunk. # 3D noise that determines number of dungeons per mapchunk.
# type: noise_params_3d # type: noise_params_3d
# mgflat_np_dungeons = { # mgflat_np_dungeons = {
@ -3322,17 +3348,17 @@
# Maximum number of blocks that can be queued for loading. # Maximum number of blocks that can be queued for loading.
# type: int # type: int
# emergequeue_limit_total = 512 # emergequeue_limit_total = 1024
# Maximum number of blocks to be queued that are to be loaded from file. # Maximum number of blocks to be queued that are to be loaded from file.
# This limit is enforced per player. # This limit is enforced per player.
# type: int # type: int
# emergequeue_limit_diskonly = 64 # emergequeue_limit_diskonly = 128
# Maximum number of blocks to be queued that are to be generated. # Maximum number of blocks to be queued that are to be generated.
# This limit is enforced per player. # This limit is enforced per player.
# type: int # type: int
# emergequeue_limit_generate = 64 # emergequeue_limit_generate = 128
# Number of emerge threads to use. # Number of emerge threads to use.
# Value 0: # Value 0:
@ -3363,3 +3389,9 @@
# so see a full list at https://content.minetest.net/help/content_flags/ # so see a full list at https://content.minetest.net/help/content_flags/
# type: string # type: string
# contentdb_flag_blacklist = nonfree, desktop_default # contentdb_flag_blacklist = nonfree, desktop_default
# Maximum number of concurrent downloads. Downloads exceeding this limit will be queued.
# This should be lower than curl_parallel_limit.
# type: int
# contentdb_max_concurrent_downloads = 3

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="minetest" version="0.0.0.0" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security> <security>
<requestedPrivileges> <requestedPrivileges>
@ -10,6 +11,7 @@
<application xmlns="urn:schemas-microsoft-com:asm.v3"> <application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings> <windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
</windowsSettings> </windowsSettings>
</application> </application>
</assembly> </assembly>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: minetest\n" "Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
<<<<<<< HEAD
"POT-Creation-Date: 2020-08-22 14:59+0200\n" "POT-Creation-Date: 2020-08-22 14:59+0200\n"
=======
"POT-Creation-Date: 2021-01-30 21:13+0100\n"
>>>>>>> 9736b9cea5f841bb0e9bb2c9c05c3b2560327064
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -41,14 +45,6 @@ msgstr ""
msgid "An error occurred:" msgid "An error occurred:"
msgstr "" msgstr ""
#: builtin/mainmenu/common.lua src/client/game.cpp
msgid "Loading..."
msgstr ""
#: builtin/mainmenu/common.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
#: builtin/mainmenu/common.lua #: builtin/mainmenu/common.lua
msgid "Server supports protocol versions between $1 and $2. " msgid "Server supports protocol versions between $1 and $2. "
msgstr "" msgstr ""
@ -97,7 +93,8 @@ msgstr ""
msgid "Optional dependencies:" msgid "Optional dependencies:"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/tab_content.lua #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/tab_content.lua
msgid "Dependencies:" msgid "Dependencies:"
msgstr "" msgstr ""
@ -110,7 +107,8 @@ msgstr ""
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_config_world.lua builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_create_world.lua
#: builtin/mainmenu/dlg_delete_content.lua #: builtin/mainmenu/dlg_delete_content.lua
#: builtin/mainmenu/dlg_delete_world.lua #: builtin/mainmenu/dlg_delete_world.lua
#: builtin/mainmenu/dlg_rename_modpack.lua #: builtin/mainmenu/dlg_rename_modpack.lua
@ -177,14 +175,79 @@ msgid "Failed to download $1"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua #: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua msgid "Already installed"
msgid "Search" msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 by $2"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Not found"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 and $2 dependencies will be installed."
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 will be installed, and $2 dependencies will be skipped."
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 required dependencies could not be found."
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Please check that the base game is correct."
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install $1"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Base Game:"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install missing dependencies"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "\"$1\" already exists. Would you like to overwrite it?"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Overwrite"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua #: builtin/mainmenu/dlg_contentstore.lua
msgid "Back to Main Menu" msgid "Back to Main Menu"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid ""
"$1 downloading,\n"
"$2 queued"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "$1 downloading..."
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "No updates"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Update All [$1]"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua #: builtin/mainmenu/dlg_contentstore.lua
msgid "No results" msgid "No results"
msgstr "" msgstr ""
@ -198,7 +261,7 @@ msgid "Downloading..."
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua #: builtin/mainmenu/dlg_contentstore.lua
msgid "Install" msgid "Queued"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua #: builtin/mainmenu/dlg_contentstore.lua
@ -210,7 +273,7 @@ msgid "Uninstall"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua #: builtin/mainmenu/dlg_contentstore.lua
msgid "View" msgid "View more information in a web browser"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_create_world.lua #: builtin/mainmenu/dlg_create_world.lua
@ -559,6 +622,10 @@ msgstr ""
msgid "Select file" msgid "Select file"
msgstr "" msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Search"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua #: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page" msgid "< Back to Settings page"
msgstr "" msgstr ""
@ -623,6 +690,14 @@ msgstr ""
msgid "$1 mods" msgid "$1 mods"
msgstr "" msgstr ""
#: builtin/mainmenu/serverlistmgr.lua src/client/game.cpp
msgid "Loading..."
msgstr ""
#: builtin/mainmenu/serverlistmgr.lua
msgid "Try reenabling public serverlist and check your internet connection."
msgstr ""
#: builtin/mainmenu/tab_content.lua #: builtin/mainmenu/tab_content.lua
msgid "Installed Packages:" msgid "Installed Packages:"
msgstr "" msgstr ""
@ -687,12 +762,22 @@ msgstr ""
msgid "Previous Contributors" msgid "Previous Contributors"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_credits.lua
msgid ""
"Opens the directory that contains user-provided worlds, games, mods,\n"
"and texture packs in a file manager / explorer."
msgstr ""
#: builtin/mainmenu/tab_credits.lua
msgid "Open User Data Directory"
msgstr ""
#: builtin/mainmenu/tab_local.lua #: builtin/mainmenu/tab_local.lua
msgid "Install games from ContentDB" msgid "Install games from ContentDB"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_local.lua #: builtin/mainmenu/tab_local.lua
msgid "Configure" msgid "Select Mods"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_local.lua #: builtin/mainmenu/tab_local.lua
@ -703,11 +788,11 @@ msgstr ""
msgid "Select World:" msgid "Select World:"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_local.lua
msgid "Creative Mode" msgid "Creative Mode"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_local.lua
msgid "Enable Damage" msgid "Enable Damage"
msgstr "" msgstr ""
@ -724,7 +809,11 @@ msgid "Announce Server"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_local.lua #: builtin/mainmenu/tab_local.lua
msgid "Name/Password" msgid "Name"
msgstr ""
#: builtin/mainmenu/tab_local.lua
msgid "Password"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_local.lua #: builtin/mainmenu/tab_local.lua
@ -755,36 +844,36 @@ msgstr ""
msgid "Address / Port" msgid "Address / Port"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "Name / Password" msgid "Name / Password"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "Connect" msgid "Connect"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite" msgid "Del. Favorite"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "Favorite" msgid "Favorite"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "Ping" msgid "Ping"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "Creative mode" msgid "Creative mode"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "Damage enabled" msgid "Damage enabled"
msgstr "" msgstr ""
#. ~ PvP = Player versus Player #. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua #: builtin/mainmenu/tab_online.lua
msgid "PvP enabled" msgid "PvP enabled"
msgstr "" msgstr ""
@ -852,18 +941,6 @@ msgstr ""
msgid "8x" msgid "8x"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Are you sure to reset your singleplayer world?"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Yes"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "No"
msgstr ""
#: builtin/mainmenu/tab_settings.lua #: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting" msgid "Smooth Lighting"
msgstr "" msgstr ""
@ -905,11 +982,11 @@ msgid "Shaders"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_settings.lua #: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)" msgid "Shaders (experimental)"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_settings.lua #: builtin/mainmenu/tab_settings.lua
msgid "Reset singleplayer world" msgid "Shaders (unavailable)"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp #: builtin/mainmenu/tab_settings.lua src/client/game.cpp
@ -924,22 +1001,10 @@ msgstr ""
msgid "Touchthreshold: (px)" msgid "Touchthreshold: (px)"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Bump Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp #: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping" msgid "Tone Mapping"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Generate Normal Maps"
msgstr ""
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Parallax Occlusion"
msgstr ""
#: builtin/mainmenu/tab_settings.lua #: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids" msgid "Waving Liquids"
msgstr "" msgstr ""
@ -960,18 +1025,6 @@ msgstr ""
msgid "Settings" msgid "Settings"
msgstr "" msgstr ""
#: builtin/mainmenu/tab_simple_main.lua
msgid "Start Singleplayer"
msgstr ""
#: builtin/mainmenu/tab_simple_main.lua
msgid "Config mods"
msgstr ""
#: builtin/mainmenu/tab_simple_main.lua
msgid "Main"
msgstr ""
#: src/client/client.cpp #: src/client/client.cpp
msgid "Connection timed out." msgid "Connection timed out."
msgstr "" msgstr ""
@ -1189,34 +1242,6 @@ msgstr ""
msgid "Automatic forward disabled" msgid "Automatic forward disabled"
msgstr "" msgstr ""
#: src/client/game.cpp
msgid "Minimap in surface mode, Zoom x1"
msgstr ""
#: src/client/game.cpp
msgid "Minimap in surface mode, Zoom x2"
msgstr ""
#: src/client/game.cpp
msgid "Minimap in surface mode, Zoom x4"
msgstr ""
#: src/client/game.cpp
msgid "Minimap in radar mode, Zoom x1"
msgstr ""
#: src/client/game.cpp
msgid "Minimap in radar mode, Zoom x2"
msgstr ""
#: src/client/game.cpp
msgid "Minimap in radar mode, Zoom x4"
msgstr ""
#: src/client/game.cpp
msgid "Minimap hidden"
msgstr ""
#: src/client/game.cpp #: src/client/game.cpp
msgid "Minimap currently disabled by game or mod" msgid "Minimap currently disabled by game or mod"
msgstr "" msgstr ""
@ -1316,14 +1341,14 @@ msgid ""
"- %s: move backwards\n" "- %s: move backwards\n"
"- %s: move left\n" "- %s: move left\n"
"- %s: move right\n" "- %s: move right\n"
"- %s: jump/climb\n" "- %s: jump/climb up\n"
"- %s: sneak/go down\n" "- %s: dig/punch\n"
"- %s: place/use\n"
"- %s: sneak/climb down\n"
"- %s: drop item\n" "- %s: drop item\n"
"- %s: inventory\n" "- %s: inventory\n"
"- %s: special inventory\n" "- %s: special inventory\n"
"- Mouse: turn/look\n" "- Mouse: turn/look\n"
"- Mouse left: dig/punch\n"
"- Mouse right: place/use\n"
"- Mouse wheel: select item\n" "- Mouse wheel: select item\n"
"- %s: chat\n" "- %s: chat\n"
"- %s: Killaura\n" "- %s: Killaura\n"
@ -1713,6 +1738,24 @@ msgstr ""
msgid "OEM Clear" msgid "OEM Clear"
msgstr "" msgstr ""
#: src/client/minimap.cpp
msgid "Minimap hidden"
msgstr ""
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in surface mode, Zoom x%d"
msgstr ""
#: src/client/minimap.cpp
#, c-format
msgid "Minimap in radar mode, Zoom x%d"
msgstr ""
#: src/client/minimap.cpp
msgid "Minimap in texture mode"
msgstr ""
#: src/gui/guiConfirmRegistration.cpp #: src/gui/guiConfirmRegistration.cpp
#, c-format #, c-format
msgid "" msgid ""
@ -2085,14 +2128,13 @@ msgid ""
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Rightclick repetition interval" msgid "Place repetition interval"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "" msgid ""
"The time in seconds it takes between repeated right clicks when holding the " "The time in seconds it takes between repeated node placements when holding\n"
"right\n" "the place button."
"mouse button."
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
@ -2186,6 +2228,14 @@ msgid ""
"when holding down a joystick button combination." "when holding down a joystick button combination."
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "Joystick deadzone"
msgstr ""
#: src/settings_translation_file.cpp
msgid "The deadzone of the joystick"
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Joystick frustum sensitivity" msgid "Joystick frustum sensitivity"
msgstr "" msgstr ""
@ -2265,6 +2315,28 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3" "html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "Dig key"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Key for digging.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Place key"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Key for placing.\n"
"See http://irrlicht.sourceforge.net/docu/namespaceirr."
"html#a54da2a0e231901735e3da1b0edf72eb3"
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Inventory key" msgid "Inventory key"
msgstr "" msgstr ""
@ -3116,8 +3188,13 @@ msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "" msgid ""
"Experimental option, might cause visible spaces between blocks\n" "Use multi-sample antialiasing (MSAA) to smooth out block edges.\n"
"when set to higher number than 0." "This algorithm smooths out the 3D viewport while keeping the image sharp,\n"
"but it doesn't affect the insides of textures\n"
"(which is especially noticeable with transparent textures).\n"
"Visible spaces appear between nodes when shaders are disabled.\n"
"If set to 0, MSAA is disabled.\n"
"A restart is required after changing this option."
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
@ -3163,90 +3240,6 @@ msgid ""
"enhanced, highlights and shadows are gradually compressed." "enhanced, highlights and shadows are gradually compressed."
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "Bumpmapping"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Enables bumpmapping for textures. Normalmaps need to be supplied by the "
"texture pack\n"
"or need to be auto-generated.\n"
"Requires shaders to be enabled."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Generate normalmaps"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Enables on the fly normalmap generation (Emboss effect).\n"
"Requires bumpmapping to be enabled."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Normalmaps strength"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Strength of generated normalmaps."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Normalmaps sampling"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Defines sampling step of texture.\n"
"A higher value results in smoother normal maps."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Parallax occlusion"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Enables parallax occlusion mapping.\n"
"Requires shaders to be enabled."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Parallax occlusion mode"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"0 = parallax occlusion with slope information (faster).\n"
"1 = relief mapping (slower, more accurate)."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Parallax occlusion iterations"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Number of parallax occlusion iterations."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Parallax occlusion scale"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Overall scale of parallax occlusion effect."
msgstr ""
#: src/settings_translation_file.cpp
msgid "Parallax occlusion bias"
msgstr ""
#: src/settings_translation_file.cpp
msgid "Overall bias of parallax occlusion effect, usually scale/2."
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Waving Nodes" msgid "Waving Nodes"
msgstr "" msgstr ""
@ -3340,11 +3333,11 @@ msgid ""
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "FPS in pause menu" msgid "FPS when unfocused or paused"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Maximum FPS when game is paused." msgid "Maximum FPS when the window is not focused, or when the game is paused."
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
@ -3517,8 +3510,8 @@ msgid ""
"A restart is required after changing this.\n" "A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start " "Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n" "otherwise.\n"
"On other platforms, OpenGL is recommended, and its the only driver with\n" "On other platforms, OpenGL is recommended.\n"
"shader support currently." "Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
@ -3655,7 +3648,9 @@ msgid "Crosshair color"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Crosshair color (R,G,B)." msgid ""
"Crosshair color (R,G,B).\n"
"Also controls the object crosshair color"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
@ -3663,7 +3658,9 @@ msgid "Crosshair alpha"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Crosshair alpha (opaqueness, between 0 and 255)." msgid ""
"Crosshair alpha (opaqueness, between 0 and 255).\n"
"Also controls the object crosshair color"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
@ -3833,6 +3830,12 @@ msgstr ""
msgid "Show entity selection boxes" msgid "Show entity selection boxes"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Show entity selection boxes\n"
"A restart is required after changing this."
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Menus" msgid "Menus"
msgstr "" msgstr ""
@ -4415,6 +4418,19 @@ msgid ""
"client number." "client number."
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Network Transfer"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"ZLib compression level to use when sending mapblocks to the client.\n"
"-1 - Zlib's default compression level\n"
"0 - no compresson, fastest\n"
"9 - best compression, slowest\n"
"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Default game" msgid "Default game"
msgstr "" msgstr ""
@ -4848,8 +4864,8 @@ msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "" msgid ""
"Handling for deprecated Lua API calls:\n" "Handling for deprecated Lua API calls:\n"
"- legacy: (try to) mimic old behaviour (default for release).\n" "- none: Do not log deprecated calls\n"
"- log: mimic and log backtrace of deprecated call (default for debug).\n" "- log: mimic and log backtrace of deprecated call (default).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)." "- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr "" msgstr ""
@ -4890,6 +4906,19 @@ msgstr ""
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous" msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "Map Compression Level for Disk Storage"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"ZLib compression level to use when saving mapblocks to disk.\n"
"-1 - Zlib's default compression level\n"
"0 - no compresson, fastest\n"
"9 - best compression, slowest\n"
"(levels 1-3 use Zlib's \"fast\" method, 4-9 use the normal method)"
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Dedicated server step" msgid "Dedicated server step"
msgstr "" msgstr ""
@ -4917,6 +4946,16 @@ msgstr ""
msgid "Length of time between Active Block Modifier (ABM) execution cycles" msgid "Length of time between Active Block Modifier (ABM) execution cycles"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "ABM time budget"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The time budget allowed for ABMs to execute on each step\n"
"(as a fraction of the ABM Interval)"
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "NodeTimer interval" msgid "NodeTimer interval"
msgstr "" msgstr ""
@ -5270,20 +5309,6 @@ msgstr ""
msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles." msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "Main menu style"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Changes the main menu UI:\n"
"- Full: Multiple singleplayer worlds, game choice, texture pack chooser, "
"etc.\n"
"- Simple: One singleplayer world, no game or texture pack choosers. May "
"be\n"
"necessary for smaller screens."
msgstr ""
#: src/settings_translation_file.cpp #: src/settings_translation_file.cpp
msgid "Main menu script" msgid "Main menu script"
msgstr "" msgstr ""
@ -6395,3 +6420,14 @@ msgid ""
"These flags are independent from Minetest versions,\n" "These flags are independent from Minetest versions,\n"
"so see a full list at https://content.minetest.net/help/content_flags/" "so see a full list at https://content.minetest.net/help/content_flags/"
msgstr "" msgstr ""
#: src/settings_translation_file.cpp
msgid "ContentDB Max Concurrent Downloads"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Maximum number of concurrent downloads. Downloads exceeding this limit will "
"be queued.\n"
"This should be lower than curl_parallel_limit."
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -532,7 +532,7 @@ set(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin")
if(BUILD_CLIENT) if(BUILD_CLIENT)
add_executable(${PROJECT_NAME} ${client_SRCS} ${extra_windows_SRCS}) add_executable(${PROJECT_NAME} ${client_SRCS} ${extra_windows_SRCS})
add_dependencies(${PROJECT_NAME} GenerateVersion) add_dependencies(${PROJECT_NAME} GenerateVersion)
set(client_LIBS target_link_libraries(
${PROJECT_NAME} ${PROJECT_NAME}
${ZLIB_LIBRARIES} ${ZLIB_LIBRARIES}
${IRRLICHT_LIBRARY} ${IRRLICHT_LIBRARY}
@ -548,9 +548,14 @@ if(BUILD_CLIENT)
${PLATFORM_LIBS} ${PLATFORM_LIBS}
${CLIENT_PLATFORM_LIBS} ${CLIENT_PLATFORM_LIBS}
) )
target_link_libraries( if(NOT USE_LUAJIT)
${client_LIBS} set_target_properties(${PROJECT_NAME} PROPERTIES
) # This is necessary for dynamic Lua modules
# to work when Lua is statically linked (issue #10806)
ENABLE_EXPORTS 1
)
endif()
if(ENABLE_GLES) if(ENABLE_GLES)
target_link_libraries( target_link_libraries(
${PROJECT_NAME} ${PROJECT_NAME}
@ -621,7 +626,15 @@ if(BUILD_SERVER)
${PLATFORM_LIBS} ${PLATFORM_LIBS}
) )
set_target_properties(${PROJECT_NAME}server PROPERTIES set_target_properties(${PROJECT_NAME}server PROPERTIES
COMPILE_DEFINITIONS "SERVER") COMPILE_DEFINITIONS "SERVER")
if(NOT USE_LUAJIT)
set_target_properties(${PROJECT_NAME}server PROPERTIES
# This is necessary for dynamic Lua modules
# to work when Lua is statically linked (issue #10806)
ENABLE_EXPORTS 1
)
endif()
if (USE_GETTEXT) if (USE_GETTEXT)
target_link_libraries(${PROJECT_NAME}server ${GETTEXT_LIBRARY}) target_link_libraries(${PROJECT_NAME}server ${GETTEXT_LIBRARY})
endif() endif()
@ -666,7 +679,7 @@ option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
if (GETTEXTLIB_FOUND AND APPLY_LOCALE_BLACKLIST) if (GETTEXTLIB_FOUND AND APPLY_LOCALE_BLACKLIST)
set(GETTEXT_USED_LOCALES "") set(GETTEXT_USED_LOCALES "")
foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES}) foreach(LOCALE ${GETTEXT_AVAILABLE_LOCALES})
if (NOT ";${GETTEXT_BLACKLISTED_LOCALES};" MATCHES ";${LOCALE};") if (NOT "${LOCALE}" IN_LIST GETTEXT_BLACKLISTED_LOCALES)
list(APPEND GETTEXT_USED_LOCALES ${LOCALE}) list(APPEND GETTEXT_USED_LOCALES ${LOCALE})
endif() endif()
endforeach() endforeach()

View File

@ -28,11 +28,11 @@ enum ActiveObjectType {
ACTIVEOBJECT_TYPE_INVALID = 0, ACTIVEOBJECT_TYPE_INVALID = 0,
ACTIVEOBJECT_TYPE_TEST = 1, ACTIVEOBJECT_TYPE_TEST = 1,
// Obsolete stuff // Obsolete stuff
ACTIVEOBJECT_TYPE_ITEM = 2, // ACTIVEOBJECT_TYPE_ITEM = 2,
// ACTIVEOBJECT_TYPE_RAT = 3, // ACTIVEOBJECT_TYPE_RAT = 3,
// ACTIVEOBJECT_TYPE_OERKKI1 = 4, // ACTIVEOBJECT_TYPE_OERKKI1 = 4,
// ACTIVEOBJECT_TYPE_FIREFLY = 5, // ACTIVEOBJECT_TYPE_FIREFLY = 5,
ACTIVEOBJECT_TYPE_MOBV2 = 6, // ACTIVEOBJECT_TYPE_MOBV2 = 6,
// End obsolete stuff // End obsolete stuff
ACTIVEOBJECT_TYPE_LUAENTITY = 7, ACTIVEOBJECT_TYPE_LUAENTITY = 7,
// Special type, not stored as a static object // Special type, not stored as a static object

View File

@ -485,8 +485,8 @@ void ChatPrompt::nickCompletion(const std::list<std::string>& names, bool backwa
// find all names that start with the selected prefix // find all names that start with the selected prefix
std::vector<std::wstring> completions; std::vector<std::wstring> completions;
for (const std::string &name : names) { for (const std::string &name : names) {
if (str_starts_with(narrow_to_wide(name), prefix, true)) { std::wstring completion = utf8_to_wide(name);
std::wstring completion = narrow_to_wide(name); if (str_starts_with(completion, prefix, true)) {
if (prefix_start == 0) if (prefix_start == 0)
completion += L": "; completion += L": ";
completions.push_back(completion); completions.push_back(completion);

View File

@ -160,20 +160,6 @@ void Client::loadMods()
scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath()); scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath());
m_script->loadModFromMemory(BUILTIN_MOD_NAME); m_script->loadModFromMemory(BUILTIN_MOD_NAME);
// TODO Uncomment when server-sent CSM and verifying of builtin are complete
/*
// Don't load client-provided mods if disabled by server
if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOAD_CLIENT_MODS)) {
warningstream << "Client-provided mod loading is disabled by server." <<
std::endl;
// If builtin integrity is wrong, disconnect user
if (!checkBuiltinIntegrity()) {
// TODO disconnect user
}
return;
}
*/
ClientModConfiguration modconf(getClientModsLuaPath()); ClientModConfiguration modconf(getClientModsLuaPath());
m_mods = modconf.getMods(); m_mods = modconf.getMods();
// complain about mods with unsatisfied dependencies // complain about mods with unsatisfied dependencies
@ -219,12 +205,6 @@ void Client::loadMods()
m_script->on_minimap_ready(m_minimap); m_script->on_minimap_ready(m_minimap);
} }
bool Client::checkBuiltinIntegrity()
{
// TODO
return true;
}
void Client::scanModSubfolder(const std::string &mod_name, const std::string &mod_path, void Client::scanModSubfolder(const std::string &mod_name, const std::string &mod_path,
std::string mod_subpath) std::string mod_subpath)
{ {
@ -1219,7 +1199,7 @@ void Client::sendChatMessage(const std::wstring &message)
if (canSendChatMessage()) { if (canSendChatMessage()) {
u32 now = time(NULL); u32 now = time(NULL);
float time_passed = now - m_last_chat_message_sent; float time_passed = now - m_last_chat_message_sent;
m_last_chat_message_sent = time(NULL); m_last_chat_message_sent = now;
m_chat_message_allowance += time_passed * (CLIENT_CHAT_MESSAGE_LIMIT_PER_10S / 8.0f); m_chat_message_allowance += time_passed * (CLIENT_CHAT_MESSAGE_LIMIT_PER_10S / 8.0f);
if (m_chat_message_allowance > CLIENT_CHAT_MESSAGE_LIMIT_PER_10S) if (m_chat_message_allowance > CLIENT_CHAT_MESSAGE_LIMIT_PER_10S)
@ -1298,9 +1278,8 @@ void Client::sendPlayerPos(v3f pos)
// Save bandwidth by only updating position when // Save bandwidth by only updating position when
// player is not dead and something changed // player is not dead and something changed
// FIXME: This part causes breakages in mods like 3d_armor, and has been commented for now if (m_activeobjects_received && player->isDead())
// if (m_activeobjects_received && player->isDead()) return;
// return;
if ( if (
player->last_position == pos && player->last_position == pos &&
@ -1875,7 +1854,7 @@ void Client::makeScreenshot()
sstr << "Failed to save screenshot '" << filename << "'"; sstr << "Failed to save screenshot '" << filename << "'";
} }
pushToChatQueue(new ChatMessage(CHATMESSAGE_TYPE_SYSTEM, pushToChatQueue(new ChatMessage(CHATMESSAGE_TYPE_SYSTEM,
narrow_to_wide(sstr.str()))); utf8_to_wide(sstr.str())));
infostream << sstr.str() << std::endl; infostream << sstr.str() << std::endl;
image->drop(); image->drop();
} }

View File

@ -418,11 +418,6 @@ public:
return false; return false;
} }
u32 getCSMNodeRangeLimit() const
{
return m_csm_restriction_noderange;
}
inline std::unordered_map<u32, u32> &getHUDTranslationMap() inline std::unordered_map<u32, u32> &getHUDTranslationMap()
{ {
return m_hud_server_to_client; return m_hud_server_to_client;
@ -445,7 +440,6 @@ public:
private: private:
void loadMods(); void loadMods();
bool checkBuiltinIntegrity();
// Virtual methods from con::PeerHandler // Virtual methods from con::PeerHandler
void peerAdded(con::Peer *peer) override; void peerAdded(con::Peer *peer) override;
@ -593,7 +587,6 @@ private:
// Client modding // Client modding
ClientScripting *m_script = nullptr; ClientScripting *m_script = nullptr;
bool m_modding_enabled;
std::unordered_map<std::string, ModMetadata *> m_mod_storages; std::unordered_map<std::string, ModMetadata *> m_mod_storages;
float m_mod_storage_save_timer = 10.0f; float m_mod_storage_save_timer = 10.0f;
std::vector<ModSpec> m_mods; std::vector<ModSpec> m_mods;

View File

@ -334,13 +334,6 @@ GenericCAO* ClientEnvironment::getGenericCAO(u16 id)
return NULL; return NULL;
} }
bool isFreeClientActiveObjectId(const u16 id,
ClientActiveObjectMap &objects)
{
return id != 0 && objects.find(id) == objects.end();
}
u16 ClientEnvironment::addActiveObject(ClientActiveObject *object) u16 ClientEnvironment::addActiveObject(ClientActiveObject *object)
{ {
// Register object. If failed return zero id // Register object. If failed return zero id

View File

@ -175,7 +175,7 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args)
} }
} }
#endif #endif
g_fontengine = new FontEngine(g_settings, guienv); g_fontengine = new FontEngine(guienv);
FATAL_ERROR_IF(g_fontengine == NULL, "Font engine creation failed."); FATAL_ERROR_IF(g_fontengine == NULL, "Font engine creation failed.");
#if (IRRLICHT_VERSION_MAJOR >= 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2 #if (IRRLICHT_VERSION_MAJOR >= 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2
@ -487,14 +487,6 @@ bool ClientLauncher::launch_game(std::string &error_message,
start_data.socket_port = myrand_range(49152, 65535); start_data.socket_port = myrand_range(49152, 65535);
} else { } else {
g_settings->set("name", start_data.name); g_settings->set("name", start_data.name);
if (!start_data.address.empty()) {
ServerListSpec server;
server["name"] = server_name;
server["address"] = start_data.address;
server["port"] = itos(start_data.socket_port);
server["description"] = server_description;
ServerList::insert(server);
}
} }
if (start_data.name.length() > PLAYERNAME_SIZE - 1) { if (start_data.name.length() > PLAYERNAME_SIZE - 1) {

View File

@ -513,10 +513,10 @@ f32 MapblockMeshGenerator::getCornerLevel(int i, int k)
count++; count++;
} else if (content == CONTENT_AIR) { } else if (content == CONTENT_AIR) {
air_count++; air_count++;
if (air_count >= 2)
return -0.5 * BS + 0.2;
} }
} }
if (air_count >= 2)
return -0.5 * BS + 0.2;
if (count > 0) if (count > 0)
return sum / count; return sum / count;
return 0; return 0;

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