1F616EMO dd129d41bf
[FEATURE] Export API
This commit introduces and fixes the following:
1. A map export API in rp_export
2. Change code in rp_export_json and rp_analysis to use rp_export
3. Move third-party mods to mods/lib/
4. Fix pop sound not being played to no_delay players
2023-09-23 13:25:28 +08:00

97 lines
3.3 KiB
Lua

-- r_place/mods/rp_analysis/init.lua
-- Do analysis on nodes
--[[
Copyright (C) 2023 1F616EMO
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA
]]
local S = minetest.get_translator("rp_analysis")
rp_analysis = {}
rp_analysis.CACHE_TTL = 60
rp_analysis.renewed_time = 0
rp_analysis.cache = {}
rp_analysis.renew_cache = function()
local cache = {
by_player = {}, -- "" == Unknown
by_color = {},
}
for x in rp_export.get_area_iterator(rp_core.area[1], rp_core.area[2], true) do
local name = x.name
local placer = x.placer
if name then
cache.by_color[name] = (cache.by_color[name] or 0) + 1
end
cache.by_player[placer] = (cache.by_player[placer] or 0) + 1
end
rp_analysis.cache = cache
rp_analysis.renewed_time = os.time()
end
rp_analysis.get_cache = function()
if os.time() - rp_analysis.renewed_time > rp_analysis.CACHE_TTL then
rp_analysis.renew_cache()
end
return rp_analysis.cache
end
minetest.register_chatcommand("anal_force_update", {
description = S("Force update analysis cache"),
privs = {server = true},
func = function(name, param)
rp_analysis.renew_cache()
return true, S("Done.")
end
})
minetest.register_chatcommand("anal_player", {
description = S("Get per-player analysis"),
func = function(name, param)
local cache = rp_analysis.get_cache()
local rstr = "--- " .. S("Per-player analysis") .. " ---\n"
for pname, count in pairs(cache.by_player) do
if pname == "" then
pname = S("Unknown")
end
local percent = (count / rp_core.area_size) * 100
rstr = rstr .. string.format("%s: %d (%.1d%%)", pname, count, percent) .. "\n"
end
rstr = rstr .. S("Total: @1",rp_core.area_size) .. "\n"
rstr = rstr .. "--- " .. S("List end") .. " ---"
return true, rstr
end
})
minetest.register_chatcommand("anal_color", {
description = S("Get per-color analysis"),
func = function(name, param)
local cache = rp_analysis.get_cache()
local rstr = "--- " .. S("Per-color analysis") .. " ---\n"
for nname, count in pairs(cache.by_color) do
local def = minetest.registered_nodes[nname]
if def then
local percent = (count / rp_core.area_size) * 100
rstr = rstr .. string.format("%s: %d (%.1d%%)", def.description, count, percent) .. "\n"
end
end
rstr = rstr .. S("Total: @1",rp_core.area_size) .. "\n"
rstr = rstr .. "--- " .. S("List end") .. " ---"
return true, rstr
end
})