From 6961414b08ad65475540c331440e0ba1aafcbf79 Mon Sep 17 00:00:00 2001 From: KaadmY Date: Mon, 15 May 2017 11:19:26 -0700 Subject: [PATCH] Fix a few crafting bugs --- mods/crafting/api.lua | 65 ++++++++++++++------------- mods/crafting/recipes.lua | 2 +- mods/default/formspec.lua | 92 +++++++++++++++++++++++++++------------ 3 files changed, 98 insertions(+), 61 deletions(-) diff --git a/mods/crafting/api.lua b/mods/crafting/api.lua index 63f46de..699d760 100644 --- a/mods/crafting/api.lua +++ b/mods/crafting/api.lua @@ -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) diff --git a/mods/crafting/recipes.lua b/mods/crafting/recipes.lua index 50a039e..6d63fc6 100644 --- a/mods/crafting/recipes.lua +++ b/mods/crafting/recipes.lua @@ -324,7 +324,7 @@ crafting.register_craft( { output = "default:path_slab", items = { - "group:soil_path", + "default:dirt_path", } }) diff --git a/mods/default/formspec.lua b/mods/default/formspec.lua index bd4026b..665e963 100644 --- a/mods/default/formspec.lua +++ b/mods/default/formspec.lua @@ -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