Fix a few crafting bugs

This commit is contained in:
KaadmY 2017-05-15 11:19:26 -07:00
parent d4103c3c15
commit 6961414b08
3 changed files with 98 additions and 61 deletions

View File

@ -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)

View File

@ -324,7 +324,7 @@ crafting.register_craft(
{
output = "default:path_slab",
items = {
"group:soil_path",
"default:dirt_path",
}
})

View File

@ -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