diff --git a/mods/inspector/init.lua b/mods/inspector/init.lua index 0d3091a..5fe10ad 100644 --- a/mods/inspector/init.lua +++ b/mods/inspector/init.lua @@ -18,30 +18,51 @@ local function dehash_vector(s) } end +local indent_string = " " + +local function indent(level, text, emphasize) + local result = text + for i = 1, level do + if emphasize then + result = "-> " .. string.gsub(result, "\n", "\n" .. indent_string) + else + result = indent_string .. string.gsub(result, "\n", "\n" .. indent_string) + end + end + return result +end + +local function adjusted_dump(o) + local result = dump(o, indent_string) + if result == "{\n" .. indent_string .. "\n}" then result = "{}" end + return result +end + local function inspect_pos(pos) local node = minetest.get_node(pos) local desc = "===== node data =====\n" - desc = desc .. "name = " .. node.name .. "\n" - desc = desc .. "param1 = " .. node.param1 .. "\n" - desc = desc .. "param2 = " .. node.param2 .. "\n" - local light = minetest.get_node_light({x = pos.x, y = pos.y + 1, z = pos.x}, nil) + desc = desc .. indent(1, "name = " .. node.name) .. "\n" + desc = desc .. indent(1, "param1 = " .. node.param1) .. "\n" + desc = desc .. indent(1, "param2 = " .. node.param2) .. "\n" + local light = minetest.get_node_light({x = pos.x, y = pos.y + 1, z = pos.z}, nil) if light then - desc = desc .. "light = " .. light .. "\n" + desc = desc .. indent(1, "light = " .. light) .. "\n" end local timer = minetest.get_node_timer(pos) if timer:get_timeout() ~= 0 then desc = desc .. "==== node timer ====\n" - desc = desc .. "timeout = " .. timer:get_timeout() .. "\n" - desc = desc .. "elapsed = " .. timer:get_elapsed() .. "\n" + desc = desc .. indent(1, "timeout = " .. timer:get_timeout()) .. "\n" + desc = desc .. indent(1, "elapsed = " .. timer:get_elapsed()) .. "\n" end local nodedef = minetest.registered_items[node.name] local meta = minetest.get_meta(pos) - local table = meta:to_table() - if table.fields.offsets then - local offsets = minetest.deserialize(table.fields.offsets) - table.fields.offsets = nil + local metatable = meta:to_table() + + if metatable.fields.offsets then + local offsets = minetest.deserialize(metatable.fields.offsets) + metatable.fields.offsets = nil desc = desc .. "==== triggers ====\n" for so, _ in pairs(offsets) do local off = dehash_vector(so) @@ -52,9 +73,9 @@ local function inspect_pos(pos) end desc = desc .. "\n" end - if table.fields.roffsets then - local roffsets = minetest.deserialize(table.fields.roffsets) - table.fields.roffsets = nil + if metatable.fields.roffsets then + local roffsets = minetest.deserialize(metatable.fields.roffsets) + metatable.fields.roffsets = nil desc = desc .. "==== triggered by ====\n" for so, _ in pairs(roffsets) do local off = dehash_vector(so) @@ -66,26 +87,42 @@ local function inspect_pos(pos) desc = desc .. "\n" end - local fields = minetest.serialize(table.fields) + desc = desc .. "==== meta ====\n" - desc = desc .. "meta.fields = " .. fields .. "\n" - desc = desc .. "\n" + desc = desc .. indent(1, "meta.fields = " .. adjusted_dump(metatable.fields)) .. "\n" local inventory = meta:get_inventory() - desc = desc .. "meta.inventory = \n" + desc = desc .. indent(1, "meta.inventory = ") .. "\n" for key, list in pairs(inventory:get_lists()) do - desc = desc .. key .. " : \n" + desc = desc .. indent(2, key .. " : ") .. "\n" local size = #list for i = 1, size do local stack = list[i] if not stack:is_empty() then - desc = desc .. "\"" .. stack:get_name() .. "\" - " .. stack:get_count() .. "\n" + desc = desc .. indent(3, "\"" .. stack:get_name() .. "\" - " .. stack:get_count()) .. "\n" end end end if nodedef then -- Some built in nodes have no nodedef + + -- combine nodedef table with its "superclass" table + local combined_fields = {} + local nodedef_fields = {} + for key, value in pairs(getmetatable(nodedef).__index) do combined_fields[key] = value end + for key, value in pairs(nodedef) do + nodedef_fields[key] = true + if combined_fields[key] == nil then combined_fields[key] = value end + end + + -- sort + local key_list = {} + for key, _ in pairs(combined_fields) do table.insert(key_list, key) end + table.sort(key_list) + desc = desc .. "==== nodedef ====\n" - desc = desc .. dump(nodedef) .. "\n" + for _, key in ipairs(key_list) do + desc = desc .. indent(1, key .. " = " .. adjusted_dump(nodedef[key]), nodedef_fields[key]) .. "\n" + end end return desc diff --git a/mods/inspector/mod.conf b/mods/inspector/mod.conf index 26227c6..a9e9f41 100644 --- a/mods/inspector/mod.conf +++ b/mods/inspector/mod.conf @@ -1 +1,3 @@ name = inspector +description = An in-game tool to inspect node parameters and metadata. +depends = fsc,boxes