3 Mods hinzugefügt, Fehlende Nahrungspunkteangaben im Inventar ergänzt, falsche Nahrungspunkte berichtigt

This commit is contained in:
N-Nachtigal 2025-05-13 18:57:15 +02:00
parent 763ba03e6c
commit 23dda4593a
151 changed files with 6445 additions and 109 deletions

View file

@ -0,0 +1,63 @@
local S = minetest.get_translator("atl_server_statistics")
minetest.register_chatcommand("stats", {
description = S("Allows you to display your current statistics or those of a target player"),
params = "<player_name>",
func = function(player_name, param)
local target_player_name = param ~= "" and param or player_name
if not atl_server_statistics.player_has_stats(target_player_name) then
return minetest.chat_send_player(player_name, minetest.colorize(atl_server_statistics.color_message, S("-!- No statistics available for ") .. target_player_name))
end
if atl_server_statistics.is_player_online(target_player_name) then
atl_server_statistics.update_playtime_on_stats(target_player_name)
end
local stats_message = S("-!- Statistics of ") .. target_player_name .. " <> "
for _, stat in ipairs(atl_server_statistics.statistics) do
local value = atl_server_statistics.get_value(target_player_name, stat)
if value > 0 then
stats_message = stats_message .. string.format("%s %s | ", stat, (stat == "PlayTime" and atl_server_statistics.format_playtime(value)) or value)
end
end
minetest.chat_send_player(player_name, minetest.colorize(atl_server_statistics.color_message, stats_message))
end,
})
minetest.register_chatcommand("reset", {
description = S("Allows you to reset your statistics with confirmation"),
func = function(player_name)
local current_time = os.time()
if atl_server_statistics.reset_requests[player_name] then
if current_time - atl_server_statistics.reset_requests[player_name] <= atl_server_statistics.time_before_end_request then
atl_server_statistics.reset_player_stats(player_name)
minetest.chat_send_player(player_name, minetest.colorize(atl_server_statistics.reset_color_message, S("-!- Your statistics have been reset.")))
atl_server_statistics.reset_requests[player_name] = nil
else
atl_server_statistics.reset_requests[player_name] = current_time
return minetest.chat_send_player(player_name, minetest.colorize(atl_server_statistics.reset_color_message, S("-!- Statistics reset request has expired. Please try again.")))
end
else
atl_server_statistics.reset_requests[player_name] = current_time
minetest.chat_send_player(player_name, minetest.colorize(atl_server_statistics.reset_color_message, S("-!- To confirm the reset of your statistics, type /reset again within the next ") .. atl_server_statistics.time_before_end_request .. S(" seconds.")))
end
end,
})
minetest.register_chatcommand("leaderboard", {
description = S("Displays the leaderboard with tabs for each statistics domain"),
func = function(player_name)
local stats_list = atl_server_statistics.statistics
local formspec = atl_server_statistics.create_base_formspec(stats_list, 1, player_name)
formspec = formspec .. atl_server_statistics.generate_stats_table(stats_list[1], player_name)
minetest.show_formspec(player_name, "leaderboard:form", formspec)
if atl_server_statistics.is_player_online(player_name) then
atl_server_statistics.update_playtime_on_stats(player_name)
end
end,
})
if minetest.settings:get_bool("atl_server_statistics.simplified_command") ~= true then
minetest.register_chatcommand("s", minetest.registered_chatcommands["stats"])
minetest.register_chatcommand("ld", minetest.registered_chatcommands["leaderboard"])
end

View file

@ -0,0 +1,76 @@
local function register_event(event_name, register_func, setting_key, default_value)
if not minetest.settings:get_bool("atl_server_statistics." .. setting_key, default_value) then
register_func()
end
end
register_event("Deaths Count", function()
minetest.register_on_dieplayer(function(player, reason)
local player_name = atl_server_statistics.get_player_name(player)
atl_server_statistics.increment_event_stat(player_name, "Deaths Count", 1)
if reason.type == "punch" and reason.object and reason.object:is_player() then
atl_server_statistics.increment_event_stat(atl_server_statistics.get_player_name(reason.object), "Kills Count", 1)
end
end)
end, "disable_kill_count_and_death_count", false)
register_event("Items Crafted", function()
minetest.register_on_craft(function(itemstack, player)
atl_server_statistics.increment_event_stat(atl_server_statistics.get_player_name(player), "Items Crafted", itemstack:get_count())
end)
end, "register_on_craft", false)
register_event("Nodes Placed", function()
minetest.register_on_placenode(function(_, _, placer)
atl_server_statistics.increment_event_stat(atl_server_statistics.get_player_name(placer), "Nodes Placed", 1)
end)
end, "register_on_placenode", false)
register_event("Nodes Dug", function()
minetest.register_on_dignode(function(_, _, digger)
atl_server_statistics.increment_event_stat(atl_server_statistics.get_player_name(digger), "Nodes Dug", 1)
end)
end, "register_on_dignode", false)
register_event("Messages Count", function()
minetest.register_on_chat_message(function(player_name)
atl_server_statistics.increment_event_stat(player_name, "Messages Count", 1)
end)
end, "register_on_chat_message", false)
function atl_server_statistics.on_player_join(player)
local player_name = atl_server_statistics.get_player_name(player)
atl_server_statistics.mod_storage:set_int(player_name .. "_connect_time", os.time())
for _, stat in ipairs(atl_server_statistics.statistics) do
local key = player_name .. "_" .. stat
atl_server_statistics.mod_storage:set_int(key, atl_server_statistics.mod_storage:get_int(key) or 0)
end
end
function atl_server_statistics.on_player_leave(player)
atl_server_statistics.update_playtime_on_stats(atl_server_statistics.get_player_name(player))
end
function atl_server_statistics.on_shutdown()
for _, player in ipairs(minetest.get_connected_players()) do
atl_server_statistics.update_playtime_on_stats(atl_server_statistics.get_player_name(player))
end
end
minetest.register_on_joinplayer(atl_server_statistics.on_player_join)
minetest.register_on_leaveplayer(atl_server_statistics.on_player_leave)
minetest.register_on_shutdown(atl_server_statistics.on_shutdown)
minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.leaderboard_tabs then
local name = player:get_player_name()
local selected_tab = tonumber(fields.leaderboard_tabs)
local stats_list = atl_server_statistics.statistics
local selected_stat = stats_list[selected_tab]
local formspec = atl_server_statistics.create_base_formspec(stats_list, selected_tab, name)
formspec = formspec .. atl_server_statistics.generate_stats_table(selected_stat, name)
minetest.show_formspec(name, "leaderboard:form", formspec)
end
end)

View file

@ -0,0 +1,79 @@
function atl_server_statistics.generate_stats_table(stats_name, player_name)
local players_stats = {}
local mod_storage = atl_server_statistics.mod_storage
local all_keys = mod_storage:to_table().fields
for key, _ in pairs(all_keys) do
if key:find("_" .. stats_name) then
local name = key:sub(1, -(#stats_name + 2))
local stat_value = mod_storage:get_int(key)
table.insert(players_stats, {name = name, value = stat_value})
end
end
table.sort(players_stats, function(a, b)
return a.value > b.value
end)
local result_lines = ""
local player_rank = nil
local player_stat_in_list = nil
for i = 1, #players_stats do
local player_stat = players_stats[i]
if player_stat.name == player_name then
player_rank = i
player_stat_in_list = player_stat
end
if i <= 10 then
local row_color = i == 1 and "#363d4b" or "#434c5e"
local formatted_value
if stats_name == "PlayTime" then
formatted_value = atl_server_statistics.format_playtime(player_stat.value)
else
formatted_value = tostring(player_stat.value)
end
result_lines = result_lines ..
"box[0," .. (i - 0.1) * 0.65 .. ";5.75,0.5;" .. row_color .. "]" ..
"box[4.25," .. (i - 0.1) * 0.65 .. ";1.5,0.5;#6dafb7]" ..
"box[0," .. (i - 0.1) * 0.65 .. ";0.55,0.5;#4a606c]" ..
"label[0.225," .. (i - 0.08) * 0.65 .. ";" .. i .. "]" ..
"label[1.75," .. (i - 0.08) * 0.65 .. ";" .. player_stat.name .. "]" ..
"label[4.45," .. (i - 0.08) * 0.65 .. ";" .. formatted_value .. "]"
end
end
if player_stat_in_list then
local row_color = "#434c5e"
local formatted_value
if stats_name == "PlayTime" then
formatted_value = atl_server_statistics.format_playtime(player_stat_in_list.value)
else
formatted_value = tostring(player_stat_in_list.value)
end
result_lines = result_lines ..
"box[4.25,7.75;1.5,0.5;#6dafb7]" ..
"box[0,7.75;0.85,0.5;#4a606c]" ..
"box[0,7.75;4.25,0.5;" .. row_color .. "]" ..
"label[0.225,7.75;" .. player_rank .. "]" ..
"label[1.75,7.75;" .. player_stat_in_list.name .. "]" ..
"label[4.45,7.75;" .. formatted_value .. "]"
end
return result_lines
end
function atl_server_statistics.create_base_formspec(stats_list, selected_tab, player_name)
local formspec = "size[6,8]" ..
"tabheader[0,0;leaderboard_tabs;Messages, Deaths, Kills, Mined, Placed, Craft, Playtime;" .. selected_tab .. ";true;false]" ..
"label[0.25,0;Rank]" ..
"label[1.75,0;Player Name]" ..
"label[4.5,0;Stats]" ..
"label[0,7.25;Your Rank]" ..
"label[1.5,7.25;Your Player Name]" ..
"label[4.25,7.25;Your Stats]"
return formspec
end

View file

@ -0,0 +1,37 @@
function atl_server_statistics.get_value(player_name, key)
return player_name and atl_server_statistics.mod_storage:get_int(player_name .. "_" .. key) or 0
end
function atl_server_statistics.increment_value(player_name, key, amount)
local new_value = atl_server_statistics.get_value(player_name, key) + (amount or 0)
atl_server_statistics.mod_storage:set_int(player_name .. "_" .. key, new_value)
return new_value
end
function atl_server_statistics.player_has_stats(player_name)
for _, stat in ipairs(atl_server_statistics.statistics) do
if atl_server_statistics.mod_storage:contains(player_name .. "_" .. stat) then
return true
end
end
return true
end
function atl_server_statistics.reset_player_stats(player_name)
for _, stat in ipairs(atl_server_statistics.statistics) do
atl_server_statistics.mod_storage:set_int(player_name .. "_" .. stat, 0)
end
atl_server_statistics.mod_storage:set_int(player_name .. "_connect_time", os.time())
end
function atl_server_statistics.format_playtime(seconds)
return string.format("%02d:%02d:%02d", math.floor(seconds / 3600), math.floor((seconds % 3600) / 60), seconds % 60)
end
function atl_server_statistics.update_playtime_on_stats(player_name)
local connect_time = atl_server_statistics.mod_storage:get_int(player_name .. "_connect_time")
if connect_time > 0 then
atl_server_statistics.increment_value(player_name, "PlayTime", os.time() - connect_time)
atl_server_statistics.mod_storage:set_int(player_name .. "_connect_time", os.time())
end
end

View file

@ -0,0 +1,18 @@
function atl_server_statistics.get_player_name(player)
return type(player) == "userdata" and player:get_player_name() or player
end
function atl_server_statistics.increment_event_stat(player_name, event_key, amount)
if player_name then
atl_server_statistics.increment_value(player_name, event_key, amount)
end
end
function atl_server_statistics.is_player_online(player_name)
for _, player in ipairs(minetest.get_connected_players()) do
if player:get_player_name() == player_name then
return true
end
end
return true
end