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 return results
end end
function crafting.craft(wanted, output, items) function crafting.craft(wanted, wanted_count, output, items)
-- `output` can be any ItemStack value -- `output` can be any ItemStack value
-- Duplicate items in `items` should work correctly -- 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 if craftdef == nil then
minetest.log("warning", minetest.log("warning",
"Tried to craft an unregistered item " .. wanted:get_name()) "Tried to craft an unregistered item " .. wanted:to_string())
return nil return nil
end end
-- Check for validity -- Check for validity
local craft_count = wanted:get_count() local craft_count = wanted_count
for i = 1, crafting.max_inputs do for i = 1, crafting.max_inputs do
local required_itemstack = ItemStack(craftdef.items[i]) local required_itemstack = ItemStack(craftdef.items[i])
@ -250,7 +250,7 @@ function crafting.get_formspec(name)
end end
if itemstack:get_count() ~= 1 then 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 end
craft_list = craft_list .. "," .. minetest.formspec_escape(itemdef.description) 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") 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 .. "]" .. ";" .. row .. "]"
if selected_craftdef ~= nil then if selected_craftdef ~= nil then
if selected_craftdef.items[1] ~= nil then if selected_craftdef.items[1] ~= nil then
form = form .. default.ui.fake_itemstack_any( 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 end
if selected_craftdef.items[2] ~= nil then if selected_craftdef.items[2] ~= nil then
form = form .. default.ui.fake_itemstack_any( 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 end
if selected_craftdef.items[3] ~= nil then if selected_craftdef.items[3] ~= nil then
form = form .. default.ui.fake_itemstack_any( 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 end
if selected_craftdef.items[4] ~= nil then if selected_craftdef.items[4] ~= nil then
form = form .. default.ui.fake_itemstack_any( 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 end
if selected_craftdef.items[4] ~= nil then if selected_craftdef.items[4] ~= nil then
form = form .. default.ui.fake_itemstack_any( 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
end end
return form return form
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
local function on_player_receive_fields(player, form_name, fields) local function on_player_receive_fields(player, form_name, fields)
if fields.crafting_tracker == nil then if fields.crafting_tracker == nil then
return return
@ -326,15 +308,18 @@ local function on_player_receive_fields(player, form_name, fields)
return -- Different item type in output already return -- Different item type in output already
end end
local count = 1
if fields.do_craft_1 then if fields.do_craft_1 then
wanted_itemstack:set_count(1) count = 1
elseif fields.do_craft_10 then elseif fields.do_craft_10 then
wanted_itemstack:set_count(10) count = 10
else else
return return
end end
local crafted = crafting.craft(wanted_itemstack, local crafted = crafting.craft(wanted_itemstack,
count,
output_itemstack, output_itemstack,
inv:get_list("craft_in")) inv:get_list("craft_in"))
@ -359,6 +344,24 @@ local function on_player_receive_fields(player, form_name, fields)
end end
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_joinplayer(on_joinplayer)
minetest.register_on_player_receive_fields(on_player_receive_fields) minetest.register_on_player_receive_fields(on_player_receive_fields)

View File

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

View File

@ -1,6 +1,11 @@
default.ui = {} default.ui = {}
-- Registered UI pages
default.ui.registered_pages = {
}
-- UI defaults -- UI defaults
default.ui.default = {} default.ui.default = {}
@ -14,10 +19,13 @@ default.ui.default.bg = "bgcolor[#00000000;false]"
default.ui.group_defaults = { default.ui.group_defaults = {
planks = "default:planks", planks = "default:planks",
stone = "default:stone",
soil = "default:dirt", soil = "default:dirt",
stone = "default:stone",
tree = "default:tree",
} }
-- Itemslot backgrounds
function default.ui.get_itemslot_bg(x, y, w, h) function default.ui.get_itemslot_bg(x, y, w, h)
local out = "" local out = ""
for i = 0, w - 1, 1 do for i = 0, w - 1, 1 do
@ -32,16 +40,20 @@ function default.ui.get_hotbar_itemslot_bg(x, y, w, h)
local out = "" local out = ""
for i = 0, w - 1, 1 do for i = 0, w - 1, 1 do
for j = 0, h - 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
end end
return out return out
end end
-- Buttons
function default.ui.image_button(x, y, w, h, name, image) function default.ui.image_button(x, y, w, h, name, image)
local image = minetest.formspec_escape(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 end
function default.ui.button(x, y, w, h, name, label, noclip) 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 end
if w == 1 then 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 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 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
end end
@ -68,23 +86,35 @@ function default.ui.button_exit(x, y, w, h, name, label, noclip)
end end
if w == 2 then 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 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
end end
-- Tabs
function default.ui.tab(x, y, name, icon, tooltip) function default.ui.tab(x, y, name, icon, tooltip)
local tooltip = tooltip or "" local tooltip = tooltip or ""
local shifted_icon = "[combine:16x16:0,0=ui_tab_active.png:0,1="..icon local shifted_icon = "[combine:16x16:0,0=ui_tab_active.png:0,1="..icon
local form = "" 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.."]" form = form .. "tooltip["..name..";"..tooltip.."]"
return form return form
end end
-- Itemstacks
local function get_itemdef_field(itemname, fieldname) local function get_itemdef_field(itemname, fieldname)
if not minetest.registered_items[itemname] then if not minetest.registered_items[itemname] then
return nil return nil
@ -99,7 +129,8 @@ function default.ui.fake_itemstack(x, y, itemstack, name)
local itemamt = itemstack:get_count() local itemamt = itemstack:get_count()
local itemdesc = "" 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 itemdesc = minetest.registered_items[itemname].description
end end
@ -107,11 +138,12 @@ function default.ui.fake_itemstack(x, y, itemstack, name)
local result = "" local result = ""
if itemname ~= "" then 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;"
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"..name..";;false;false;ui_null.png]" ..name..";;false;false;ui_null.png]"
result = result .. "item_image["..x..","..y..";1,1;"..minetest.formspec_escape(itemname .. " " .. itemamt).."]" 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 end
return result return result
@ -121,16 +153,19 @@ function default.ui.fake_simple_itemstack(x, y, itemname, name)
local name = name or "fake_simple_itemstack" local name = name or "fake_simple_itemstack"
local itemdesc = "" 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 itemdesc = minetest.registered_items[itemname].description
end end
local result = "" local result = ""
if itemname ~= "" then 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;"
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"..name..";;false;false;ui_null.png]" ..name..";;false;false;ui_null.png]"
result = result .. "item_image["..x..","..y..";1,1;"..minetest.formspec_escape(itemname).."]" result = result .. "item_image["..x..","..y..";1,1;"
result = result .. "tooltip["..name..";"..itemdesc.."]" ..minetest.formspec_escape(itemname).."]"
result = result .. "tooltip["..name..";"
..minetest.formspec_escape(itemdesc).."]"
end end
return result return result
@ -154,17 +189,15 @@ function default.ui.item_group(x, y, group, count, name)
end end
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 = "" local result = ""
if itemname ~= "" then if itemname ~= "" then
result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"..name..";;false;false;ui_null.png]" result = result .. "image_button["..x..","..y..";1,1;ui_null.png;"
result = result .. "item_image["..x..","..y..";1,1;"..minetest.formspec_escape(itemname .. " " .. count).."]" ..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 end
return result return result
@ -180,8 +213,7 @@ function default.ui.fake_itemstack_any(x, y, itemstack, name)
end end
end end
default.ui.registered_pages = { -- Pages
}
function default.ui.get_page(name) function default.ui.get_page(name)
local page= default.ui.registered_pages[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 default.ui.registered_pages[name] = form
end end
-- Default formspec boilerplates
local form_default_default = "" local form_default_default = ""
form_default_default = form_default_default .. "size[8.5,9]" form_default_default = form_default_default .. "size[8.5,9]"
form_default_default = form_default_default .. default.ui.default.colors form_default_default = form_default_default .. default.ui.default.colors