Merge branch 'master' of https://github.com/minetest/minetest
This commit is contained in:
commit
1fbbb76825
@ -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")
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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')
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
250
builtin/mainmenu/serverlistmgr.lua
Normal file
250
builtin/mainmenu/serverlistmgr.lua
Normal 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
|
@ -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") .. ";" ..
|
||||
|
@ -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
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
29
builtin/mainmenu/tests/favorites_wellformed.txt
Normal file
29
builtin/mainmenu/tests/favorites_wellformed.txt
Normal 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.
|
36
builtin/mainmenu/tests/serverlistmgr_spec.lua
Normal file
36
builtin/mainmenu/tests/serverlistmgr_spec.lua
Normal 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)
|
@ -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.
|
||||
|
@ -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`
|
||||
|
||||
|
111
doc/lua_api.txt
111
doc/lua_api.txt
@ -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"
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
-------
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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"),
|
||||
|
@ -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",
|
||||
|
@ -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},
|
||||
|
@ -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 |
@ -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 it’s 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
|
||||
|
||||
|
@ -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>
|
||||
|
1143
po/ar/minetest.po
1143
po/ar/minetest.po
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
1093
po/es/minetest.po
1093
po/es/minetest.po
File diff suppressed because it is too large
Load Diff
1114
po/et/minetest.po
1114
po/et/minetest.po
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
1060
po/fr/minetest.po
1060
po/fr/minetest.po
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
1040
po/it/minetest.po
1040
po/it/minetest.po
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
2027
po/ko/minetest.po
2027
po/ko/minetest.po
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
452
po/minetest.pot
452
po/minetest.pot
@ -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 it’s 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
1726
po/nl/minetest.po
1726
po/nl/minetest.po
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
1316
po/pt/minetest.po
1316
po/pt/minetest.po
File diff suppressed because it is too large
Load Diff
1137
po/pt_BR/minetest.po
1137
po/pt_BR/minetest.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1323
po/ru/minetest.po
1323
po/ru/minetest.po
File diff suppressed because it is too large
Load Diff
3395
po/sk/minetest.po
3395
po/sk/minetest.po
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
1315
po/zh_CN/minetest.po
1315
po/zh_CN/minetest.po
File diff suppressed because it is too large
Load Diff
1402
po/zh_TW/minetest.po
1402
po/zh_TW/minetest.po
File diff suppressed because it is too large
Load Diff
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user