Fix a few crafting bugs
This commit is contained in:
parent
d4103c3c15
commit
6961414b08
@ -96,22 +96,22 @@ function crafting.get_crafts(filter)
|
||||
return results
|
||||
end
|
||||
|
||||
function crafting.craft(wanted, output, items)
|
||||
function crafting.craft(wanted, wanted_count, output, items)
|
||||
-- `output` can be any ItemStack value
|
||||
-- Duplicate items in `items` should work correctly
|
||||
|
||||
local craftdef = crafting.registered_crafts[wanted:get_name()]
|
||||
local craftdef = crafting.registered_crafts[wanted:to_string()]
|
||||
|
||||
if craftdef == nil then
|
||||
minetest.log("warning",
|
||||
"Tried to craft an unregistered item " .. wanted:get_name())
|
||||
"Tried to craft an unregistered item " .. wanted:to_string())
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Check for validity
|
||||
|
||||
local craft_count = wanted:get_count()
|
||||
local craft_count = wanted_count
|
||||
|
||||
for i = 1, crafting.max_inputs do
|
||||
local required_itemstack = ItemStack(craftdef.items[i])
|
||||
@ -250,7 +250,7 @@ function crafting.get_formspec(name)
|
||||
end
|
||||
|
||||
if itemstack:get_count() ~= 1 then
|
||||
craft_list = craft_list .. minetest.formspec_escape( itemstack:get_count())
|
||||
craft_list = craft_list .. minetest.formspec_escape(itemstack:get_count())
|
||||
end
|
||||
|
||||
craft_list = craft_list .. "," .. minetest.formspec_escape(itemdef.description)
|
||||
@ -259,53 +259,35 @@ function crafting.get_formspec(name)
|
||||
|
||||
local form = default.ui.get_page("crafting:crafting")
|
||||
|
||||
form = form .. "table[1.25,0.25;5.75,2.75;craft_list;" .. craft_list
|
||||
form = form .. "table[2.25,0.25;4.75,2.75;craft_list;" .. craft_list
|
||||
.. ";" .. row .. "]"
|
||||
|
||||
if selected_craftdef ~= nil then
|
||||
if selected_craftdef.items[1] ~= nil then
|
||||
form = form .. default.ui.fake_itemstack_any(
|
||||
4.25, 3.25, selected_craftdef.items[1])
|
||||
1.25, 0.25, selected_craftdef.items[1], "craftex_in_1")
|
||||
end
|
||||
if selected_craftdef.items[2] ~= nil then
|
||||
form = form .. default.ui.fake_itemstack_any(
|
||||
3.25, 3.25, selected_craftdef.items[2])
|
||||
1.25, 1.25, selected_craftdef.items[2], "craftex_in_2")
|
||||
end
|
||||
if selected_craftdef.items[3] ~= nil then
|
||||
form = form .. default.ui.fake_itemstack_any(
|
||||
2.25, 3.25, selected_craftdef.items[3])
|
||||
1.25, 2.25, selected_craftdef.items[3], "craftex_in_3")
|
||||
end
|
||||
if selected_craftdef.items[4] ~= nil then
|
||||
form = form .. default.ui.fake_itemstack_any(
|
||||
1.25, 3.25, selected_craftdef.items[4])
|
||||
1.25, 3.25, selected_craftdef.items[4], "craftex_in_4")
|
||||
end
|
||||
if selected_craftdef.items[4] ~= nil then
|
||||
form = form .. default.ui.fake_itemstack_any(
|
||||
6.25, 3.25, selected_craftdef.output)
|
||||
6.25, 3.25, selected_craftdef.output, "craftex_out")
|
||||
end
|
||||
end
|
||||
|
||||
return form
|
||||
end
|
||||
|
||||
local function on_joinplayer(player)
|
||||
local name = player:get_player_name()
|
||||
|
||||
local inv = player:get_inventory()
|
||||
|
||||
if crafting.userdata[name] == nil then
|
||||
crafting.userdata[name] = {row = 1}
|
||||
end
|
||||
|
||||
if inv:get_size("craft_in") ~= 4 then
|
||||
inv:set_size("craft_in", 4)
|
||||
end
|
||||
|
||||
if inv:get_size("craft_out") ~= 1 then
|
||||
inv:set_size("craft_out", 1)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_player_receive_fields(player, form_name, fields)
|
||||
if fields.crafting_tracker == nil then
|
||||
return
|
||||
@ -326,15 +308,18 @@ local function on_player_receive_fields(player, form_name, fields)
|
||||
return -- Different item type in output already
|
||||
end
|
||||
|
||||
local count = 1
|
||||
|
||||
if fields.do_craft_1 then
|
||||
wanted_itemstack:set_count(1)
|
||||
count = 1
|
||||
elseif fields.do_craft_10 then
|
||||
wanted_itemstack:set_count(10)
|
||||
count = 10
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
local crafted = crafting.craft(wanted_itemstack,
|
||||
count,
|
||||
output_itemstack,
|
||||
inv:get_list("craft_in"))
|
||||
|
||||
@ -359,6 +344,24 @@ local function on_player_receive_fields(player, form_name, fields)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_joinplayer(player)
|
||||
local name = player:get_player_name()
|
||||
|
||||
local inv = player:get_inventory()
|
||||
|
||||
if crafting.userdata[name] == nil then
|
||||
crafting.userdata[name] = {row = 1}
|
||||
end
|
||||
|
||||
if inv:get_size("craft_in") ~= 4 then
|
||||
inv:set_size("craft_in", 4)
|
||||
end
|
||||
|
||||
if inv:get_size("craft_out") ~= 1 then
|
||||
inv:set_size("craft_out", 1)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_on_joinplayer(on_joinplayer)
|
||||
minetest.register_on_player_receive_fields(on_player_receive_fields)
|
||||
|
||||
|
@ -324,7 +324,7 @@ crafting.register_craft(
|
||||
{
|
||||
output = "default:path_slab",
|
||||
items = {
|
||||
"group:soil_path",
|
||||
"default:dirt_path",
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -1,6 +1,11 @@
|
||||
|
||||
default.ui = {}
|
||||
|
||||
-- Registered UI pages
|
||||
|
||||
default.ui.registered_pages = {
|
||||
}
|
||||
|
||||
-- UI defaults
|
||||
|
||||
default.ui.default = {}
|
||||
@ -14,10 +19,13 @@ default.ui.default.bg = "bgcolor[#00000000;false]"
|
||||
|
||||
default.ui.group_defaults = {
|
||||
planks = "default:planks",
|
||||
stone = "default:stone",
|
||||
soil = "default:dirt",
|
||||
stone = "default:stone",
|
||||
tree = "default:tree",
|
||||
}
|
||||
|
||||
-- Itemslot backgrounds
|
||||
|
||||
function default.ui.get_itemslot_bg(x, y, w, h)
|
||||
local out = ""
|
||||
for i = 0, w - 1, 1 do
|
||||
@ -32,16 +40,20 @@ function default.ui.get_hotbar_itemslot_bg(x, y, w, h)
|
||||
local out = ""
|
||||
for i = 0, w - 1, 1 do
|
||||
for j = 0, h - 1, 1 do
|
||||
out = out .."image["..x+i..","..y+j..";1,1;ui_itemslot.png^ui_itemslot_dark.png]"
|
||||
out = out .."image["..x+i..","..y+j
|
||||
..";1,1;ui_itemslot.png^ui_itemslot_dark.png]"
|
||||
end
|
||||
end
|
||||
return out
|
||||
end
|
||||
|
||||
-- Buttons
|
||||
|
||||
function default.ui.image_button(x, y, w, h, name, image)
|
||||
local image = minetest.formspec_escape(image)
|
||||
|
||||
return "image_button["..x..","..y..";"..w..","..h..";"..image..";"..name..";;;false;"..image.."]"
|
||||
return "image_button["..x..","..y..";"..w..","..h..";"
|
||||
..image..";"..name..";;;false;"..image.."]"
|
||||
end
|
||||
|
||||
function default.ui.button(x, y, w, h, name, label, noclip)
|
||||
@ -52,11 +64,17 @@ function default.ui.button(x, y, w, h, name, label, noclip)
|
||||
end
|
||||
|
||||
if w == 1 then
|
||||
return "image_button["..x..","..y..";"..w..","..h..";ui_button_1w_inactive.png;"..name..";"..label..";"..nc..";false;ui_button_1w_active.png]"
|
||||
return "image_button["..x..","..y..";"..w..","..h
|
||||
..";ui_button_1w_inactive.png;"..name..";"..label..";"
|
||||
..nc..";false;ui_button_1w_active.png]"
|
||||
elseif w == 2 then
|
||||
return "image_button["..x..","..y..";"..w..","..h..";ui_button_2w_inactive.png;"..name..";"..label..";"..nc..";false;ui_button_2w_active.png]"
|
||||
return "image_button["..x..","..y..";"..w..","..h
|
||||
..";ui_button_2w_inactive.png;"..name..";"..label..";"
|
||||
..nc..";false;ui_button_2w_active.png]"
|
||||
else
|
||||
return "image_button["..x..","..y..";"..w..","..h..";ui_button_3w_inactive.png;"..name..";"..label..";"..nc..";false;ui_button_3w_active.png]"
|
||||
return "image_button["..x..","..y..";"..w..","..h
|
||||
..";ui_button_3w_inactive.png;"..name..";"..label..";"
|
||||
..nc..";false;ui_button_3w_active.png]"
|
||||
end
|
||||
end
|
||||
|
||||
@ -68,23 +86,35 @@ function default.ui.button_exit(x, y, w, h, name, label, noclip)
|
||||
end
|
||||
|
||||
if w == 2 then
|
||||
return "image_button_exit["..x..","..y..";"..w..","..h..";ui_button_2w_inactive.png;"..name..";"..label..";"..nc..";false;ui_button_2w_active.png]"
|
||||
return "image_button_exit["..x..","..y..";"..w..","..h
|
||||
..";ui_button_2w_inactive.png;"..name..";"..label..";"
|
||||
..nc..";false;ui_button_2w_active.png]"
|
||||
else
|
||||
return "image_button_exit["..x..","..y..";"..w..","..h..";ui_button_3w_inactive.png;"..name..";"..label..";"..nc..";false;ui_button_3w_active.png]"
|
||||
return "image_button_exit["..x..","..y..";"..w..","..h
|
||||
..";ui_button_3w_inactive.png;"..name..";"..label..";"
|
||||
..nc..";false;ui_button_3w_active.png]"
|
||||
end
|
||||
end
|
||||
|
||||
-- Tabs
|
||||
|
||||
function default.ui.tab(x, y, name, icon, tooltip)
|
||||
local tooltip = tooltip or ""
|
||||
local shifted_icon = "[combine:16x16:0,0=ui_tab_active.png:0,1="..icon
|
||||
|
||||
local form = ""
|
||||
form = form .. "image_button["..x..","..y..";1,1;ui_tab_inactive.png^"..icon..";"..name..";;true;false;"..minetest.formspec_escape(shifted_icon).."]"
|
||||
|
||||
form = form .. "image_button["..x..","..y..";1,1;ui_tab_inactive.png^"
|
||||
..icon..";"..name..";;true;false;"
|
||||
..minetest.formspec_escape(shifted_icon).."]"
|
||||
|
||||
form = form .. "tooltip["..name..";"..tooltip.."]"
|
||||
|
||||
return form
|
||||
end
|
||||
|
||||
-- Itemstacks
|
||||
|
||||
local function get_itemdef_field(itemname, fieldname)
|
||||
if not minetest.registered_items[itemname] then
|
||||
return nil
|
||||
@ -99,7 +129,8 @@ function default.ui.fake_itemstack(x, y, itemstack, name)
|
||||
local itemamt = itemstack:get_count()
|
||||
|
||||
local itemdesc = ""
|
||||
if minetest.registered_items[itemname] and minetest.registered_items[itemname].description ~= nil then
|
||||
if minetest.registered_items[itemname]
|
||||
and minetest.registered_items[itemname].description ~= nil then
|
||||
itemdesc = minetest.registered_items[itemname].description
|
||||
end
|
||||
|
||||
@ -107,11 +138,12 @@ function default.ui.fake_itemstack(x, y, itemstack, name)
|
||||
|
||||
local result = ""
|
||||
if itemname ~= "" then
|
||||
-- result = result .. "image_button["..x..","..y..";1,1;"..itemimage..";"..name..";;false;false;"..itemimage.."]"
|
||||
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"..name..";;false;false;ui_null.png]"
|
||||
result = result .. "item_image["..x..","..y..";1,1;"..minetest.formspec_escape(itemname .. " " .. itemamt).."]"
|
||||
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"
|
||||
..name..";;false;false;ui_null.png]"
|
||||
result = result .. "item_image["..x..","..y..";1,1;"
|
||||
..minetest.formspec_escape(itemname .. " " .. itemamt).."]"
|
||||
|
||||
result = result .. "tooltip["..name..";"..itemdesc.."]"
|
||||
result = result .. "tooltip["..name..";"..minetest.formspec_escape(itemdesc).."]"
|
||||
end
|
||||
|
||||
return result
|
||||
@ -121,16 +153,19 @@ function default.ui.fake_simple_itemstack(x, y, itemname, name)
|
||||
local name = name or "fake_simple_itemstack"
|
||||
|
||||
local itemdesc = ""
|
||||
if minetest.registered_items[itemname] and minetest.registered_items[itemname].description ~= nil then
|
||||
if minetest.registered_items[itemname]
|
||||
and minetest.registered_items[itemname].description ~= nil then
|
||||
itemdesc = minetest.registered_items[itemname].description
|
||||
end
|
||||
|
||||
local result = ""
|
||||
if itemname ~= "" then
|
||||
-- result = result .. "image_button["..x..","..y..";1,1;"..itemimage..";"..name..";;false;false;"..itemimage.."]"
|
||||
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"..name..";;false;false;ui_null.png]"
|
||||
result = result .. "item_image["..x..","..y..";1,1;"..minetest.formspec_escape(itemname).."]"
|
||||
result = result .. "tooltip["..name..";"..itemdesc.."]"
|
||||
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"
|
||||
..name..";;false;false;ui_null.png]"
|
||||
result = result .. "item_image["..x..","..y..";1,1;"
|
||||
..minetest.formspec_escape(itemname).."]"
|
||||
result = result .. "tooltip["..name..";"
|
||||
..minetest.formspec_escape(itemdesc).."]"
|
||||
end
|
||||
|
||||
return result
|
||||
@ -154,17 +189,15 @@ function default.ui.item_group(x, y, group, count, name)
|
||||
end
|
||||
end
|
||||
|
||||
local itemdesc = ""
|
||||
if minetest.registered_items[itemname] and minetest.registered_items[itemname].description ~= nil then
|
||||
itemdesc = minetest.registered_items[itemname].description
|
||||
end
|
||||
|
||||
local result = ""
|
||||
if itemname ~= "" then
|
||||
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"..name..";;false;false;ui_null.png]"
|
||||
result = result .. "item_image["..x..","..y..";1,1;"..minetest.formspec_escape(itemname .. " " .. count).."]"
|
||||
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"
|
||||
..name..";;false;false;ui_null.png]"
|
||||
result = result .. "item_image["..x..","..y..";1,1;"
|
||||
..minetest.formspec_escape(itemname .. " " .. count).."]"
|
||||
|
||||
result = result .. "tooltip["..name..";Group: "..group.."]"
|
||||
result = result .. "tooltip["..name..";Group: "
|
||||
..minetest.formspec_escape(group).."]"
|
||||
end
|
||||
|
||||
return result
|
||||
@ -180,8 +213,7 @@ function default.ui.fake_itemstack_any(x, y, itemstack, name)
|
||||
end
|
||||
end
|
||||
|
||||
default.ui.registered_pages = {
|
||||
}
|
||||
-- Pages
|
||||
|
||||
function default.ui.get_page(name)
|
||||
local page= default.ui.registered_pages[name]
|
||||
@ -198,6 +230,8 @@ function default.ui.register_page(name, form)
|
||||
default.ui.registered_pages[name] = form
|
||||
end
|
||||
|
||||
-- Default formspec boilerplates
|
||||
|
||||
local form_default_default = ""
|
||||
form_default_default = form_default_default .. "size[8.5,9]"
|
||||
form_default_default = form_default_default .. default.ui.default.colors
|
||||
|
Loading…
x
Reference in New Issue
Block a user