MineClone2/mods/HUD/mcl_info/init.lua
Michieal 8184d4938c Modify init.lua to allow normal player usage.
Changes made:
* Put in new chatcommand /whereami to allow normal players to turn on / off player location coords without needing special privs.
* Made Debug Coords level 2, Player Location level 1, and Off level 0. (Allows turning the location off.)
* Put in nil value check into get_text, to prevent errors caused by definitions accidentally not returning a value.
* Cached pairs, ipairs, and table because the code is called every 0.63 seconds, and it made sense to do so. (Hopefully, will help
  to mitigate the added load on framerate.)
2022-11-27 04:31:24 +01:00

215 lines
6.3 KiB
Lua

mcl_info = {}
local refresh_interval = .63
local huds = {}
local default_debug = 0
local after = minetest.after
local get_connected_players = minetest.get_connected_players
local get_biome_name = minetest.get_biome_name
local get_biome_data = minetest.get_biome_data
local format = string.format
local pairs = pairs
local ipairs = ipairs
local table = table
local min1, min2, min3 = mcl_vars.mg_overworld_min, mcl_vars.mg_end_min, mcl_vars.mg_nether_min
local max1, max2, max3 = mcl_vars.mg_overworld_max, mcl_vars.mg_end_max, mcl_vars.mg_nether_max + 128
local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname)
local storage = minetest.get_mod_storage()
local player_dbg = {}
local function check_setting(s)
return s
end
--return player setting, set it to 2nd argument if supplied
local function player_setting(p,s)
local name = p:get_player_name()
if check_setting(s) then
p:get_meta():set_string("mcl_info_show",s)
player_dbg[name] = tonumber(s)
end
if not player_dbg[name] then
local r = p:get_meta():get_string("mcl_info_show")
if r == nil or r == "" then r = 0 end
player_dbg[name] = tonumber(r)
end
return player_dbg[name]
end
mcl_info.registered_debug_fields = {}
local fields_keyset = {}
function mcl_info.register_debug_field(name,def)
table.insert(fields_keyset,name)
mcl_info.registered_debug_fields[name]=def
end
local function nodeinfo(pos)
local n = minetest.get_node_or_nil(pos)
if not n then return "" end
local l = minetest.get_node_light(pos)
local ld = minetest.get_node_light(pos,0.5)
local r = n.name .. " p1:"..n.param1.." p2:"..n.param2
if l and ld then
r = r .. " Light: "..l.."/"..ld
end
return r
end
local function get_text(player, bits)
local pos = vector.offset(player:get_pos(),0,0.5,0)
local bits = bits
if bits == -1 then return "" end
local r = ""
for _,key in ipairs(fields_keyset) do
local def = mcl_info.registered_debug_fields[key]
if def then
if def.level == nil or def.level <= bits then
r = r ..key..": "..tostring(def.func(player,pos)).."\n"
end
else
r = r ..key..": <Unknown Field>\n"
end
end
return r
end
local function info()
for _, player in pairs(get_connected_players()) do
local name = player:get_player_name()
local s = player_setting(player)
local pos = player:get_pos()
local text = get_text(player, s)
local hud = huds[name]
if s and not hud then
local def = {
hud_elem_type = "text",
alignment = {x = 1, y = -1},
scale = {x = 100, y = 100},
position = {x = 0.0073, y = 0.889},
text = text,
style = 5,
["number"] = 0xcccac0,
z_index = 0,
}
local def_bg = table.copy(def)
def_bg.offset = {x = 2, y = 1}
def_bg["number"] = 0
def_bg.z_index = -1
huds[name] = {
player:hud_add(def),
player:hud_add(def_bg),
text,
}
elseif text ~= hud[3] then
hud[3] = text
player:hud_change(huds[name][1], "text", text)
player:hud_change(huds[name][2], "text", text)
end
end
after(refresh_interval, info)
end
minetest.after(0,info)
minetest.register_on_leaveplayer(function(p)
local name = p:get_player_name()
huds[name] = nil
player_dbg[name] = nil
end)
minetest.register_chatcommand("debug",{
description = S("Set debug bit mask: 0 = disable, 1 = player coords, 2 = coordinates, 3 = biome name, 4 = all"),
params = S("<bitmask>"),
privs = { debug = true },
func = function(name, params)
local player = minetest.get_player_by_name(name)
if params == "" then return true, "Debug bitmask is "..player_setting(player) end
local dbg = math.floor(tonumber(params) or default_debug)
if dbg < -1 or dbg > 4 then
minetest.chat_send_player(name, S("Error! Possible values are integer numbers from @1 to @2", -1, 4))
return false,"Current bitmask: "..player_setting(player)
end
return true, "Debug bit mask set to "..player_setting(player,dbg)
end
})
-- register normal user access to debug levels 1 and 0.
minetest.register_chatcommand("whereami", {
description = S("Set location bit mask: 0 = disable, 1 = coordinates"),
params = S("<bitmask>"),
-- privs = { },
func = function(name, params)
local player = minetest.get_player_by_name(name)
if params == "" then
return true, "Location bitmask is " .. player_setting(player)
end
local loc_lev = math.floor(tonumber(params) or default_debug)
if loc_lev < 0 or loc_lev > 4 then
minetest.chat_send_player(name, S("Error! Possible values are integer numbers from @1 to @2", 0, 1))
return false, "Current bitmask: " .. player_setting(player)
end
return true, "Location bit mask set to " .. player_setting(player, loc_lev)
end
})
mcl_info.register_debug_field("Node feet",{
level = 4,
func = function(pl,pos)
return nodeinfo(pos)
end
})
mcl_info.register_debug_field("Node below",{
level = 4,
func = function(pl,pos)
return nodeinfo(vector.offset(pos,0,-1,0))
end
})
mcl_info.register_debug_field("Biome",{
level = 3,
func = function(pl,pos)
local biome_data = get_biome_data(pos)
local biome = biome_data and get_biome_name(biome_data.biome) or "No biome"
if biome_data then
return format("%s (%s), Humidity: %.1f, Temperature: %.1f",biome, biome_data.biome, biome_data.humidity, biome_data.heat)
end
return "No biome"
end
})
mcl_info.register_debug_field("Coords", {
level = 2,
func = function(pl, pos)
return format("x:%.1f y:%.1f z:%.1f", pos.x, pos.y, pos.z)
end
})
mcl_info.register_debug_field("Location", {
level = 1,
func = function(pl, pos)
local report_y = 0
-- overworld
if (pos.y >= mcl_vars.mg_overworld_min) and (pos.y <= mcl_vars.mg_overworld_max) then
return format("Overworld: x:%.1f y:%.1f z:%.1f", pos.x, pos.y, pos.z)
end
-- nether
if (pos.y >= mcl_vars.mg_nether_min) and (pos.y <= mcl_vars.mg_nether_max) then
report_y = pos.y - mcl_vars.mg_nether_min
return format("Nether: x:%.1f y:%.1f z:%.1f", pos.x, report_y, pos.z)
end
-- end
if (pos.y >= mcl_vars.mg_end_min) and (pos.y <= mcl_vars.mg_end_max) then
report_y = pos.y - mcl_vars.mg_end_min
return format("End: x:%.1f y:%.1f z:%.1f", pos.x, report_y, pos.z)
end
-- outside of scoped bounds.
return format("Void: x:%.1f y:%.1f z:%.1f", pos.x, pos.y, pos.z)
end
})