BlockColor-Engine/builtin/game/mod_debugging.lua
Maksim Gamarnik 6d3dc6ce06 New MainMenu, update WversionManager, Makefile change
New MainMenu by 4aiman
WVersionManager - 1.3
Makefile - rename output apk
2015-05-12 10:59:17 +03:00

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