Backport few upstream fixes
|
@ -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",
|
||||
|
|
|
@ -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]]" ..
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;]"
|
||||
|
||||
|
|
After Width: | Height: | Size: 248 B |
After Width: | Height: | Size: 254 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 253 B |
After Width: | Height: | Size: 250 B |
After Width: | Height: | Size: 210 B |
After Width: | Height: | Size: 222 B |
After Width: | Height: | Size: 222 B |
After Width: | Height: | Size: 222 B |
|
@ -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
|
||||
})
|
||||
|
|
|
@ -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=Снег
|
||||
|
|
Before Width: | Height: | Size: 452 B After Width: | Height: | Size: 420 B |
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
enable_hunger = true
|
||||
enable_weather = true
|
||||
compat_send_original_model = false
|
||||
|
|