Compare commits

...

6 Commits
1.1 ... 1.2.1

6 changed files with 255 additions and 153 deletions

View File

@ -4,5 +4,6 @@ allow_defined_top = true
read_globals = {
"minetest",
"default",
"sfinv",
"sfinv_buttons",
}

View File

@ -1,4 +1,4 @@
« Copyright © 2015-2017, Jean-Patrick Guerrero <jeanpatrick.guerrero@gmail.com>
« Copyright © 2015-2018, Jean-Patrick Guerrero <jeanpatrick.guerrero@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View File

@ -1,14 +1,15 @@
## ![Preview1](http://i.imgur.com/fIPNYkb.png) Crafting Guide ##
#### A Crafting Guide for Minetest that doesn't suck. ####
#### `craftguide` is the most comprehensive crafting guide on Minetest. ####
#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details. ####
#### `craftguide` is the most comprehensive mod of its category. ####
#### Consult the [Minetest Wiki](http://wiki.minetest.net/Crafting_guide) for more details and comparisons. ####
#### This crafting guide is usable with a blue book named *"Crafting Guide"*. ####
#### This crafting guide is usable with a blue book named *"Crafting Guide"* ####
#### This crafting guide features two modes : Standard and Progressive. ####
The Progressive mode is a Terraria-like system that only shows recipes you can craft from items in inventory.
The progressive mode can be enabled with `craftguide_progressive_mode = true` in `minetest.conf`.
`craftguide` is also integrated in `sfinv` (Minetest Game inventory) when you enable it with
`craftguide_sfinv_only = true` in `minetest.conf`.
![Preview2](http://i.imgur.com/3q7rVSo.png)

View File

@ -1,2 +1,3 @@
sfinv?
sfinv_buttons?
intllib?

389
init.lua
View File

@ -1,5 +1,8 @@
local craftguide, datas, mt = {}, {searches = {}}, minetest
local progressive_mode = mt.settings:get_bool("craftguide_progressive_mode")
local sfinv_only = mt.settings:get_bool("craftguide_sfinv_only")
local get_recipe, get_recipes = mt.get_craft_recipe, mt.get_all_craft_recipes
local get_result, show_formspec = mt.get_craft_result, mt.show_formspec
local reg_items = mt.registered_items
@ -20,6 +23,7 @@ local MIN_LIMIT, MAX_LIMIT = 9, 12
DEFAULT_SIZE = min(MAX_LIMIT, max(MIN_LIMIT, DEFAULT_SIZE))
local GRID_LIMIT = 5
local BUTTON_SIZE = 1.1
local group_stereotypes = {
wool = "wool:white",
@ -56,8 +60,7 @@ local function extract_groups(str)
end
local function colorize(str)
-- If client <= 0.4.14, don't colorize for compatibility.
return mt.colorize and mt.colorize("#FFFF00", str) or str
return mt.colorize("#FFFF00", str)
end
local function get_fueltime(item)
@ -84,30 +87,35 @@ function craftguide:get_tooltip(item, recipe_type, cooktime, groups)
colorize(groups[i]) .. (groups[i + 1] and ", " or "")
end
tooltip = tooltip .. S("Any item belonging to the group(s)") .. ": " .. groupstr
tooltip = tooltip ..
S("Any item belonging to the group(s)") .. ": " .. groupstr
end
if recipe_type == "cooking" then
tooltip = tooltip .. item_desc .. "\n"
.. S("Cooking time") .. ": " .. colorize(cooktime)
tooltip = tooltip .. item_desc .. "\n" ..
S("Cooking time") .. ": " .. colorize(cooktime)
end
if fueltime > 0 then
tooltip = tooltip .. item_desc .. "\n"
.. S("Burning time") .. ": " .. colorize(fueltime)
tooltip = tooltip .. item_desc .. "\n" ..
S("Burning time") .. ": " .. colorize(fueltime)
end
return has_extras and tooltip .. "]" or ""
end
function craftguide:get_recipe(iY, xoffset, tooltip, item, recipe_num, recipes, show_usage)
function craftguide:get_recipe(iX, iY, xoffset, recipe_num, recipes, show_usage)
local formspec, recipes_total = "", #recipes
if recipes_total > 1 then
formspec = formspec ..
"button[0," .. (iY + 3.3) .. ";2,1;alternate;" .. S("Alternate") .. "]" ..
"label[0," .. (iY + 2.8) .. ";" ..
"button[" .. (iX - (sfinv_only and 2 or 2.4)) .. "," ..
(iY + (sfinv_only and 3.9 or 3.3)) ..
";2,1;alternate;" .. S("Alternate") .. "]" ..
"label[" .. (iX - (sfinv_only and 2 or 2.4)) .. "," ..
(iY + (sfinv_only and 3.5 or 2.9)) .. ";" ..
(show_usage and S("Usage") or S("Recipe")) .. " " ..
S("@1 of @2", recipe_num, recipes_total) .. "]"
S("@1 of @2", recipe_num, recipes_total) .. "]"
end
local recipe_type = recipes[recipe_num].type
@ -117,11 +125,14 @@ function craftguide:get_recipe(iY, xoffset, tooltip, item, recipe_num, recipes,
if recipe_type == "cooking" or (recipe_type == "normal" and width == 0) then
local icon = recipe_type == "cooking" and "furnace" or "shapeless"
formspec = formspec ..
"image[" .. (xoffset - 0.8) .. "," .. (iY + 1.7) ..
";0.5,0.5;craftguide_" .. icon .. ".png]"
"image[" .. (xoffset + 0.2) .. "," .. (iY + (sfinv_only and 2.2 or 1.7)) ..
";0.5,0.5;craftguide_" .. icon .. ".png" ..
(icon == "shapeless" and "^[transformFX" or "") .. "]"
end
if width == 0 then
if recipe_type == "cooking" then
width = 1
elseif width == 0 then
width = min(3, #items)
end
@ -129,18 +140,17 @@ function craftguide:get_recipe(iY, xoffset, tooltip, item, recipe_num, recipes,
if recipe_type == "normal" and (width > GRID_LIMIT or rows > GRID_LIMIT) then
formspec = formspec ..
"label[" .. xoffset .. "," .. (iY + 2) .. ";" ..
"label[" .. xoffset .. "," .. (iY + 2.2) .. ";" ..
S("Recipe is too big to\nbe displayed (@1x@2)", width, rows) .. "]"
else
local btn_size = 1
for i, v in pairs(items) do
local X = (i - 1) % width + xoffset
local X = (i - 1) % width + xoffset - width
local Y = ceil(i / width + (iY + 2) - min(2, rows))
if recipe_type == "normal" and (width > 3 or rows > 3) then
btn_size = width > 3 and 3 / width or 3 / rows
X = btn_size * (i % width) + xoffset
Y = btn_size * floor((i - 1) / width) + (iY + 3) - min(2, rows)
BUTTON_SIZE = width > 3 and 3 / width or 3 / rows
X = BUTTON_SIZE * (i % width) + 0
Y = BUTTON_SIZE * floor((i - 1) / width) + (iY + 3) - min(2, rows)
end
local groups = extract_groups(v)
@ -149,23 +159,40 @@ function craftguide:get_recipe(iY, xoffset, tooltip, item, recipe_num, recipes,
local tltip = self:get_tooltip(item_r, recipe_type, width, groups)
formspec = formspec ..
"item_image_button[" .. X .. "," .. (Y + 0.2) .. ";" ..
btn_size .. "," .. btn_size .. ";" .. item_r ..
"item_image_button[" .. X .. "," ..
(Y + (sfinv_only and 0.7 or 0.2)) .. ";" ..
BUTTON_SIZE .. "," .. BUTTON_SIZE .. ";" .. item_r ..
";" .. item_r .. ";" .. label .. "]" .. tltip
end
BUTTON_SIZE = 1.1
end
local output = recipes[recipe_num].output
return formspec ..
"image[" .. (xoffset - 1) .. "," .. (iY + 2.35) ..
";0.9,0.7;craftguide_arrow.png]" ..
"item_image_button[" .. (xoffset - 2) .. "," .. (iY + 2.2) .. ";1,1;" ..
output .. ";" .. item .. ";]" .. tooltip
local output = recipes[recipe_num].output:match("%S+")
formspec = formspec ..
"image[" .. (xoffset + 0.08) .. "," .. (iY + (sfinv_only and 2.85 or 2.35)) ..
";0.9,0.7;craftguide_arrow.png^[transformFX]" ..
"item_image_button[" .. (xoffset + 1) .. "," ..
(iY + (sfinv_only and 2.7 or 2.2)) .. ";" ..
BUTTON_SIZE .. "," .. BUTTON_SIZE .. ";" ..
output .. ";" .. output .. ";]" .. self:get_tooltip(output)
local output_is_fuel = get_fueltime(output) > 0
if output_is_fuel then
formspec = formspec ..
"image[" .. (xoffset + 2) .. "," ..
(iY + (sfinv_only and 2.85 or 2.35)) ..
";0.6,0.4;craftguide_arrow.png^[transformFX]" ..
"image[" .. (xoffset + 2.6) .. "," .. (iY + (sfinv_only and 2.68 or 2.18)) ..
";0.6,0.6;craftguide_fire.png]"
end
return formspec
end
function craftguide:get_formspec(player_name, is_fuel)
local data = datas[player_name]
local iY = data.iX - 5
local iY = sfinv_only and 4 or data.iX - 5
local ipp = data.iX * iY
if not data.items then
@ -174,35 +201,40 @@ function craftguide:get_formspec(player_name, is_fuel)
data.pagemax = max(1, ceil(#data.items / ipp))
local formspec = "size[" .. (data.iX - 0.35) .. "," .. (iY + 4) .. ";]" .. [[
background[1,1;1,1;craftguide_bg.png;true]
local formspec = ""
if not sfinv_only then
formspec = formspec ..
"size[" .. (data.iX - 0.35) .. "," .. (iY + 4) .. ";]" ..
"background[1,1;1,1;craftguide_bg.png;true]" ..
"tooltip[size_inc;" .. S("Increase window size") .. "]" ..
"tooltip[size_dec;" .. S("Decrease window size") .. "]" ..
"button[" .. (data.iX * 0.48) .. ",-0.02;0.7,1;size_inc;+]" ..
"button[" .. ((data.iX * 0.48) + 0.5) .. ",-0.02;0.7,1;size_dec;-]"
end
formspec = formspec .. [[
button[2.4,0.23;0.8,0.5;search;?]
button[3.05,0.23;0.8,0.5;clear;X]
field_close_on_enter[filter;false]
]] ..
"tooltip[search;" .. S("Search") .. "]" ..
"tooltip[clear;" .. S("Reset") .. "]" ..
"tooltip[size_inc;" .. S("Increase window size") .. "]" ..
"tooltip[size_dec;" .. S("Decrease window size") .. "]" ..
"tooltip[prev;" .. S("Previous page") .. "]" ..
"tooltip[next;" .. S("Next page") .. "]" ..
"button[" .. (data.iX * 0.48) .. ",-0.02;0.7,1;size_inc;+]" ..
"button[" .. ((data.iX * 0.48) + 0.5) ..
",-0.02;0.7,1;size_dec;-]" ..
"button[" .. (data.iX - 3.1) .. ",0;0.8,0.95;prev;<]" ..
"label[" .. (data.iX - 2.2) .. ",0.18;" ..
"button[" .. (data.iX - (sfinv_only and 2.6 or 3.1)) ..
"," .. (sfinv_only and 0.03 or 0) .. ";0.8,0.95;prev;<]" ..
"label[" .. (data.iX - (sfinv_only and 1.7 or 2.2)) .. "," ..
(sfinv_only and 0.21 or 0.18) .. ";" ..
colorize(data.pagenum) .. " / " .. data.pagemax .. "]" ..
"button[" .. (data.iX - 1.2) .. ",0;0.8,0.95;next;>]" ..
"field[0.3,0.32;2.5,1;filter;;" ..
mt.formspec_escape(data.filter) .. "]"
"button[" .. (data.iX - (sfinv_only and 0.7 or 1.2)) ..
"," .. (sfinv_only and 0.03 or 0) .. ";0.8,0.95;next;>]" ..
"field[0.3,0.32;2.5,1;filter;;" .. mt.formspec_escape(data.filter) .. "]"
local even_num = data.iX % 2 == 0
local xoffset = data.iX / 2 + (even_num and 0.5 or 0)
local xoffset = data.iX / 2.15
if not next(data.items) then
formspec = formspec ..
"label[" .. (xoffset - (even_num and 1.5 or 1)) .. ",2;" ..
S("No item to show") .. "]"
"label[" .. ((data.iX / 2) - 1) .. ",2;" .. S("No item to show") .. "]"
end
local first_item = (data.pagenum - 1) * ipp
@ -213,26 +245,31 @@ function craftguide:get_formspec(player_name, is_fuel)
local Y = (i % ipp - X) / data.iX + 1
formspec = formspec ..
"item_image_button[" .. (X - (X * 0.05)) .. "," .. Y .. ";1.1,1.1;" ..
"item_image_button[" .. (X - (sfinv_only and 0 or (X * 0.05))) .. "," ..
Y .. ";" .. BUTTON_SIZE .. "," .. BUTTON_SIZE .. ";" ..
name .. ";" .. name .. "_inv;]"
end
if data.item and reg_items[data.item] then
local tooltip = self:get_tooltip(data.item)
if not data.recipes_item or (is_fuel and not get_recipe(data.item).items) then
formspec = formspec ..
"image[" .. (xoffset - 1) .. "," .. (iY + 2.35) ..
";0.9,0.7;craftguide_arrow.png]" ..
"item_image_button[" .. xoffset .. "," .. (iY + 2.2) ..
";1,1;" .. data.item .. ";" .. data.item .. ";]" ..
tooltip ..
"image[" .. (xoffset - 2) .. "," ..
(iY + 2.18) .. ";1,1;craftguide_fire.png]"
"image[" .. (xoffset + 0.08) .. "," ..
(iY + (sfinv_only and 2.85 or 2.35)) ..
";0.9,0.7;craftguide_arrow.png^[transformFX]" ..
"item_image_button[" .. (xoffset - 1) .. "," ..
(iY + (sfinv_only and 2.7 or 2.2)) ..
";" .. BUTTON_SIZE .. "," .. BUTTON_SIZE ..
";" .. data.item .. ";" .. data.item .. ";]" ..
self:get_tooltip(data.item) ..
"image[" .. (xoffset + 1) .. "," ..
(iY + (sfinv_only and 2.68 or 2.18)) ..
";1.1,1.1;craftguide_fire.png]"
else
local show_usage = data.show_usage
formspec = formspec ..
self:get_recipe(iY, xoffset, tooltip,
data.item,
self:get_recipe(data.iX,
iY,
xoffset,
data.rnum,
(show_usage and data.usages or data.recipes_item),
show_usage)
@ -240,7 +277,12 @@ function craftguide:get_formspec(player_name, is_fuel)
end
data.formspec = formspec
show_formspec(player_name, "craftguide", formspec)
if sfinv_only then
return formspec
else
show_formspec(player_name, "craftguide", formspec)
end
end
local function player_has_item(T)
@ -302,9 +344,10 @@ function craftguide:get_init_items()
local items_list, counter = {}, 0
for name, def in pairs(reg_items) do
local is_fuel = get_fueltime(name) > 0
if (not (def.groups.not_in_craft_guide == 1 or def.groups.not_in_creative_inventory == 1)) and
(get_recipe(name).items or is_fuel) and
def.description and def.description ~= "" then
if (not (def.groups.not_in_craft_guide == 1 or
def.groups.not_in_creative_inventory == 1)) and
(get_recipe(name).items or is_fuel) and
def.description and def.description ~= "" then
counter = counter + 1
items_list[counter] = name
@ -363,8 +406,9 @@ end
function craftguide:get_item_usages(item)
local usages = {}
for name, def in pairs(reg_items) do
if not (def.groups.not_in_creative_inventory == 1) and
(get_recipe(name).items) and def.description and def.description ~= "" then
if not (def.groups.not_in_craft_guide == 1 or
def.groups.not_in_creative_inventory == 1) and
get_recipe(name).items and def.description and def.description ~= "" then
local recipes = get_recipes(name)
for i = 1, #recipes do
local recipe = recipes[i]
@ -388,11 +432,28 @@ function craftguide:get_item_usages(item)
return usages
end
mt.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "craftguide" then return end
local function get_fields(player, ...)
local args, formname, fields = {...}
if sfinv_only then
fields = args[1]
else
formname, fields = args[1], args[2]
end
if not sfinv_only and formname ~= "craftguide" then return end
local player_name = player:get_player_name()
local data = datas[player_name]
local show_fs = function(is_fuel)
if sfinv_only then
local context = sfinv.get_or_create_context(player)
context.fuel = is_fuel
sfinv.set_player_inventory_formspec(player, context)
else
craftguide:get_formspec(player_name, is_fuel)
end
end
if fields.clear then
data.show_usage = nil
data.filter = ""
@ -401,7 +462,7 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
data.rnum = 1
data.items = progressive_mode and data.init_filter_items or datas.init_items
craftguide:get_formspec(player_name)
show_fs()
elseif fields.alternate then
local num
@ -412,14 +473,14 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
end
data.rnum = num and data.rnum + 1 or 1
craftguide:get_formspec(player_name)
show_fs()
elseif (fields.key_enter_field == "filter" or fields.search) and
fields.filter ~= "" then
data.filter = fields.filter:lower()
data.pagenum = 1
craftguide:get_filter_items(data, player)
craftguide:get_formspec(player_name)
show_fs()
elseif fields.prev or fields.next then
data.pagenum = data.pagenum - (fields.prev and 1 or -1)
@ -430,18 +491,20 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
data.pagenum = data.pagemax
end
craftguide:get_formspec(player_name)
show_fs()
elseif (fields.size_inc and data.iX < MAX_LIMIT) or
(fields.size_dec and data.iX > MIN_LIMIT) then
data.pagenum = 1
data.iX = data.iX - (fields.size_dec and 1 or -1)
craftguide:get_formspec(player_name)
show_fs()
else for item in pairs(fields) do
if item:find(":") then
if item:sub(-4) == "_inv" then
item = item:sub(1,-5)
elseif item:find("%s") then
item = item:match("%S*")
end
local is_fuel = get_fueltime(item) > 0
@ -455,7 +518,7 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
data.rnum = 1
end
craftguide:get_formspec(player_name)
show_fs()
else
if progressive_mode then
local inv = player:get_inventory()
@ -470,92 +533,126 @@ mt.register_on_player_receive_fields(function(player, formname, fields)
data.rnum = 1
data.show_usage = nil
craftguide:get_formspec(player_name, is_fuel)
show_fs(is_fuel)
end
end
end
end
end)
function craftguide:on_use(itemstack, user)
if not datas.init_items then
self:get_init_items()
end
local player_name = user:get_player_name()
local data = datas[player_name]
if progressive_mode or not data then
datas[player_name] = {filter = "", pagenum = 1, iX = DEFAULT_SIZE}
if progressive_mode then
self:get_filter_items(datas[player_name], user)
end
self:get_formspec(player_name)
else
show_formspec(player_name, "craftguide", data.formspec)
end
end
mt.register_craftitem("craftguide:book", {
description = S("Crafting Guide"),
inventory_image = "craftguide_book.png",
wield_image = "craftguide_book.png",
stack_max = 1,
groups = {book = 1},
on_use = function(itemstack, user)
craftguide:on_use(itemstack, user)
if sfinv_only then
sfinv.register_page("craftguide:craftguide", {
title = "Craft Guide",
get = function(self, player, context)
local player_name = player:get_player_name()
return sfinv.make_formspec(
player,
context,
craftguide:get_formspec(player_name, context.fuel)
)
end,
on_enter = function(self, player, context)
if not datas.init_items then
craftguide:get_init_items()
end
local player_name = player:get_player_name()
local data = datas[player_name]
if progressive_mode or not data then
datas[player_name] = {filter = "", pagenum = 1, iX = 8}
if progressive_mode then
craftguide:get_filter_items(datas[player_name], player)
end
end
end,
on_player_receive_fields = function(self, player, context, fields)
get_fields(player, fields)
end,
})
else
mt.register_on_player_receive_fields(get_fields)
function craftguide:on_use(itemstack, user)
if not datas.init_items then
self:get_init_items()
end
local player_name = user:get_player_name()
local data = datas[player_name]
if progressive_mode or not data then
datas[player_name] = {filter = "", pagenum = 1, iX = DEFAULT_SIZE}
if progressive_mode then
self:get_filter_items(datas[player_name], user)
end
self:get_formspec(player_name)
else
show_formspec(player_name, "craftguide", data.formspec)
end
end
})
mt.register_node("craftguide:sign", {
description = S("Crafting Guide Sign"),
drawtype = "nodebox",
tiles = {"craftguide_sign.png"},
inventory_image = "craftguide_sign_inv.png",
wield_image = "craftguide_sign_inv.png",
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
groups = {wood = 1, oddly_breakable_by_hand = 1, flammable = 3},
node_box = {
type = "wallmounted",
wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}
},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Crafting Guide Sign"))
end,
on_rightclick = function(pos, node, user, itemstack)
craftguide:on_use(itemstack, user)
end
})
mt.register_craftitem("craftguide:book", {
description = S("Crafting Guide"),
inventory_image = "craftguide_book.png",
wield_image = "craftguide_book.png",
stack_max = 1,
groups = {book = 1},
on_use = function(itemstack, user)
craftguide:on_use(itemstack, user)
end
})
mt.register_craft({
output = "craftguide:book",
type = "shapeless",
recipe = {"default:book"}
})
mt.register_node("craftguide:sign", {
description = S("Crafting Guide Sign"),
drawtype = "nodebox",
tiles = {"craftguide_sign.png"},
inventory_image = "craftguide_sign_inv.png",
wield_image = "craftguide_sign_inv.png",
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
groups = {wood = 1, oddly_breakable_by_hand = 1, flammable = 3},
node_box = {
type = "wallmounted",
wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}
},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Crafting Guide Sign"))
end,
on_rightclick = function(pos, node, user, itemstack)
craftguide:on_use(itemstack, user)
end
})
mt.register_craft({
type = "fuel",
recipe = "craftguide:book",
burntime = 3
})
mt.register_craft({
output = "craftguide:book",
type = "shapeless",
recipe = {"default:book"}
})
mt.register_craft({
output = "craftguide:sign",
type = "shapeless",
recipe = {"default:sign_wall_wood"}
})
mt.register_craft({
type = "fuel",
recipe = "craftguide:book",
burntime = 3
})
mt.register_craft({
type = "fuel",
recipe = "craftguide:sign",
burntime = 10
})
mt.register_craft({
output = "craftguide:sign",
type = "shapeless",
recipe = {"default:sign_wall_wood"}
})
mt.register_craft({
type = "fuel",
recipe = "craftguide:sign",
burntime = 10
})
end
if rawget(_G, "sfinv_buttons") then
sfinv_buttons.register_button("craftguide", {
@ -568,8 +665,6 @@ if rawget(_G, "sfinv_buttons") then
})
end
mt.register_alias("xdecor:crafting_guide", "craftguide:book")
--[[ Custom recipes (>3x3) test code
mt.register_craftitem("craftguide:custom_recipe_test", {
@ -591,4 +686,4 @@ for x = 1, 6 do
recipe = cr[x]
})
end
]]
]]

4
settingtypes.txt Normal file
View File

@ -0,0 +1,4 @@
#For enabling some options of craftguide.
craftguide_progressive_mode (Progressive Mode) bool false
craftguide_sfinv_only (Sfinv only) bool false