Backport few upstream fixes

master
Maksim 2022-05-30 17:15:23 +03:00
parent 4a05c7739d
commit c99ebc8a44
24 changed files with 82 additions and 150 deletions

View File

@ -12,19 +12,18 @@ globals = {
"minetest",
"areas",
"experience",
"invisibility",
"mobs",
"screwdriver",
"workbench",
"brewing",
}
read_globals = {
"DIR_DELIM",
"PLATFORM",
"intllib",
"hud",
"hunger",
"Sl",
"dump",
"vector",
"utf8",

View File

@ -39,7 +39,7 @@ local large_chest_formspec = "size[9,11.6]" ..
"background[0,1;0,0;formspec_background_color.png;true]" ..
"background[-0.2,-0.35;9.42,12.46;formspec_chest_large.png]" ..
"background[-0.19,2.68;9.4,9.43;formspec_inventory.png]" ..
"image_button_exit[8.4,-0.2;0.75,0.75;close.png;exit;;true;false;close_pressed.png]" ..
default.gui_close_btn("8.35,-0.2") ..
"item_image[0,-0.2;1,1;default:chest]" ..
"label[0.9,0;" .. S("Large Chest") .. "]" ..
"image[7.95,6;1.1,1.1;^[colorize:#D6D5E6]]" ..

View File

@ -11,6 +11,8 @@ local function formspec_string(lpp, page, lines, string)
return string
end
local function gold(s) return minetest.colorize("#ff0", s) end
local lpp = 14 -- Lines per book's page
local function book_on_use(itemstack, user)
local player_name = user:get_player_name()
@ -45,7 +47,7 @@ local function book_on_use(itemstack, user)
local item_name = itemstack:get_name()
local formspec = "size[9,8.75]" ..
default.gui_bg .. default.gui_bg_img ..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;false;close_pressed.png]" ..
default.gui_close_btn() ..
"item_image[0,-0.1;1,1;" .. item_name .. "]"
if owner == player_name then
@ -59,13 +61,13 @@ local function book_on_use(itemstack, user)
else
formspec = formspec ..
"label[0.9,0.1;" .. esc(S("Book")) .. ": " ..
C.gold .. "\"" .. esc(title) .. "\", " ..
C.white .. esc(S("by @1", owner)) .. "]" ..
"\"" .. esc(gold(title)) .. "\", " ..
esc(S("by @1", owner)) .. "]" ..
"textarea[0.5,0.9;8.5,8;;" .. esc(string ~= "" and string or text) .. ";]" ..
"button[2.4,8;0.8,0.8;book_prev;<]" ..
"image_button[3,8;3,0.8;blank.png;;" ..
S("Page: @1 of @2", page, page_max) .. ";false;false;]" ..
"button[5.8,8;0.8,0.8;book_next;>]"
"image_button[0.1,8.2;0.75,0.75;formspec_prev.png;book_prev;;true;false;formspec_prev_pressed.png]" ..
"image_button[3,8.2;3,0.75;blank.png;;" ..
S("Page: @1 of @2", gold(page), gold(page_max)) .. ";false;false;]" ..
"image_button[8.1,8.2;0.75,0.75;formspec_next.png;book_next;;true;false;formspec_next_pressed.png]"
end
minetest.show_formspec(player_name, "default:book", formspec)

View File

@ -23,15 +23,18 @@ minetest.register_craftitem("default:cell", {
})
default.gui_bg = "bgcolor[#08080880;true]"
default.listcolors = "listcolors[#9990;#FFF7;#FFF0;#160816;#D4D2FF]"
default.gui_bg_img = "background[0,0;0,0;formspec_background_color.png^" ..
"formspec_backround.png;true]"
default.listcolors = "listcolors[#0000;#fff7;#0000;#656276;#fff]"
default.gui_bg_img = "background[-0.2,-0.26;16.71,17.36;formspec_inventory_backround.png]"
function default.gui_close_btn(pos)
pos = pos or "8.35,-0.1"
return "image_button_exit[" .. pos .. ";0.75,0.75;close.png;exit;;true;false;close_pressed.png]"
end
default.gui = "size[9,8.75]" ..
default.gui_bg ..
default.listcolors ..
"background[0,0;0,0;formspec_background_color.png^" ..
"formspec_backround.png^formspec_inventory.png;true]" ..
"image_button_exit[8.4,-0.1;0.75,0.75;close.png;exit;;true;false;close_pressed.png]" ..
default.gui_bg_img ..
"background[0,0;0,0;formspec_inventory.png;true]" ..
default.gui_close_btn() ..
"list[current_player;main;0.01,4.51;9,3;9]" ..
"list[current_player;main;0.01,7.75;9,1;]"

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

View File

@ -246,7 +246,7 @@ minetest.register_chatcommand("weather", {
for w in pairs(weather.registered) do
types = types .. ", " .. w
end
minetest.chat_send_player(name, S("Avalible weather types: @1.", types))
minetest.chat_send_player(name, S("Available weather types: @1.", types))
end
end
})

View File

@ -1,7 +1,7 @@
# textdomain: weather_lite
Setting the weather type=Установка типа погоды
Set weather type: @1.=Установлен тип погоды: @1.
Avalible weather types: @1.=Доступные типы погоды: @1.
Available weather types: @1.=Доступные типы погоды: @1.
Set clear weather.=Установлена ясная погода.
Rain=Дождь
Snow=Снег

Binary file not shown.

Before

Width:  |  Height:  |  Size: 452 B

After

Width:  |  Height:  |  Size: 420 B

View File

@ -77,7 +77,7 @@ else -- legacy MultiCraft Engine
end
local sfinv_exists = minetest.global_exists("sfinv")
local sscsm_enabled = minetest.global_exists("sscsm")
local sfinv_sscsm_exists = minetest.global_exists("sfinv_sscsm")
function player_api.update_wielded_item(player, name)
local item = player:get_wielded_item():get_name()
local b = "blank.png"
@ -87,7 +87,7 @@ function player_api.update_wielded_item(player, name)
set_textures(player, nil, nil, nil, wield_tile, wield_cube)
wielded_item[name] = item
if sfinv_exists and (not sscsm_enabled or not sscsm.has_sscsms_enabled(name)) then
if sfinv_exists and (not sfinv_sscsm_exists or not sfinv_sscsm.has_sscsm_inv(name)) then
sfinv.set_player_inventory_formspec(player)
end
end

View File

@ -21,10 +21,6 @@ playereffects.effect_types = {}
--[[ table containing all the active effects ]]
playereffects.effects = {}
--[[ table containing all the inactive effects.
Effects become inactive if a player leaves an become active again if they join again. ]]
playereffects.inactive_effects = {}
-- Variable for counting the effect_id
playereffects.last_effect_id = 0
@ -35,12 +31,6 @@ playereffects.last_effect_id = 0
-- Whether to use the HUD to expose the active effects to players (true or false)
playereffects.use_hud = true
-- Whether to use autosave (true or false)
local use_autosave = false
-- The time interval between autosaves, in seconds (only used when use_autosave is true)
local autosave_time = 10
-- Translations
S = minetest.get_translator_auto({"ru"})
@ -59,25 +49,6 @@ local function round(number)
return math.floor(number + 0.5)
end
--[=[ Load inactive_effects and last_effect_id from playereffects, if this file exists ]=]
do
local filepath = minetest.get_worldpath() .. "/playereffects"
local file = io.open(filepath, "r")
if file then
minetest.log("action", "[playereffects] playereffects loading...")
local string = file:read()
io.close(file)
if string then
local savetable = minetest.deserialize(string)
playereffects.inactive_effects = savetable.inactive_effects
-- minetest.debug("[playereffects] playereffects successfully read.")
-- minetest.debug("[playereffects] inactive_effects = " .. dump(playereffects.inactive_effects))
-- playereffects.last_effect_id = savetable.last_effect_id
-- minetest.debug("[playereffects] last_effect_id = " .. dump(playereffects.last_effect_id))
end
end
end
function playereffects.next_effect_id()
playereffects.last_effect_id = playereffects.last_effect_id + 1
return playereffects.last_effect_id
@ -103,7 +74,7 @@ end
function playereffects.apply_effect_type(effect_type_id, duration, player, repeat_interval_time_left)
local playername = player and player:get_player_name()
if not playername or type(player) == "userdata" and not player:is_player() then
if not playername or not minetest.is_player(player) then
minetest.log("error", "[playereffects] Attempted to apply effect type " .. effect_type_id .. " to a non-player!")
return false
end
@ -266,7 +237,7 @@ function playereffects.get_player_effects(playername)
if minetest.get_player_by_name(playername) then
for _, v in pairs(playereffects.effects) do
if v.playername == playername then
effects[#effects+1] = v
effects[#effects + 1] = v
end
end
end
@ -285,65 +256,6 @@ function playereffects.has_effect_type(playername, effect_type_id)
return false
end
--[=[ Saving all data to file ]=]
function playereffects.save_to_file()
local savetable = {}
local inactive_effects = {}
for playername, effecttable in pairs(playereffects.inactive_effects) do
if inactive_effects[playername] == nil then
inactive_effects[playername] = {}
end
local pinacteff = inactive_effects[playername]
for i = 1, #effecttable do
pinacteff[#pinacteff+1] = effecttable[i]
end
end
for _, effect in pairs(playereffects.effects) do
local new_duration, new_repeat_duration
if playereffects.effect_types[effect.effect_type_id].repeat_interval then
new_duration = effect.time_left
new_repeat_duration = effect.repeat_interval_time_left - (time - effect.repeat_interval_start_time)
else
new_duration = effect.time_left - (time - effect.start_time)
end
if new_duration > 0 then
local new_effect = {
effect_id = effect.effect_id,
effect_type_id = effect.effect_type_id,
time_left = new_duration,
repeat_interval_time_left = new_repeat_duration,
start_time = effect.start_time,
repeat_interval_start_time = effect.repeat_interval_start_time,
playername = effect.playername,
metadata = effect.metadata
}
local player_inactive_effects_effect = inactive_effects[effect.playername]
player_inactive_effects_effect[#player_inactive_effects_effect+1] = new_effect
end
end
for playername, _ in pairs(inactive_effects) do
if #inactive_effects[playername] < 1 then
inactive_effects[playername] = nil
end
end
savetable.inactive_effects = inactive_effects
-- savetable.last_effect_id = playereffects.last_effect_id
local savestring = minetest.serialize(savetable)
local filepath = minetest.get_worldpath() .. "/playereffects"
local result = minetest.safe_file_write(filepath, savestring)
if result then
minetest.log("action", "[playereffects] Wrote playereffects data into " .. filepath .. ".")
else
minetest.log("error", "[playereffects] Failed to write playereffects data into " .. filepath .. ".")
end
end
--[=[ Callbacks ]=]
--[[ Cancel all effects on player death ]]
minetest.register_on_dieplayer(function(player)
@ -355,37 +267,50 @@ minetest.register_on_dieplayer(function(player)
end
end)
minetest.register_on_leaveplayer(function(player)
local playername = player:get_player_name()
local effects = playereffects.get_player_effects(playername)
local function save_meta(player)
local player_name = player:get_player_name()
local effects = playereffects.get_player_effects(player_name)
playereffects.hud_clear(player)
local inactive_effects = playereffects.inactive_effects[playername]
for e = 1, #effects do
local new_duration = effects[e].time_left - (time - effects[e].start_time)
local valid_effects = {}
for _, effect in ipairs(effects) do
-- I think time_left is actually the total duration and not the
-- remaining time.
local new_duration = effect.time_left - (time - effect.start_time)
if new_duration > 0 then
local new_effect = effects[e]
new_effect.time_left = new_duration
inactive_effects[#inactive_effects+1] = new_effect
playereffects.cancel_effect(effects[e].effect_id)
effect.time_left = new_duration
valid_effects[#valid_effects + 1] = effect
end
end
player:get_meta():set_string("playereffects", minetest.serialize(valid_effects))
end
minetest.register_on_leaveplayer(function(player)
save_meta(player)
playereffects.hud_clear(player)
end)
minetest.register_on_shutdown(function()
minetest.log("action", "[playereffects] Server shuts down. Rescuing data into playereffects")
playereffects.save_to_file()
local players = minetest.get_connected_players()
for i = 1, #players do
save_meta(players[i])
end
end)
minetest.register_on_joinplayer(function(player)
local playername = player:get_player_name()
-- load all the effects again (if any)
local meta = player:get_meta()
playereffects.hudinfos[playername] = {}
local inactive_effects = playereffects.inactive_effects[playername]
local inactive_effects = minetest.deserialize(meta:get_string("playereffects"))
if inactive_effects ~= nil then
minetest.after(2, function()
minetest.after(1, function()
-- Make sure the player hasn't left
player = minetest.get_player_by_name(playername)
if not player then return end
for i = 1, #inactive_effects do
local effect = inactive_effects[i]
-- Don't apply unknown effects
@ -395,25 +320,10 @@ minetest.register_on_joinplayer(function(player)
end
end)
end
playereffects.inactive_effects[playername] = {}
end)
-- Autosave into file
if use_autosave then
minetest.register_globalstep(function(dtime)
playereffects.autosave_timer = playereffects.autosave_timer or 0
playereffects.autosave_timer = playereffects.autosave_timer + dtime
if playereffects.autosave_timer >= autosave_time then
playereffects.autosave_timer = 0
minetest.log("action", "[playereffects] Autosaving mod data to playereffects...")
playereffects.save_to_file()
end
end)
end
minetest.register_playerstep(function(_, playernames)
for _, name in pairs(playernames) do
for _, name in ipairs(playernames) do
local player = minetest.get_player_by_name(name)
if player and player:is_player() then
playereffects.hud_update(player)
@ -503,3 +413,6 @@ function playereffects.hud_effect(effect_type_id, player, pos)
return text_id, icon_id
end
-- Remove the old playereffects file
os.remove(minetest.get_worldpath() .. "/playereffects")

View File

@ -1,7 +1,7 @@
sethome = {}
-- Intllib
local S = intllib.make_gettext_pair()
local S = minetest.get_translator_auto(true)
sethome.set = function(name, pos)
local player = minetest.get_player_by_name(name)

View File

@ -221,6 +221,7 @@ function sfinv.defer_takeover()
blockers = blockers - 1
assert(blockers >= 0)
if blockers == 0 then
sscsm.com_send("sfinv_sscsm:takeover")
sfinv.set_player_inventory_formspec()
end
end

View File

@ -1,3 +1,10 @@
sfinv_sscsm = {}
local sscsm_inv_players = {}
function sfinv_sscsm.has_sscsm_inv(name)
return sscsm_inv_players[name] ~= nil
end
if not minetest.global_exists("sscsm") then
return
end
@ -8,6 +15,14 @@ sscsm.register({
file = minetest.get_modpath("sfinv_sscsm") .. DIR_DELIM .. "api.lua",
})
sscsm.register_on_com_receive("sfinv_sscsm:takeover", function(name)
sscsm_inv_players[name] = true
end)
minetest.register_on_leaveplayer(function(player)
sscsm_inv_players[player:get_player_name()] = nil
end)
-- If an SSCSM handler returns false, it will get sent to the server here.
sscsm.register_on_com_receive("sfinv_sscsm:fields", function(name, fields)
local player = minetest.get_player_by_name(name)
@ -32,7 +47,7 @@ end)
-- Add sfinv.open_formspec().
function sfinv.open_formspec(player, context)
local name = player:get_player_name()
if sscsm.has_sscsms_enabled(name) then
if sscsm_inv_players[name] then
sscsm.com_send(name, "sfinv_sscsm:open_formspec")
return
end
@ -44,7 +59,7 @@ end
local old_set_page = sfinv.set_page
function sfinv.set_page(player, pagename, temp)
local name = player:get_player_name()
if sscsm.has_sscsms_enabled(name) then
if sscsm_inv_players[name] then
sscsm.com_send(name, "sfinv_sscsm:set_page", {pagename, temp})
if temp then return end
end

View File

@ -302,8 +302,7 @@ local function edit_text(pos, _, clicker)
local text = esc(meta:get_string("sign_text"))
local edit_fs = "size[5,3.4]" ..
"background[0,0;0,0;formspec_background_color.png^" ..
"formspec_backround.png;true]"
"background[0,0;0,0;formspec_background_color.png^formspec_backround.png;true]"
if not minetest.is_protected(pos, player_name) then
local ccolor = meta:get_string("sign_color")
if ccolor then

View File

@ -47,7 +47,7 @@ function toolranks.new_afteruse(itemstack, user, _, digparams)
-- Warn player when tool is almost broken
if itemstack:get_wear() > 63500 then
minetest.chat_send_player(name,
C.gold .. S("Your tool \"@1\" is almost broken!",
C.gold .. S("Your tool @1 is almost broken!",
(C.ruby .. itemdesc .. C.gold)))
minetest.sound_play("default_tool_breaks", {to_player = name})

View File

@ -1,2 +1,2 @@
enable_hunger = true
enable_weather = true
compat_send_original_model = false