2024-12-10 02:34:33 +01:00

135 lines
4.7 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[ This mod is basically a compromise solution
for a long-known bug.
It checks if Luanti is running with the recommended
player movement settings. If the player has set any of the
relevant movement settings to a non-default value, that will
take preference over the game settings, which will break
this games vision somewhat, since the levels are carefully
designed to work with the game-provided movement settings.
Since there apparently is no way for Lazarr! to force-set
the movement settings without some arcane hackery, this mod
will just check the values and display a warning if a
deviation has been detected.
(This is important because it is very hard for a player
to realize otherwise they're playing Lazarr! with the
"wrong" physics.)
The player is then given a choice to either return to
Luanti and fix the problem or to ignore it and
continue playing.
Both a dialog message and a chat message will be displayed.
FIXME: Find a non-hacky (!) way for Lazarr! to force player-movement
settings, then remove this mod.
]]
lzr_check_movement_settings = {}
local S = minetest.get_translator("lzr_check_movement_settings")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local F = minetest.formspec_escape
-- Threshold for floating-point equality check
local EPSILON = 0.0001
-- This is the list of settings that needed to be checked, and their
-- expected value.
-- IMPORTANT: This MUST be equal to minetest.conf in this game's root directory!
local settings_to_check = {
movement_speed_walk = 4.0,
movement_speed_crouch = 1.35,
movement_speed_climb = 3.0,
movement_speed_jump = 6.5,
movement_gravity = 9.81,
movement_acceleration_air = 2.0,
movement_acceleration_default = 3.0,
movement_liquid_fluidity = 1.0,
movement_liquid_fluidity_smooth = 0.5,
movement_liquid_sink = 10.0,
}
local check_settings = function()
local invalid_settings = {}
for key, expected_value in pairs(settings_to_check) do
local actual_value = tonumber(minetest.settings:get(key))
if actual_value then
-- Floating-point equality check with tolerance
if math.abs(expected_value - actual_value) > EPSILON then
table.insert(invalid_settings, key)
end
end
end
return invalid_settings
end
local invalid_settings = check_settings()
local registered_on_dismiss_warnings = {}
lzr_check_movement_settings.register_on_dismiss_warning = function(callback)
table.insert(registered_on_dismiss_warnings, callback)
end
local STR_WARNING_1 = S("WARNING: The player movement settings are not at the recommended values for Lazarr! The physics might not work as intended!")
local STR_WARNING_2 = S("Please exit the game and reset the following Luanti settings to their default value:")
--~ list separator for list of invalid player movement settings
local STR_INVALID_SETTINGS = table.concat(invalid_settings, S(", "))
local disconnect = function(player)
minetest.log("action", "[lzr_check_movement_settings] "..player:get_player_name().." chose to leave the game")
minetest.disconnect_player(player:get_player_name(), S("You quit. Remember, Lazarr! expects the following Luanti settings to be reset to the default value: @1", STR_INVALID_SETTINGS))
end
local show_dialog = function(player_name)
local form = "formspec_version[7]size[10,5]"..
"textarea[1,0.8;8,2.5;;;"..F(STR_WARNING_1).."\n"..F(STR_WARNING_2).."\n"..STR_INVALID_SETTINGS.."]"..
"button_exit[1,3.5;3,0.8;exit;"..FS("Exit game").."]"..
"button_exit[5.5,3.5;3,0.8;play;"..FS("Continue playing anyway").."]"
minetest.show_formspec(player_name, "lzr_check_movement_settings:movement_settings_warning", form)
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "lzr_check_movement_settings:movement_settings_warning" then
return
end
if fields.exit then
disconnect(player)
elseif fields.play or fields.quit then
minetest.log("action", "[lzr_check_movement_settings] "..player:get_player_name().." chose to play game despite the non-default movement settings")
-- Call 'dismiss warning' callbacks
for i=1, #registered_on_dismiss_warnings do
registered_on_dismiss_warnings[i](player)
end
end
end)
minetest.register_on_joinplayer(function(player)
local pname = player:get_player_name()
if #invalid_settings == 0 then
return
end
minetest.log("action", "[lzr_check_movement_settings] Non-default movement settings detected, game physics might be degraded")
-- Chat messages
local function msg(text)
minetest.chat_send_player(pname, minetest.colorize("#FF8000", text))
end
msg(STR_WARNING_1)
msg(STR_WARNING_2)
msg(STR_INVALID_SETTINGS)
-- Additional, a dialog
show_dialog(pname)
end)
-- Expose checker function publicly
lzr_check_movement_settings.check_movement_settings = function()
local t = check_settings()
if #t == 0 then
return true
else
return false
end
end