mirror of
https://github.com/luanti-org/luanti.git
synced 2025-09-10 18:51:05 +00:00
Merge remote-tracking branch 'upstream/master' into Visuals-Vol-2
This commit is contained in:
commit
6b1785eb2c
128 changed files with 1273 additions and 1076 deletions
|
@ -308,23 +308,26 @@ core.register_entity(":__builtin:falling_node", {
|
|||
|
||||
core.remove_node(bcp)
|
||||
else
|
||||
-- We are placing on top so check what's there
|
||||
np.y = np.y + 1
|
||||
end
|
||||
|
||||
-- Check what's here
|
||||
local n2 = core.get_node(np)
|
||||
local nd = core.registered_nodes[n2.name]
|
||||
-- If it's not air or liquid, remove node and replace it with
|
||||
-- it's drops
|
||||
if n2.name ~= "air" and (not nd or nd.liquidtype ~= "source") then
|
||||
if nd and nd.buildable_to == false then
|
||||
local n2 = core.get_node(np)
|
||||
local nd = core.registered_nodes[n2.name]
|
||||
if not nd or nd.buildable_to then
|
||||
core.remove_node(np)
|
||||
else
|
||||
-- 'walkable' is used to mean "falling nodes can't replace this"
|
||||
-- here. Normally we would collide with the walkable node itself
|
||||
-- and place our node on top (so `n2.name == "air"`), but we
|
||||
-- re-check this in case we ended up inside a node.
|
||||
if not nd.diggable or nd.walkable then
|
||||
return false
|
||||
end
|
||||
nd.on_dig(np, n2, nil)
|
||||
-- If it's still there, it might be protected
|
||||
if core.get_node(np).name == n2.name then
|
||||
return false
|
||||
end
|
||||
else
|
||||
core.remove_node(np)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
105
builtin/mainmenu/dlg_server_list_mods.lua
Normal file
105
builtin/mainmenu/dlg_server_list_mods.lua
Normal file
|
@ -0,0 +1,105 @@
|
|||
-- Luanti
|
||||
-- Copyright (C) 2024 cx384
|
||||
-- SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
|
||||
local function get_formspec(dialogdata)
|
||||
local TOUCH_GUI = core.settings:get_bool("touch_gui")
|
||||
local server = dialogdata.server
|
||||
local group_by_prefix = dialogdata.group_by_prefix
|
||||
local expand_all = dialogdata.expand_all
|
||||
|
||||
-- A wrongly behaving server may send ill formed mod names
|
||||
table.sort(server.mods)
|
||||
|
||||
local cells = {}
|
||||
if group_by_prefix then
|
||||
local function get_prefix(mod)
|
||||
return mod:match("[^_]*")
|
||||
end
|
||||
local count = {}
|
||||
for _, mod in ipairs(server.mods) do
|
||||
local prefix = get_prefix(mod)
|
||||
count[prefix] = (count[prefix] or 0) + 1
|
||||
end
|
||||
local last_prefix
|
||||
local function add_row(depth, mod)
|
||||
table.insert(cells, ("%d"):format(depth))
|
||||
table.insert(cells, mod)
|
||||
end
|
||||
for i, mod in ipairs(server.mods) do
|
||||
local prefix = get_prefix(mod)
|
||||
if last_prefix == prefix then
|
||||
add_row(1, mod)
|
||||
elseif count[prefix] > 1 then
|
||||
add_row(0, prefix)
|
||||
add_row(1, mod)
|
||||
else
|
||||
add_row(0, mod)
|
||||
end
|
||||
last_prefix = prefix
|
||||
end
|
||||
else
|
||||
cells = table.copy(server.mods)
|
||||
end
|
||||
|
||||
for i, cell in ipairs(cells) do
|
||||
cells[i] = core.formspec_escape(cell)
|
||||
end
|
||||
cells = table.concat(cells, ",")
|
||||
|
||||
local heading
|
||||
if server.gameid then
|
||||
heading = fgettext("The $1 server uses a game called $2 and the following mods:",
|
||||
"<b>" .. core.hypertext_escape(server.name) .. "</b>",
|
||||
"<style font=mono>" .. core.hypertext_escape(server.gameid) .. "</style>")
|
||||
else
|
||||
heading = fgettext("The $1 server uses the following mods:",
|
||||
"<b>" .. core.hypertext_escape(server.name) .. "</b>")
|
||||
end
|
||||
|
||||
local formspec = {
|
||||
"formspec_version[8]",
|
||||
"size[8,9.5]",
|
||||
TOUCH_GUI and "padding[0.01,0.01]" or "",
|
||||
"hypertext[0,0;8,1.5;;<global margin=5 halign=center valign=middle>", heading, "]",
|
||||
"tablecolumns[", group_by_prefix and
|
||||
(expand_all and "indent;text" or "tree;text") or "text", "]",
|
||||
"table[0.5,1.5;7,6.8;mods;", cells, "]",
|
||||
"checkbox[0.5,8.7;group_by_prefix;", fgettext("Group by prefix"), ";",
|
||||
group_by_prefix and "true" or "false", "]",
|
||||
group_by_prefix and ("checkbox[0.5,9.15;expand_all;" .. fgettext("Expand all") .. ";" ..
|
||||
(expand_all and "true" or "false") .. "]") or "",
|
||||
"button[5.5,8.5;2,0.8;quit;OK]"
|
||||
}
|
||||
return table.concat(formspec, "")
|
||||
end
|
||||
|
||||
local function buttonhandler(this, fields)
|
||||
if fields.quit then
|
||||
this:delete()
|
||||
return true
|
||||
end
|
||||
|
||||
if fields.group_by_prefix then
|
||||
this.data.group_by_prefix = core.is_yes(fields.group_by_prefix)
|
||||
return true
|
||||
end
|
||||
|
||||
if fields.expand_all then
|
||||
this.data.expand_all = core.is_yes(fields.expand_all)
|
||||
return true
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function create_server_list_mods_dialog(server)
|
||||
local retval = dialog_create("dlg_server_list_mods",
|
||||
get_formspec,
|
||||
buttonhandler,
|
||||
nil)
|
||||
retval.data.group_by_prefix = false
|
||||
retval.data.expand_all = false
|
||||
retval.data.server = server
|
||||
return retval
|
||||
end
|
|
@ -56,6 +56,7 @@ dofile(menupath .. DIR_DELIM .. "dlg_rename_modpack.lua")
|
|||
dofile(menupath .. DIR_DELIM .. "dlg_version_info.lua")
|
||||
dofile(menupath .. DIR_DELIM .. "dlg_reinstall_mtg.lua")
|
||||
dofile(menupath .. DIR_DELIM .. "dlg_clients_list.lua")
|
||||
dofile(menupath .. DIR_DELIM .. "dlg_server_list_mods.lua")
|
||||
|
||||
local tabs = {
|
||||
content = dofile(menupath .. DIR_DELIM .. "tab_content.lua"),
|
||||
|
|
|
@ -161,6 +161,26 @@ local function get_formspec(tabview, name, tabdata)
|
|||
core.formspec_escape(gamedata.serverdescription) .. "]"
|
||||
end
|
||||
|
||||
-- Mods button
|
||||
local mods = selected_server.mods
|
||||
if mods and #mods > 0 then
|
||||
local tooltip = ""
|
||||
if selected_server.gameid then
|
||||
tooltip = fgettext("Game: $1", selected_server.gameid) .. "\n"
|
||||
end
|
||||
tooltip = tooltip .. fgettext("Number of mods: $1", #mods)
|
||||
|
||||
retval = retval ..
|
||||
"tooltip[btn_view_mods;" .. tooltip .. "]" ..
|
||||
"style[btn_view_mods;padding=6]" ..
|
||||
"image_button[4,1.3;0.5,0.5;" .. core.formspec_escape(defaulttexturedir ..
|
||||
"server_view_mods.png") .. ";btn_view_mods;]"
|
||||
else
|
||||
retval = retval .. "image[4.1,1.4;0.3,0.3;" .. core.formspec_escape(defaulttexturedir ..
|
||||
"server_view_mods_unavailable.png") .. "]"
|
||||
end
|
||||
|
||||
-- Clients list button
|
||||
local clients_list = selected_server.clients_list
|
||||
local can_view_clients_list = clients_list and #clients_list > 0
|
||||
if can_view_clients_list then
|
||||
|
@ -178,15 +198,23 @@ local function get_formspec(tabview, name, tabdata)
|
|||
retval = retval .. "style[btn_view_clients;padding=6]"
|
||||
retval = retval .. "image_button[4.5,1.3;0.5,0.5;" .. core.formspec_escape(defaulttexturedir ..
|
||||
"server_view_clients.png") .. ";btn_view_clients;]"
|
||||
else
|
||||
retval = retval .. "image[4.6,1.4;0.3,0.3;" .. core.formspec_escape(defaulttexturedir ..
|
||||
"server_view_clients_unavailable.png") .. "]"
|
||||
end
|
||||
|
||||
-- URL button
|
||||
if selected_server.url then
|
||||
retval = retval .. "tooltip[btn_server_url;" .. fgettext("Open server website") .. "]"
|
||||
retval = retval .. "style[btn_server_url;padding=6]"
|
||||
retval = retval .. "image_button[" .. (can_view_clients_list and "4" or "4.5") .. ",1.3;0.5,0.5;" ..
|
||||
retval = retval .. "image_button[3.5,1.3;0.5,0.5;" ..
|
||||
core.formspec_escape(defaulttexturedir .. "server_url.png") .. ";btn_server_url;]"
|
||||
else
|
||||
retval = retval .. "image[3.6,1.4;0.3,0.3;" .. core.formspec_escape(defaulttexturedir ..
|
||||
"server_url_unavailable.png") .. "]"
|
||||
end
|
||||
|
||||
-- Favorites toggle button
|
||||
if is_selected_fav() then
|
||||
retval = retval .. "tooltip[btn_delete_favorite;" .. fgettext("Remove favorite") .. "]"
|
||||
retval = retval .. "style[btn_delete_favorite;padding=6]"
|
||||
|
@ -468,6 +496,14 @@ local function main_button_handler(tabview, fields, name, tabdata)
|
|||
return true
|
||||
end
|
||||
|
||||
if fields.btn_view_mods then
|
||||
local dlg = create_server_list_mods_dialog(find_selected_server())
|
||||
dlg:set_parent(tabview)
|
||||
tabview:hide()
|
||||
dlg:show()
|
||||
return true
|
||||
end
|
||||
|
||||
if fields.btn_mp_clear then
|
||||
tabdata.search_for = ""
|
||||
menudata.search_result = nil
|
||||
|
|
|
@ -377,17 +377,12 @@ fog_start (Fog start) float 0.4 0.0 0.99
|
|||
|
||||
[**Clouds]
|
||||
|
||||
# Clouds are a client-side effect.
|
||||
enable_clouds (Clouds) bool true
|
||||
|
||||
# Use 3D cloud look instead of flat.
|
||||
#
|
||||
# Requires: enable_clouds
|
||||
# Allow clouds to look 3D instead of flat.
|
||||
enable_3d_clouds (3D clouds) bool true
|
||||
|
||||
# Use smooth cloud shading.
|
||||
#
|
||||
# Requires: enable_3d_clouds, enable_clouds
|
||||
# Requires: enable_3d_clouds
|
||||
soft_clouds (Soft clouds) bool false
|
||||
|
||||
[**Filtering and Antialiasing]
|
||||
|
@ -472,9 +467,6 @@ smooth_lighting (Smooth lighting) bool true
|
|||
# at the expense of minor visual glitches that do not impact game playability.
|
||||
performance_tradeoffs (Tradeoffs for performance) bool false
|
||||
|
||||
# Adds particles when digging a node.
|
||||
enable_particles (Digging particles) bool true
|
||||
|
||||
|
||||
[**Waving Nodes]
|
||||
|
||||
|
@ -667,8 +659,7 @@ sound_volume (Volume) float 0.8 0.0 1.0
|
|||
# Volume multiplier when the window is unfocused.
|
||||
sound_volume_unfocused (Volume when unfocused) float 0.3 0.0 1.0
|
||||
|
||||
# Whether to mute sounds. You can unmute sounds at any time, unless the
|
||||
# sound system is disabled (enable_sound=false).
|
||||
# Whether to mute sounds. You can unmute sounds at any time.
|
||||
# In-game, you can toggle the mute state with the mute key or by using the
|
||||
# pause menu.
|
||||
mute_sound (Mute sound) bool false
|
||||
|
@ -709,12 +700,6 @@ formspec_fullscreen_bg_color (Formspec Full-Screen Background Color) string (0,0
|
|||
# to hardware (e.g. render-to-texture for nodes in inventory).
|
||||
gui_scaling_filter (GUI scaling filter) bool false
|
||||
|
||||
# When gui_scaling_filter_txr2img is true, copy those images
|
||||
# from hardware to software for scaling. When false, fall back
|
||||
# to the old scaling method, for video drivers that don't
|
||||
# properly support downloading textures back from hardware.
|
||||
gui_scaling_filter_txr2img (GUI scaling filter txr2img) bool true
|
||||
|
||||
# Delay showing tooltips, stated in milliseconds.
|
||||
tooltip_show_delay (Tooltip delay) int 400 0 18446744073709551615
|
||||
|
||||
|
@ -1869,10 +1854,7 @@ transparency_sorting_group_by_buffers (Transparency Sorting Group by Buffers) bo
|
|||
|
||||
# Radius of cloud area stated in number of 64 node cloud squares.
|
||||
# Values larger than 26 will start to produce sharp cutoffs at cloud area corners.
|
||||
cloud_radius (Cloud radius) int 12 1 62
|
||||
|
||||
# Whether node texture animations should be desynchronized per mapblock.
|
||||
desynchronize_mapblock_texture_animation (Desynchronize block animation) bool false
|
||||
cloud_radius (Cloud radius) int 12 8 62
|
||||
|
||||
# Delay between mesh updates on the client in ms. Increasing this will slow
|
||||
# down the rate of mesh updates, thus reducing jitter on slower clients.
|
||||
|
@ -1942,7 +1924,7 @@ shadow_poisson_filter (Poisson filtering) bool true
|
|||
# Minimum value: 1; maximum value: 16
|
||||
#
|
||||
# Requires: enable_dynamic_shadows, opengl
|
||||
shadow_update_frames (Map shadows update frames) int 8 1 16
|
||||
shadow_update_frames (Map shadows update frames) int 16 1 32
|
||||
|
||||
# Set to true to render debugging breakdown of the bloom effect.
|
||||
# In debug mode, the screen is split into 4 quadrants:
|
||||
|
@ -2126,9 +2108,6 @@ max_block_send_distance (Max block send distance) int 12 1 65535
|
|||
# Set this to -1 to disable the limit.
|
||||
max_forceloaded_blocks (Maximum forceloaded blocks) int 16 -1
|
||||
|
||||
# Interval of sending time of day to clients, stated in seconds.
|
||||
time_send_interval (Time send interval) float 5.0 0.001
|
||||
|
||||
# Interval of saving important changes in the world, stated in seconds.
|
||||
server_map_save_interval (Map save interval) float 5.3 0.001
|
||||
|
||||
|
@ -2137,7 +2116,7 @@ server_map_save_interval (Map save interval) float 5.3 0.001
|
|||
server_unload_unused_data_timeout (Unload unused server data) int 29 0 4294967295
|
||||
|
||||
# Maximum number of statically stored objects in a block.
|
||||
max_objects_per_block (Maximum objects per block) int 256 1 65535
|
||||
max_objects_per_block (Maximum objects per block) int 256 256 65535
|
||||
|
||||
# Length of time between active block management cycles, stated in seconds.
|
||||
active_block_mgmt_interval (Active block management interval) float 2.0 0.0
|
||||
|
@ -2356,12 +2335,6 @@ show_technical_names (Show technical names) bool false
|
|||
# Controlled by a checkbox in the settings menu.
|
||||
show_advanced (Show advanced settings) bool false
|
||||
|
||||
# Enables the sound system.
|
||||
# If disabled, this completely disables all sounds everywhere and the in-game
|
||||
# sound controls will be non-functional.
|
||||
# Changing this setting requires a restart.
|
||||
enable_sound (Sound) bool true
|
||||
|
||||
# Key for moving the player forward.
|
||||
keymap_forward (Forward key) key KEY_KEY_W
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue