127 lines
2.9 KiB
Lua
127 lines
2.9 KiB
Lua
-- Freeminer: builtin/game/mod_debugging.lua
|
|
-- by rubenwardy
|
|
|
|
local mod = {}
|
|
mod.recipes = {}
|
|
mod.aliases = {}
|
|
|
|
core.log("action", 'Mod debugging enabled')
|
|
-- Sees if there is a node with this group/these groups
|
|
-- Supports AND view group:name, name
|
|
local function group_exists(groupname)
|
|
local flags = groupname:split(",")
|
|
for name, def in pairs(core.registered_items) do
|
|
local flag = true
|
|
for k, v in pairs(flags) do
|
|
local g = def.groups and def.groups[v:gsub('%group:', '')] or 0
|
|
if not g or g <= 0 then
|
|
flag = false
|
|
break
|
|
end
|
|
end
|
|
if flag then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- Check that the item exists
|
|
function mod.assert(recipe, _name, output)
|
|
local name = mod.strip_name(_name)
|
|
if name == nil then
|
|
core.log('error', 'nil in recipe for '..mod.strip_name(output))
|
|
print(recipe.from)
|
|
return
|
|
end
|
|
|
|
if mod.aliases[name] ~= nil then
|
|
name = mod.aliases[name]
|
|
end
|
|
|
|
if core.registered_items[name] == nil and not group_exists(name) then
|
|
core.log( 'error', 'missing item '..name.." in recipe for "..mod.strip_name(output) )
|
|
print(recipe.from)
|
|
end
|
|
end
|
|
|
|
-- Turns a itemstack name into just its item name
|
|
-- For example: "mod:item 99" -> "mod:item"
|
|
function mod.strip_name(name)
|
|
if name == nil then
|
|
return
|
|
end
|
|
|
|
res = name:gsub('%"', '')
|
|
|
|
if res:sub(1, 1) == ":" then
|
|
res = table.concat{res:sub(1, 1-1), "", res:sub(1+1)}
|
|
end
|
|
|
|
for str in string.gmatch(res, "([^ ]+)") do
|
|
if str ~= " " and str ~= nil then
|
|
res=str
|
|
break
|
|
end
|
|
end
|
|
|
|
if res == nil then
|
|
res=""
|
|
end
|
|
|
|
return res
|
|
end
|
|
|
|
-- Cycles through the recipe table, checking the items.
|
|
-- Recursive
|
|
function mod.check_recipe(recipe, table, output)
|
|
if type(table) == "table" then
|
|
for i=1,# table do
|
|
mod.check_recipe(recipe, table[i], output)
|
|
end
|
|
else
|
|
mod.assert(recipe, table,output)
|
|
end
|
|
end
|
|
|
|
-- Check recipes once the game has loaded
|
|
core.after(0, function()
|
|
for i=1, #mod.recipes do
|
|
if mod.recipes[i] and mod.recipes[i].output then
|
|
mod.assert(mod.recipes[i], mod.recipes[i].output, mod.recipes[i].output)
|
|
|
|
if type(mod.recipes[i].recipe) == "table" then
|
|
for a=1,# mod.recipes[i].recipe do
|
|
mod.check_recipe(mod.recipes[i], mod.recipes[i].recipe[a], mod.recipes[i].output)
|
|
end
|
|
else
|
|
mod.assert(mod.recipes[i], mod.recipes[i].recipe, mod.recipes[i].output)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- Override register_craft to catch craft recipes
|
|
local register_craft = core.register_craft
|
|
core.register_craft = function(recipe)
|
|
register_craft(recipe)
|
|
|
|
local name = mod.strip_name(recipe.output)
|
|
recipe.from = debug.traceback()
|
|
if name~=nil then
|
|
table.insert(mod.recipes, recipe)
|
|
end
|
|
end
|
|
|
|
-- Override register_alias to catch aliases
|
|
local register_alias = core.register_alias
|
|
core.register_alias = function(new, old)
|
|
register_alias(new, old)
|
|
|
|
local name = mod.strip_name(new)
|
|
local name2 = mod.strip_name(old)
|
|
if name~=nil and name2~=nil then
|
|
mod.aliases[new] = old
|
|
end
|
|
end
|