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_policy(SET CMP0025 OLD)
# This can be read from ${PROJECT_NAME} after project() is called
project(minetest)
set(PROJECT_NAME_CAPITALIZED "Dragonfire")

View File

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

View File

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

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
project.ext.set("versionMajor", 5) // Version Major
project.ext.set("versionMinor", 3) // Version Minor
project.ext.set("versionMinor", 4) // Version Minor
project.ext.set("versionPatch", 0) // Version Patch
project.ext.set("versionExtra", "-dev") // Version Extra
project.ext.set("versionCode", 30) // Android Version Code
@ -15,7 +15,7 @@ buildscript {
jcenter()
}
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'
// NOTE: Do not place your application dependencies here; they belong
// 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
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
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 {
compileSdkVersion 29
buildToolsVersion '30.0.2'
ndkVersion '21.3.6528147'
buildToolsVersion '30.0.3'
ndkVersion '22.0.7026061'
defaultConfig {
minSdkVersion 16
targetSdkVersion 29
@ -71,7 +71,7 @@ task getDeps(dependsOn: downloadDeps, type: Copy) {
}
// get sqlite
def sqlite_ver = '3320200'
def sqlite_ver = '3340000'
task downloadSqlite(dependsOn: getDeps, type: Download) {
src 'https://www.sqlite.org/2020/sqlite-amalgamation-' + sqlite_ver + '.zip'
dest new File(buildDir, 'sqlite.zip')

View File

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

View File

@ -1,28 +1,5 @@
-- 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
--
@ -77,7 +54,7 @@ core.setting_save = setting_proxy("write")
function core.register_on_auth_fail(func)
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(function (player_name, ip, is_success)

View File

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

View File

@ -544,7 +544,7 @@ function core.node_dig(pos, node, digger)
log("info", diggername .. " tried to dig "
.. node.name .. " which is not diggable "
.. core.pos_to_string(pos))
return
return false
end
if core.is_protected(pos, diggername) then
@ -553,7 +553,7 @@ function core.node_dig(pos, node, digger)
.. " at protected position "
.. core.pos_to_string(pos))
core.record_protection_violation(pos, diggername)
return
return false
end
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}
callback(pos_copy, node_copy, digger)
end
return true
end
function core.itemstring_with_palette(item, palette_index)
@ -692,10 +694,6 @@ core.nodedef_default = {
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
drawtype = "normal",
visual_scale = 1.0,
@ -706,7 +704,6 @@ core.nodedef_default = {
-- {name="", backface_culling=true},
-- {name="", backface_culling=true},
--},
alpha = 255,
post_effect_color = {a=0, r=0, g=0, b=0},
paramtype = "none",
paramtype2 = "none",

View File

@ -266,3 +266,26 @@ end
function core.cancel_shutdown_requests()
core.request_shutdown("", false, -1)
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, "")
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.
--
@ -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_player_inventory_actions, core.register_on_player_inventory_action = make_registration()
core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration()
core.registered_on_rightclickplayers, core.register_on_rightclickplayer = make_registration()
--
-- 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")
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)
@ -164,35 +146,15 @@ end
--------------------------------------------------------------------------------
os.tempfolder = function()
if core.settings:get("TMPFolder") then
return core.settings:get("TMPFolder") .. DIR_DELIM .. "MT_" .. math.random(0,10000)
end
local temp = core.get_temp_path()
return temp .. DIR_DELIM .. "MT_" .. math.random(0, 10000)
end
local filetocheck = os.tmpname()
os.remove(filetocheck)
-- luacheck: ignore
-- https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1/
-- 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
--------------------------------------------------------------------------------
os.tmpname = function()
local path = os.tempfolder()
io.open(path, "w"):close()
return path
end
--------------------------------------------------------------------------------
@ -226,41 +188,6 @@ function menu_handle_key_up_down(fields, textlist, settingname)
return false
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)
local textlines = core.wrap_text(text, textlen, true)

View File

@ -23,7 +23,9 @@ if not minetest.get_http_api then
return
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()
@ -572,6 +574,7 @@ function store.load()
end
end
store.packages_full_unordered = store.packages_full
store.packages = store.packages_full
store.loaded = true
end
@ -580,7 +583,7 @@ function store.update_paths()
local mod_hash = {}
pkgmgr.refresh_globals()
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
end
end
@ -588,14 +591,14 @@ function store.update_paths()
local game_hash = {}
pkgmgr.update_gamelist()
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
end
end
local txp_hash = {}
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
end
end
@ -619,6 +622,33 @@ function store.update_paths()
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)
if query == "" and filter_type == 1 then
store.packages = store.packages_full
@ -652,7 +682,6 @@ function store.filter_packages(query)
store.packages[#store.packages + 1] = package
end
end
end
function store.get_formspec(dlgdata)
@ -960,6 +989,9 @@ function create_store_dlg(type)
store.load()
end
store.update_paths()
store.sort_packages()
search_string = ""
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 .. "common.lua")
dofile(menupath .. DIR_DELIM .. "pkgmgr.lua")
dofile(menupath .. DIR_DELIM .. "serverlistmgr.lua")
dofile(menupath .. DIR_DELIM .. "textures.lua")
dofile(menupath .. DIR_DELIM .. "dlg_config_world.lua")

View File

@ -72,6 +72,34 @@ local function cleanup_path(temppath)
return temppath
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)
local mods = core.get_dir_list(path, true)
@ -112,7 +140,7 @@ function get_mods(path,retval,modpack)
toadd.type = "mod"
-- 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")
if modpackfile then
modpackfile:close()
@ -136,32 +164,13 @@ pkgmgr = {}
function pkgmgr.get_texture_packs()
local txtpath = core.get_texturepath()
local list = core.get_dir_list(txtpath, true)
local txtpath_system = core.get_texturepath_share()
local retval = {}
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
load_texture_packs(txtpath, retval)
-- on portable versions these two paths coincide. It avoids loading the path twice
if txtpath ~= txtpath_system then
load_texture_packs(txtpath_system, retval)
end
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 ..
"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") .. "]" ..
"label[3.9,-0.05;".. fgettext("Select World:") .. "]"..
"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,
-- it may have changed after a change by the settings menu.
common_update_cached_supp_proto()
local fav_selected
local selected
if menudata.search_result then
fav_selected = menudata.search_result[tabdata.fav_selected]
selected = menudata.search_result[tabdata.selected]
else
fav_selected = menudata.favorites[tabdata.fav_selected]
selected = serverlistmgr.servers[tabdata.selected]
end
if not tabdata.search_for then
@ -58,18 +58,18 @@ local function get_formspec(tabview, name, tabdata)
-- 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
retval = retval .. "button[7.73,4.9;2.3,1;btn_delete_favorite;" ..
fgettext("Del. Favorite") .. "]"
end
if fav_selected.description then
if selected.description then
retval = retval .. "textarea[8.1,2.3;4.23,2.9;;;" ..
core.formspec_escape((gamedata.serverdescription or ""), true) .. "]"
end
end
--favourites
--favorites
retval = retval .. "tablecolumns[" ..
image_column(fgettext("Favorite"), "favorite") .. ";" ..
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;" ..
"color,span=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
local favs = serverlistmgr.get_favorites()
for i = 1, #menudata.search_result do
local favs = core.get_favorites("local")
local server = menudata.search_result[i]
for fav_id = 1, #favs do
if server.address == favs[fav_id].address and
server.port == favs[fav_id].port then
@ -103,29 +102,30 @@ local function get_formspec(tabview, name, tabdata)
retval = retval .. render_serverlist_row(server, server.is_favorite)
end
elseif #menudata.favorites > 0 then
local favs = core.get_favorites("local")
elseif #serverlistmgr.servers > 0 then
local favs = serverlistmgr.get_favorites()
if #favs > 0 then
for i = 1, #favs do
for j = 1, #menudata.favorites do
if menudata.favorites[j].address == favs[i].address and
menudata.favorites[j].port == favs[i].port then
table.insert(menudata.favorites, i, table.remove(menudata.favorites, j))
for j = 1, #serverlistmgr.servers do
if serverlistmgr.servers[j].address == favs[i].address and
serverlistmgr.servers[j].port == favs[i].port then
table.insert(serverlistmgr.servers, i, table.remove(serverlistmgr.servers, j))
end
end
end
if favs[i].address ~= menudata.favorites[i].address then
table.insert(menudata.favorites, i, favs[i])
if favs[i].address ~= serverlistmgr.servers[i].address then
table.insert(serverlistmgr.servers, i, favs[i])
end
end
end
retval = retval .. render_serverlist_row(menudata.favorites[1], (#favs > 0))
for i = 2, #menudata.favorites do
retval = retval .. "," .. render_serverlist_row(menudata.favorites[i], (i <= #favs))
retval = retval .. render_serverlist_row(serverlistmgr.servers[1], (#favs > 0))
for i = 2, #serverlistmgr.servers do
retval = retval .. "," .. render_serverlist_row(serverlistmgr.servers[i], (i <= #favs))
end
end
if tabdata.fav_selected then
retval = retval .. ";" .. tabdata.fav_selected .. "]"
if tabdata.selected then
retval = retval .. ";" .. tabdata.selected .. "]"
else
retval = retval .. ";0]"
end
@ -135,21 +135,20 @@ end
--------------------------------------------------------------------------------
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
gamedata.playername = fields.te_name
core.settings:set("name", fields.te_name)
end
if fields.favourites then
local event = core.explode_table_event(fields.favourites)
if fields.favorites then
local event = core.explode_table_event(fields.favorites)
local fav = serverlist[event.row]
if event.type == "DCL" then
if event.row <= #serverlist then
if menudata.favorites_is_public and
not is_server_protocol_compat_or_error(
if not is_server_protocol_compat_or_error(
fav.proto_min, fav.proto_max) then
return true
end
@ -178,7 +177,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
if event.type == "CHG" then
if event.row <= #serverlist then
gamedata.fav = false
local favs = core.get_favorites("local")
local favs = serverlistmgr.get_favorites()
local address = fav.address
local port = fav.port
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("remote_port", port)
end
tabdata.fav_selected = event.row
tabdata.selected = event.row
end
return true
end
end
if fields.key_up or fields.key_down then
local fav_idx = core.get_table_index("favourites")
local fav_idx = core.get_table_index("favorites")
local fav = serverlist[fav_idx]
if fav_idx then
if fields.key_up and fav_idx > 1 then
fav_idx = fav_idx - 1
elseif fields.key_down and fav_idx < #menudata.favorites then
elseif fields.key_down and fav_idx < #serverlistmgr.servers then
fav_idx = fav_idx + 1
end
else
fav_idx = 1
end
if not menudata.favorites or not fav then
tabdata.fav_selected = 0
if not serverlistmgr.servers or not fav then
tabdata.selected = 0
return true
end
@ -227,17 +226,17 @@ local function main_button_handler(tabview, fields, name, tabdata)
core.settings:set("remote_port", port)
end
tabdata.fav_selected = fav_idx
tabdata.selected = fav_idx
return true
end
if fields.btn_delete_favorite then
local current_favourite = core.get_table_index("favourites")
if not current_favourite then return end
local current_favorite = core.get_table_index("favorites")
if not current_favorite then return end
core.delete_favorite(current_favourite)
asyncOnlineFavourites()
tabdata.fav_selected = nil
serverlistmgr.delete_favorite(serverlistmgr.servers[current_favorite])
serverlistmgr.sync()
tabdata.selected = nil
core.settings:set("address", "")
core.settings:set("remote_port", "30000")
@ -251,11 +250,11 @@ local function main_button_handler(tabview, fields, name, tabdata)
end
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()
tabdata.search_for = fields.te_search
if #menudata.favorites < 2 then
if #serverlistmgr.servers < 2 then
return true
end
@ -275,8 +274,8 @@ local function main_button_handler(tabview, fields, name, tabdata)
-- Search the serverlist
local search_result = {}
for i = 1, #menudata.favorites do
local server = menudata.favorites[i]
for i = 1, #serverlistmgr.servers do
local server = serverlistmgr.servers[i]
local found = 0
for k = 1, #keywords do
local keyword = keywords[k]
@ -293,7 +292,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
end
end
if found > 0 then
local points = (#menudata.favorites - i) / 5 + found
local points = (#serverlistmgr.servers - i) / 5 + found
server.points = points
table.insert(search_result, server)
end
@ -312,7 +311,7 @@ local function main_button_handler(tabview, fields, name, tabdata)
end
if fields.btn_mp_refresh then
asyncOnlineFavourites()
serverlistmgr.sync()
return true
end
@ -321,30 +320,36 @@ local function main_button_handler(tabview, fields, name, tabdata)
gamedata.playername = fields.te_name
gamedata.password = fields.te_pwd
gamedata.address = fields.te_address
gamedata.port = fields.te_port
gamedata.port = tonumber(fields.te_port)
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]
if fav_idx and fav_idx <= #serverlist and
fav.address == fields.te_address and
fav.port == fields.te_port then
fav.address == gamedata.address and
fav.port == gamedata.port then
serverlistmgr.add_favorite(fav)
gamedata.servername = fav.name
gamedata.serverdescription = fav.description
if menudata.favorites_is_public and
not is_server_protocol_compat_or_error(
if not is_server_protocol_compat_or_error(
fav.proto_min, fav.proto_max) then
return true
end
else
gamedata.servername = ""
gamedata.serverdescription = ""
serverlistmgr.add_favorite({
address = gamedata.address,
port = gamedata.port,
})
end
core.settings:set("address", fields.te_address)
core.settings:set("remote_port", fields.te_port)
core.settings:set("address", gamedata.address)
core.settings:set("remote_port", gamedata.port)
core.start()
return true
@ -354,7 +359,7 @@ end
local function on_change(type, old_tab, new_tab)
if type == "LEAVE" then return end
asyncOnlineFavourites()
serverlistmgr.sync()
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
# Multiplayer Tab.
serverlist_file (Serverlist file) string favoriteservers.txt
serverlist_file (Serverlist file) string favoriteservers.json
# Maximum size of the out chat queue.
# 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_damage (Damage) bool false
# Enable creative mode for new created maps.
# Enable creative mode for all players
creative_mode (Creative) bool false
# A chosen map seed for a new map, leave empty for random.

View File

@ -627,7 +627,7 @@ Helper functions
* `minetest.is_yes(arg)`
* returns whether `arg` can be interpreted as yes
* `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
* returns a deep copy of `table`

View File

@ -1745,8 +1745,9 @@ to games.
### `ObjectRef` groups
* `immortal`: Skips all damage and breath handling for an object. This group
will also hide the integrated HUD status bars for players, and is
automatically set to all players when damage is disabled on the server.
will also hide the integrated HUD status bars for players. It is
automatically set to all players when damage is disabled on the server and
cannot be reset (subject to change).
* `punch_operable`: For entities; disables the regular damage mechanism for
players punching it by hand or a non-tool item, so that it can do something
else than take damage.
@ -2113,7 +2114,7 @@ Examples
list[current_player;main;0,3.5;8,4;]
list[current_player;craft;3,0;3,3;]
list[current_player;craftpreview;7,1;1,1;]
Version History
---------------
@ -2226,7 +2227,8 @@ Elements
* Show an inventory list if it has been sent to the client. Nothing will
be shown if the inventory list is of size 0.
* **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>]`
@ -2809,6 +2811,7 @@ Some types may inherit styles from parent types.
* image_button
* item_image_button
* label
* list
* model
* pwdfield, inherits from field
* 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.
* padding - rect, adds space between the edges of the button and the content. This value is
relative to bgimg_middle.
* sound - a sound to be played when clicked.
* sound - a sound to be played when triggered.
* textcolor - color, default white.
* checkbox
* 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
* 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
* border - set to false to hide the textbox background and border. Default true.
* 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_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.
* 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)
* fgimg - standard image. Defaults to none.
* 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.
* This is deprecated, use states instead.
* 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
* noclip - boolean, set to true to allow the element to exceed formspec bounds.
* tabheader
* 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.
* table, textlist
* 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
find new indices.
* `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])`:
* Shuffles elements `from` to `to` in `table` in place
* `from` defaults to `1`
@ -4381,6 +4389,8 @@ Utilities
object_step_has_moveresult = true,
-- Whether get_velocity() and add_velocity() can be used on players (5.4.0)
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`
@ -4589,6 +4599,10 @@ Call these functions only at load time!
the puncher to the punched.
* `damage`: Number that represents the damage calculated by the engine
* should return `true` to prevent the default damage mechanism
* `minetest.register_on_rightclickplayer(function(player, clicker))`
* Called when a player is right-clicked
* `player`: ObjectRef - Player that was right-clicked
* `clicker`: ObjectRef - Object that right-clicked, may or may not be a player
* `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)`
* Called when the player gets damaged or healed
* `player`: ObjectRef of the player
@ -5434,20 +5448,22 @@ Server
* Returns a code (0: successful, 1: no such player, 2: player is connected)
* `minetest.remove_player_auth(name)`: remove player authentication data
* Returns boolean indicating success (false if player nonexistant)
* `minetest.dynamic_add_media(filepath)`
* Adds the file at the given path to the media sent to clients by the server
on startup and also pushes this file to already connected clients.
* `minetest.dynamic_add_media(filepath, callback)`
* `filepath`: path to a media file on the filesystem
* `callback`: function with arguments `name`, where name is a player name
(previously there was no callback argument; omitting it is deprecated)
* Adds the file to the media sent to clients by the server on startup
and also pushes this file to already connected clients.
The file must be a supported image, sound or model format. It must not be
modified, deleted, moved or renamed after calling this function.
The list of dynamically added media is not persisted.
* Returns boolean indicating success (duplicate files count as error)
* The media will be ready to use (in e.g. entity textures, sound_play)
immediately after calling this function.
* Returns false on error, true if the request was accepted
* The given callback will be called for every player as soon as the
media is available on the client.
Old clients that lack support for this feature will not see the media
unless they reconnect to the server.
* Since media transferred this way does not use client caching or HTTP
transfers, dynamic media should not be used with big files or performance
will suffer.
unless they reconnect to the server. (callback won't be called)
* Since media transferred this way currently does not use client caching
or HTTP transfers, dynamic media should not be used with big files.
Bans
----
@ -6213,8 +6229,8 @@ object you are working with still exists.
* `time_from_last_punch` = time since last punch action of the puncher
* `direction`: can be `nil`
* `right_click(clicker)`; `clicker` is another `ObjectRef`
* `get_hp()`: returns number of hitpoints (2 * number of hearts)
* `set_hp(hp, reason)`: set number of hitpoints (2 * number of hearts).
* `get_hp()`: returns number of health points
* `set_hp(hp, reason)`: set number of health points
* See reason in register_on_player_hpchange
* 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
@ -6237,21 +6253,22 @@ object you are working with still exists.
`frame_loop`.
* `set_animation_frame_speed(frame_speed)`
* `frame_speed`: number, default: `15.0`
* `set_attach(parent, bone, position, rotation, forced_visible)`
* `bone`: string
* `position`: `{x=num, y=num, z=num}` (relative)
* `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees
* `set_attach(parent[, bone, position, rotation, forced_visible])`
* `bone`: string. Default is `""`, the root bone
* `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.
Default `{x=0, y=0, z=0}`
* `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,
or nil if it isn't attached.
* `get_children()`: returns a list of ObjectRefs that are attached to the
object.
* `set_detach()`
* `set_bone_position(bone, position, rotation)`
* `bone`: string
* `position`: `{x=num, y=num, z=num}` (relative)
* `rotation`: `{x=num, y=num, z=num}`
* `set_bone_position([bone, position, rotation])`
* `bone`: string. Default is `""`, the root bone
* `position`: `{x=num, y=num, z=num}`, relative, `default {x=0, y=0, z=0}`
* `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
* `set_properties(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.
* `get_local_animation()`: returns idle, walk, dig, walk_while_dig tables and
`frame_speed`.
* `set_eye_offset(firstperson, thirdperson)`: defines offset vectors for camera
per player.
* `set_eye_offset([firstperson, thirdperson])`: defines offset vectors for
camera per player. An argument defaults to `{x=0, y=0, z=0}` if unspecified.
* in first person view
* in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
* `get_eye_offset()`: returns first and third person offsets.
@ -6936,7 +6953,11 @@ Player properties need to be saved manually.
-- in mods.
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>,
-- 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
-- the inventory and on the wield item.
use_texture_alpha = false,
-- Use texture's alpha channel
-- If this is set to false, the node will be rendered fully opaque
-- regardless of any texture transparency.
use_texture_alpha = ...,
-- Specifies how the texture's alpha channel will be used for rendering.
-- possible values:
-- * "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",
-- 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),
-- default: minetest.node_dig
-- 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),
-- default: nil
@ -7643,12 +7674,12 @@ Used by `minetest.register_node`.
-- intensity: 1.0 = mid range of regular TNT.
-- If defined, called when an explosion touches the node, instead of
-- removing the node.
mod_origin = "modname",
-- stores which mod actually registered a node
-- if it can not find a source, returns "??"
-- 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"
}

View File

@ -85,6 +85,7 @@ core.get_video_drivers()
core.get_mapgen_names([include_hidden=false]) -> table of map generator algorithms
registered in the core (possible in async calls)
core.get_cache_path() -> path of cache
core.get_temp_path() -> path of temp folder
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
-------

View File

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

View File

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

View File

@ -60,11 +60,13 @@ minetest.register_node("soundstuff:footstep_liquid", {
description = "Liquid Footstep Sound Node",
drawtype = "liquid",
tiles = {
"soundstuff_node_sound.png^[colorize:#0000FF:127",
"soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190",
},
special_tiles = {
{name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = false},
{name = "soundstuff_node_sound.png^[colorize:#0000FF:127", backface_culling = true},
{name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190",
backface_culling = false},
{name = "soundstuff_node_sound.png^[colorize:#0000FF:127^[opacity:190",
backface_culling = true},
},
liquids_pointable = true,
liquidtype = "source",
@ -73,7 +75,7 @@ minetest.register_node("soundstuff:footstep_liquid", {
liquid_renewable = false,
liquid_range = 0,
liquid_viscosity = 0,
alpha = 190,
use_texture_alpha = "blend",
paramtype = "light",
walkable = false,
pointable = false,
@ -92,7 +94,6 @@ minetest.register_node("soundstuff:footstep_climbable", {
tiles = {
"soundstuff_node_climbable.png",
},
alpha = 120,
paramtype = "light",
sunlight_propagates = true,
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]
]]
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 = [[
<bigger>Normal test</bigger>
This is a normal text.
@ -199,6 +227,7 @@ local scroll_fs =
"box[1,1;8,6;#00aa]"..
"scroll_container[1,1;8,6;scrbar;vertical]"..
"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]"..
"pwdfield[2,2;1,1;lorem2;Lorem]"..
"list[current_player;main;4,4;1,5;]"..
@ -211,6 +240,8 @@ local scroll_fs =
"tooltip[0,11;3,2;Buz;#f00;#000]"..
"box[0,11;3,2;#00ff00]"..
"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]"..
"box[1,2;3,2;#0a0a]"..
"scroll_container[1,2;3,2;scrbar2;horizontal;0.06]"..
@ -310,6 +341,9 @@ local pages = {
"size[12,13]real_coordinates[true]" ..
"container[0.5,1.5]" .. tabheaders_fs .. "container_end[]",
-- Inv
"size[12,13]real_coordinates[true]" .. inv_style_fs,
-- Animation
[[
formspec_version[3]
@ -341,7 +375,7 @@ Number]
local function show_test_formspec(pname, page_id)
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)
end

View File

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

View File

@ -46,77 +46,22 @@ for a=1,#alphas do
tiles = {
"testnodes_alpha"..alpha..".png",
},
use_texture_alpha = true,
use_texture_alpha = "blend",
groups = { dig_immediate = 3 },
})
-- Transparency set via "alpha" parameter
-- Transparency set via texture modifier
minetest.register_node("testnodes:alpha_"..alpha, {
description = S("Alpha Test Node (@1)", alpha),
-- It seems that only the liquid drawtype supports the alpha parameter
drawtype = "liquid",
drawtype = "glasslike",
paramtype = "light",
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 },
})
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
# always_fly_fast = true
# The time in seconds it takes between repeated right clicks when holding the right
# mouse button.
# The time in seconds it takes between repeated node placements when holding
# the place button.
# type: float min: 0.001
# repeat_rightclick_time = 0.25
# repeat_place_time = 0.25
# Automatically jump up single-node obstacles.
# type: bool
@ -130,6 +130,7 @@
# repeat_joystick_button_time = 0.17
# The deadzone of the joystick
# type: int
# joystick_deadzone = 2048
# The sensitivity of the joystick axes for moving the
@ -169,6 +170,16 @@
# type: key
# 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.
# See http://irrlicht.sourceforge.net/docu/namespaceirr.html#a54da2a0e231901735e3da1b0edf72eb3
# type: key
@ -572,8 +583,13 @@
# type: int
# texture_min_size = 64
# Experimental option, might cause visible spaces between blocks
# when set to higher number than 0.
# Use multi-sample antialiasing (MSAA) to smooth out block edges.
# 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
# fsaa = 0
@ -605,37 +621,6 @@
# type: bool
# 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
# Set to true to enable waving liquids (like water).
@ -684,9 +669,9 @@
# type: int min: 1
# 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
# 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.
@ -695,7 +680,7 @@
# View distance in nodes.
# type: int min: 20 max: 4000
# viewing_range = 100
# viewing_range = 190
# 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.
@ -774,8 +759,8 @@
# The rendering back-end for Irrlicht.
# A restart is required after changing this.
# Note: On Android, stick with OGLES1 if unsure! App may fail to start otherwise.
# On other platforms, OpenGL is recommended, and its the only driver with
# shader support currently.
# On other platforms, OpenGL is recommended.
# Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)
# type: enum values: null, software, burningsvideo, direct3d8, direct3d9, opengl, ogles1, ogles2
# video_driver = opengl
@ -848,10 +833,12 @@
# selectionbox_width = 2
# Crosshair color (R,G,B).
# Also controls the object crosshair color
# type: string
# crosshair_color = (255,255,255)
# Crosshair alpha (opaqueness, between 0 and 255).
# Also controls the object crosshair color
# type: int min: 0 max: 255
# crosshair_alpha = 255
@ -1160,7 +1147,7 @@
# File in client/serverlist/ that contains your favorite servers displayed in the
# Multiplayer Tab.
# type: string
# serverlist_file = favoriteservers.txt
# serverlist_file = favoriteservers.json
# Maximum size of the out chat queue.
# 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.
# Set to -1 for unlimited amount.
# type: int
# client_mapblock_limit = 5000
# client_mapblock_limit = 7500
# Whether to show the client debug info (has the same effect as hitting F5).
# type: bool
@ -1269,6 +1256,14 @@
# type: int
# max_packets_per_iteration = 1024
# ZLib compression level to use when sending mapblocks to the client.
# -1 - Zlib's default compression level
# 0 - no compresson, fastest
# 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
# Default game when creating a new world.
@ -1383,7 +1378,7 @@
# to maintain active objects up to this distance in the direction the
# player is looking. (This can avoid mobs suddenly disappearing from view)
# 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
# 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 should be configured together with active_object_send_range_blocks.
# type: int
# active_block_range = 3
# active_block_range = 4
# From how far blocks are sent to clients, stated in mapblocks (16 nodes).
# type: int
# max_block_send_distance = 10
# max_block_send_distance = 12
# Maximum number of forceloaded mapblocks.
# type: int
@ -1488,11 +1483,11 @@
### Advanced
# Handling for deprecated Lua API calls:
# - legacy: (try to) mimic old behaviour (default for release).
# - log: mimic and log backtrace of deprecated call (default for debug).
# - none: Do not log deprecated calls
# - log: mimic and log backtrace of deprecated call (default).
# - error: abort on usage of deprecated call (suggested for mod developers).
# type: enum values: legacy, log, error
# deprecated_lua_api_handling = legacy
# type: enum values: none, log, error
# deprecated_lua_api_handling = log
# Number of extra blocks that can be loaded by /clearobjects at once.
# This is a trade-off between sqlite transaction overhead and
@ -1513,6 +1508,14 @@
# type: enum values: 0, 1, 2
# sqlite_synchronous = 2
# ZLib compression level to use when saving mapblocks to disk.
# -1 - Zlib's default compression level
# 0 - no compresson, fastest
# 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
# network.
# type: float
@ -1526,6 +1529,11 @@
# type: float
# 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
# type: float
# nodetimer_interval = 0.2
@ -1722,13 +1730,6 @@
# type: bool
# 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.
# type: string
# main_menu_script =
@ -1755,7 +1756,7 @@
# From how far blocks are generated for clients, stated in mapblocks (16 nodes).
# 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).
# Only mapchunks completely within the mapgen limit are generated.
@ -1766,8 +1767,8 @@
# Global map generation attributes.
# In Mapgen v6 the 'decorations' flag controls all decorations except trees
# and junglegrass, in all other mapgens this flag controls all decorations.
# type: flags possible values: caves, dungeons, light, decorations, biomes, nocaves, nodungeons, nolight, nodecorations, nobiomes
# mg_flags = caves,dungeons,light,decorations,biomes
# type: flags possible values: caves, dungeons, light, decorations, biomes, ores, nocaves, nodungeons, nolight, nodecorations, nobiomes, noores
# mg_flags = caves,dungeons,light,decorations,biomes,ores
## Biome API temperature and humidity noise parameters
@ -2753,8 +2754,8 @@
# Map generation attributes specific to Mapgen Flat.
# Occasional lakes and hills can be added to the flat world.
# type: flags possible values: lakes, hills, nolakes, nohills
# mgflat_spflags = nolakes,nohills
# type: flags possible values: lakes, hills, caverns, nolakes, nohills, nocaverns
# mgflat_spflags = nolakes,nohills,nocaverns
# Y of flat ground.
# type: int
@ -2810,6 +2811,18 @@
# type: float
# 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.
# type: int
# mgflat_dungeon_ymin = -31000
@ -2872,6 +2885,19 @@
# 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.
# type: noise_params_3d
# mgflat_np_dungeons = {
@ -3322,17 +3348,17 @@
# Maximum number of blocks that can be queued for loading.
# type: int
# emergequeue_limit_total = 512
# emergequeue_limit_total = 1024
# Maximum number of blocks to be queued that are to be loaded from file.
# This limit is enforced per player.
# type: int
# emergequeue_limit_diskonly = 64
# emergequeue_limit_diskonly = 128
# Maximum number of blocks to be queued that are to be generated.
# This limit is enforced per player.
# type: int
# emergequeue_limit_generate = 64
# emergequeue_limit_generate = 128
# Number of emerge threads to use.
# Value 0:
@ -3363,3 +3389,9 @@
# so see a full list at https://content.minetest.net/help/content_flags/
# type: string
# 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"?>
<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">
<security>
<requestedPrivileges>
@ -10,6 +11,7 @@
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<activeCodePage xmlns="http://schemas.microsoft.com/SMI/2019/WindowsSettings">UTF-8</activeCodePage>
</windowsSettings>
</application>
</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 ""
"Project-Id-Version: minetest\n"
"Report-Msgid-Bugs-To: \n"
<<<<<<< HEAD
"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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -41,14 +45,6 @@ msgstr ""
msgid "An error occurred:"
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
msgid "Server supports protocol versions between $1 and $2. "
msgstr ""
@ -97,7 +93,8 @@ msgstr ""
msgid "Optional dependencies:"
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:"
msgstr ""
@ -110,7 +107,8 @@ msgstr ""
msgid "Save"
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_world.lua
#: builtin/mainmenu/dlg_rename_modpack.lua
@ -177,14 +175,79 @@ msgid "Failed to download $1"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
#: builtin/mainmenu/dlg_settings_advanced.lua builtin/mainmenu/tab_online.lua
msgid "Search"
msgid "Already installed"
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 ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Back to Main Menu"
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
msgid "No results"
msgstr ""
@ -198,7 +261,7 @@ msgid "Downloading..."
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "Install"
msgid "Queued"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
@ -210,7 +273,7 @@ msgid "Uninstall"
msgstr ""
#: builtin/mainmenu/dlg_contentstore.lua
msgid "View"
msgid "View more information in a web browser"
msgstr ""
#: builtin/mainmenu/dlg_create_world.lua
@ -559,6 +622,10 @@ msgstr ""
msgid "Select file"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "Search"
msgstr ""
#: builtin/mainmenu/dlg_settings_advanced.lua
msgid "< Back to Settings page"
msgstr ""
@ -623,6 +690,14 @@ msgstr ""
msgid "$1 mods"
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
msgid "Installed Packages:"
msgstr ""
@ -687,12 +762,22 @@ msgstr ""
msgid "Previous Contributors"
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
msgid "Install games from ContentDB"
msgstr ""
#: builtin/mainmenu/tab_local.lua
msgid "Configure"
msgid "Select Mods"
msgstr ""
#: builtin/mainmenu/tab_local.lua
@ -703,11 +788,11 @@ msgstr ""
msgid "Select World:"
msgstr ""
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_local.lua
msgid "Creative Mode"
msgstr ""
#: builtin/mainmenu/tab_local.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_local.lua
msgid "Enable Damage"
msgstr ""
@ -724,7 +809,11 @@ msgid "Announce Server"
msgstr ""
#: builtin/mainmenu/tab_local.lua
msgid "Name/Password"
msgid "Name"
msgstr ""
#: builtin/mainmenu/tab_local.lua
msgid "Password"
msgstr ""
#: builtin/mainmenu/tab_local.lua
@ -755,36 +844,36 @@ msgstr ""
msgid "Address / Port"
msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "Name / Password"
msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "Connect"
msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "Del. Favorite"
msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "Favorite"
msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "Ping"
msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "Creative mode"
msgstr ""
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "Damage enabled"
msgstr ""
#. ~ PvP = Player versus Player
#: builtin/mainmenu/tab_online.lua builtin/mainmenu/tab_simple_main.lua
#: builtin/mainmenu/tab_online.lua
msgid "PvP enabled"
msgstr ""
@ -852,18 +941,6 @@ msgstr ""
msgid "8x"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Are you sure to reset your singleplayer world?"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Yes"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "No"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Smooth Lighting"
msgstr ""
@ -905,11 +982,11 @@ msgid "Shaders"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Shaders (unavailable)"
msgid "Shaders (experimental)"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Reset singleplayer world"
msgid "Shaders (unavailable)"
msgstr ""
#: builtin/mainmenu/tab_settings.lua src/client/game.cpp
@ -924,22 +1001,10 @@ msgstr ""
msgid "Touchthreshold: (px)"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Bump Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Tone Mapping"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Generate Normal Maps"
msgstr ""
#: builtin/mainmenu/tab_settings.lua src/settings_translation_file.cpp
msgid "Parallax Occlusion"
msgstr ""
#: builtin/mainmenu/tab_settings.lua
msgid "Waving Liquids"
msgstr ""
@ -960,18 +1025,6 @@ msgstr ""
msgid "Settings"
msgstr ""
#: builtin/mainmenu/tab_simple_main.lua
msgid "Start Singleplayer"
msgstr ""
#: builtin/mainmenu/tab_simple_main.lua
msgid "Config mods"
msgstr ""
#: builtin/mainmenu/tab_simple_main.lua
msgid "Main"
msgstr ""
#: src/client/client.cpp
msgid "Connection timed out."
msgstr ""
@ -1189,34 +1242,6 @@ msgstr ""
msgid "Automatic forward disabled"
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
msgid "Minimap currently disabled by game or mod"
msgstr ""
@ -1316,14 +1341,14 @@ msgid ""
"- %s: move backwards\n"
"- %s: move left\n"
"- %s: move right\n"
"- %s: jump/climb\n"
"- %s: sneak/go down\n"
"- %s: jump/climb up\n"
"- %s: dig/punch\n"
"- %s: place/use\n"
"- %s: sneak/climb down\n"
"- %s: drop item\n"
"- %s: inventory\n"
"- %s: special inventory\n"
"- Mouse: turn/look\n"
"- Mouse left: dig/punch\n"
"- Mouse right: place/use\n"
"- Mouse wheel: select item\n"
"- %s: chat\n"
"- %s: Killaura\n"
@ -1713,6 +1738,24 @@ msgstr ""
msgid "OEM Clear"
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
#, c-format
msgid ""
@ -2085,14 +2128,13 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
msgid "Rightclick repetition interval"
msgid "Place repetition interval"
msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"The time in seconds it takes between repeated right clicks when holding the "
"right\n"
"mouse button."
"The time in seconds it takes between repeated node placements when holding\n"
"the place button."
msgstr ""
#: src/settings_translation_file.cpp
@ -2186,6 +2228,14 @@ msgid ""
"when holding down a joystick button combination."
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
msgid "Joystick frustum sensitivity"
msgstr ""
@ -2265,6 +2315,28 @@ msgid ""
"html#a54da2a0e231901735e3da1b0edf72eb3"
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
msgid "Inventory key"
msgstr ""
@ -3116,8 +3188,13 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Experimental option, might cause visible spaces between blocks\n"
"when set to higher number than 0."
"Use multi-sample antialiasing (MSAA) to smooth out block edges.\n"
"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 ""
#: src/settings_translation_file.cpp
@ -3163,90 +3240,6 @@ msgid ""
"enhanced, highlights and shadows are gradually compressed."
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
msgid "Waving Nodes"
msgstr ""
@ -3340,11 +3333,11 @@ msgid ""
msgstr ""
#: src/settings_translation_file.cpp
msgid "FPS in pause menu"
msgid "FPS when unfocused or paused"
msgstr ""
#: 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 ""
#: src/settings_translation_file.cpp
@ -3517,8 +3510,8 @@ msgid ""
"A restart is required after changing this.\n"
"Note: On Android, stick with OGLES1 if unsure! App may fail to start "
"otherwise.\n"
"On other platforms, OpenGL is recommended, and its the only driver with\n"
"shader support currently."
"On other platforms, OpenGL is recommended.\n"
"Shaders are supported by OpenGL (desktop only) and OGLES2 (experimental)"
msgstr ""
#: src/settings_translation_file.cpp
@ -3655,7 +3648,9 @@ msgid "Crosshair color"
msgstr ""
#: 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 ""
#: src/settings_translation_file.cpp
@ -3663,7 +3658,9 @@ msgid "Crosshair alpha"
msgstr ""
#: 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 ""
#: src/settings_translation_file.cpp
@ -3833,6 +3830,12 @@ msgstr ""
msgid "Show entity selection boxes"
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
msgid "Menus"
msgstr ""
@ -4415,6 +4418,19 @@ msgid ""
"client number."
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
msgid "Default game"
msgstr ""
@ -4848,8 +4864,8 @@ msgstr ""
#: src/settings_translation_file.cpp
msgid ""
"Handling for deprecated Lua API calls:\n"
"- legacy: (try to) mimic old behaviour (default for release).\n"
"- log: mimic and log backtrace of deprecated call (default for debug).\n"
"- none: Do not log deprecated calls\n"
"- log: mimic and log backtrace of deprecated call (default).\n"
"- error: abort on usage of deprecated call (suggested for mod developers)."
msgstr ""
@ -4890,6 +4906,19 @@ msgstr ""
msgid "See https://www.sqlite.org/pragma.html#pragma_synchronous"
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
msgid "Dedicated server step"
msgstr ""
@ -4917,6 +4946,16 @@ msgstr ""
msgid "Length of time between Active Block Modifier (ABM) execution cycles"
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
msgid "NodeTimer interval"
msgstr ""
@ -5270,20 +5309,6 @@ msgstr ""
msgid "Makes DirectX work with LuaJIT. Disable if it causes troubles."
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
msgid "Main menu script"
msgstr ""
@ -6395,3 +6420,14 @@ msgid ""
"These flags are independent from Minetest versions,\n"
"so see a full list at https://content.minetest.net/help/content_flags/"
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)
add_executable(${PROJECT_NAME} ${client_SRCS} ${extra_windows_SRCS})
add_dependencies(${PROJECT_NAME} GenerateVersion)
set(client_LIBS
target_link_libraries(
${PROJECT_NAME}
${ZLIB_LIBRARIES}
${IRRLICHT_LIBRARY}
@ -548,9 +548,14 @@ if(BUILD_CLIENT)
${PLATFORM_LIBS}
${CLIENT_PLATFORM_LIBS}
)
target_link_libraries(
${client_LIBS}
)
if(NOT USE_LUAJIT)
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)
target_link_libraries(
${PROJECT_NAME}
@ -621,7 +626,15 @@ if(BUILD_SERVER)
${PLATFORM_LIBS}
)
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)
target_link_libraries(${PROJECT_NAME}server ${GETTEXT_LIBRARY})
endif()
@ -666,7 +679,7 @@ option(APPLY_LOCALE_BLACKLIST "Use a blacklist to avoid broken locales" TRUE)
if (GETTEXTLIB_FOUND AND APPLY_LOCALE_BLACKLIST)
set(GETTEXT_USED_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})
endif()
endforeach()

View File

@ -28,11 +28,11 @@ enum ActiveObjectType {
ACTIVEOBJECT_TYPE_INVALID = 0,
ACTIVEOBJECT_TYPE_TEST = 1,
// Obsolete stuff
ACTIVEOBJECT_TYPE_ITEM = 2,
// ACTIVEOBJECT_TYPE_RAT = 3,
// ACTIVEOBJECT_TYPE_OERKKI1 = 4,
// ACTIVEOBJECT_TYPE_FIREFLY = 5,
ACTIVEOBJECT_TYPE_MOBV2 = 6,
// ACTIVEOBJECT_TYPE_ITEM = 2,
// ACTIVEOBJECT_TYPE_RAT = 3,
// ACTIVEOBJECT_TYPE_OERKKI1 = 4,
// ACTIVEOBJECT_TYPE_FIREFLY = 5,
// ACTIVEOBJECT_TYPE_MOBV2 = 6,
// End obsolete stuff
ACTIVEOBJECT_TYPE_LUAENTITY = 7,
// 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
std::vector<std::wstring> completions;
for (const std::string &name : names) {
if (str_starts_with(narrow_to_wide(name), prefix, true)) {
std::wstring completion = narrow_to_wide(name);
std::wstring completion = utf8_to_wide(name);
if (str_starts_with(completion, prefix, true)) {
if (prefix_start == 0)
completion += L": ";
completions.push_back(completion);

View File

@ -160,20 +160,6 @@ void Client::loadMods()
scanModIntoMemory(BUILTIN_MOD_NAME, getBuiltinLuaPath());
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());
m_mods = modconf.getMods();
// complain about mods with unsatisfied dependencies
@ -219,12 +205,6 @@ void Client::loadMods()
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,
std::string mod_subpath)
{
@ -1219,7 +1199,7 @@ void Client::sendChatMessage(const std::wstring &message)
if (canSendChatMessage()) {
u32 now = time(NULL);
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);
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
// 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())
// return;
if (m_activeobjects_received && player->isDead())
return;
if (
player->last_position == pos &&
@ -1875,7 +1854,7 @@ void Client::makeScreenshot()
sstr << "Failed to save screenshot '" << filename << "'";
}
pushToChatQueue(new ChatMessage(CHATMESSAGE_TYPE_SYSTEM,
narrow_to_wide(sstr.str())));
utf8_to_wide(sstr.str())));
infostream << sstr.str() << std::endl;
image->drop();
}

View File

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

View File

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

View File

@ -175,7 +175,7 @@ bool ClientLauncher::run(GameStartData &start_data, const Settings &cmd_args)
}
}
#endif
g_fontengine = new FontEngine(g_settings, guienv);
g_fontengine = new FontEngine(guienv);
FATAL_ERROR_IF(g_fontengine == NULL, "Font engine creation failed.");
#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);
} else {
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) {

View File

@ -513,10 +513,10 @@ f32 MapblockMeshGenerator::getCornerLevel(int i, int k)
count++;
} else if (content == CONTENT_AIR) {
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)
return sum / count;
return 0;

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