many worldgen mods and gonna try technic now
This commit is contained in:
1 parent
bac6ac94a3
commit
548749cb1a
4811 files changed
+163271
-1
No files matched your search
@@ -0,0 +1,113 @@
|
||||
local have_ui = minetest.get_modpath("unified_inventory")
|
||||
|
||||
technic.recipes = { cooking = { input_size = 1, output_size = 1 } }
|
||||
function technic.register_recipe_type(typename, origdata)
|
||||
local data = {}
|
||||
for k, v in pairs(origdata) do data[k] = v end
|
||||
data.input_size = data.input_size or 1
|
||||
data.output_size = data.output_size or 1
|
||||
if have_ui and unified_inventory.register_craft_type and data.output_size == 1 then
|
||||
unified_inventory.register_craft_type(typename, {
|
||||
description = data.description,
|
||||
width = data.input_size,
|
||||
height = 1,
|
||||
})
|
||||
end
|
||||
data.recipes = {}
|
||||
technic.recipes[typename] = data
|
||||
end
|
||||
|
||||
local function get_recipe_index(items)
|
||||
if not items or type(items) ~= "table" then return false end
|
||||
local l = {}
|
||||
for i, stack in ipairs(items) do
|
||||
l[i] = ItemStack(stack):get_name()
|
||||
end
|
||||
table.sort(l)
|
||||
return table.concat(l, "/")
|
||||
end
|
||||
|
||||
local function register_recipe(typename, data)
|
||||
-- Handle aliases
|
||||
for i, stack in ipairs(data.input) do
|
||||
data.input[i] = ItemStack(stack):to_string()
|
||||
end
|
||||
if type(data.output) == "table" then
|
||||
for i, v in ipairs(data.output) do
|
||||
data.output[i] = ItemStack(data.output[i]):to_string()
|
||||
end
|
||||
else
|
||||
data.output = ItemStack(data.output):to_string()
|
||||
end
|
||||
|
||||
local recipe = {time = data.time, input = {}, output = data.output}
|
||||
local index = get_recipe_index(data.input)
|
||||
if not index then
|
||||
print("[Technic] ignored registration of garbage recipe!")
|
||||
return
|
||||
end
|
||||
for _, stack in ipairs(data.input) do
|
||||
recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count()
|
||||
end
|
||||
|
||||
technic.recipes[typename].recipes[index] = recipe
|
||||
if have_ui and technic.recipes[typename].output_size == 1 then
|
||||
unified_inventory.register_craft({
|
||||
type = typename,
|
||||
output = data.output,
|
||||
items = data.input,
|
||||
width = 0,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
function technic.register_recipe(typename, data)
|
||||
minetest.after(0.01, register_recipe, typename, data) -- Handle aliases
|
||||
end
|
||||
|
||||
function technic.get_recipe(typename, items)
|
||||
if typename == "cooking" then -- Already builtin in Minetest, so use that
|
||||
local result, new_input = minetest.get_craft_result({
|
||||
method = "cooking",
|
||||
width = 1,
|
||||
items = items})
|
||||
-- Compatibility layer
|
||||
if not result or result.time == 0 then
|
||||
return nil
|
||||
-- Workaround for recipes with replacements
|
||||
elseif not new_input.items[1]:is_empty() and new_input.items[1]:get_name() ~= items[1]:get_name() then
|
||||
items[1]:take_item(1)
|
||||
return {time = result.time,
|
||||
new_input = {items[1]},
|
||||
output = {new_input.items[1], result.item}}
|
||||
else
|
||||
return {time = result.time,
|
||||
new_input = new_input.items,
|
||||
output = result.item}
|
||||
end
|
||||
end
|
||||
local index = get_recipe_index(items)
|
||||
if not index then
|
||||
print("[Technic] ignored registration of garbage recipe!")
|
||||
return
|
||||
end
|
||||
local recipe = technic.recipes[typename].recipes[index]
|
||||
if recipe then
|
||||
local new_input = {}
|
||||
for i, stack in ipairs(items) do
|
||||
if stack:get_count() < recipe.input[stack:get_name()] then
|
||||
return nil
|
||||
else
|
||||
new_input[i] = ItemStack(stack)
|
||||
new_input[i]:take_item(recipe.input[stack:get_name()])
|
||||
end
|
||||
end
|
||||
return {time = recipe.time,
|
||||
new_input = new_input,
|
||||
output = recipe.output}
|
||||
else
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in new issue
Block a user