disallow repairing tools using the 'to craft grid', allow it to put items of specific groups and (maybe) make it keep the meta of items, remove unused elseif, change a bit translation and use table.concat at one place because I read somewhere that it's faster than ..

This commit is contained in:
HybridDog 2015-08-16 16:40:49 +02:00
parent 570d2cb162
commit babe4380ac
5 changed files with 226 additions and 143 deletions

10
api.lua
View File

@ -117,7 +117,7 @@ end
-- register_craft -- register_craft
function unified_inventory.register_craft(options) function unified_inventory.register_craft(options)
if options.output == nil then if not options.output then
return return
end end
local itemstack = ItemStack(options.output) local itemstack = ItemStack(options.output)
@ -127,7 +127,7 @@ function unified_inventory.register_craft(options)
if options.type == "normal" and options.width == 0 then if options.type == "normal" and options.width == 0 then
options = { type = "shapeless", items = options.items, output = options.output, width = 0 } options = { type = "shapeless", items = options.items, output = options.output, width = 0 }
end end
if unified_inventory.crafts_for.recipe[itemstack:get_name()] == nil then if not unified_inventory.crafts_for.recipe[itemstack:get_name()] then
unified_inventory.crafts_for.recipe[itemstack:get_name()] = {} unified_inventory.crafts_for.recipe[itemstack:get_name()] = {}
end end
table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options) table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options)
@ -220,9 +220,7 @@ end
function unified_inventory.is_creative(playername) function unified_inventory.is_creative(playername)
if minetest.check_player_privs(playername, {creative=true}) or return minetest.check_player_privs(playername, {creative=true})
minetest.setting_getbool("creative_mode") then or minetest.setting_getbool("creative_mode")
return true
end
end end

View File

@ -1,7 +1,9 @@
local function default_refill(stack) local function default_refill(stack)
stack:set_count(stack:get_stack_max()) stack:set_count(stack:get_stack_max())
local itemdef = minetest.registered_items[stack:get_name()] local itemdef = minetest.registered_items[stack:get_name()]
if itemdef and (itemdef.wear_represents or "mechanical_wear") == "mechanical_wear" and stack:get_wear() ~= 0 then if itemdef
and (itemdef.wear_represents or "mechanical_wear") == "mechanical_wear"
and stack:get_wear() ~= 0 then
stack:set_wear(0) stack:set_wear(0)
end end
return stack return stack
@ -52,7 +54,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local player_name = player:get_player_name() local player_name = player:get_player_name()
-- always take new search text, even if not searching on it yet -- always take new search text, even if not searching on it yet
if fields.searchbox ~= nil and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then if fields.searchbox
and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then
unified_inventory.current_searchbox[player_name] = fields.searchbox unified_inventory.current_searchbox[player_name] = fields.searchbox
unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
end end
@ -98,7 +101,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if start_i > pagemax then if start_i > pagemax then
start_i = pagemax start_i = pagemax
end end
if not (start_i == start) then if start_i ~= start then
minetest.sound_play("paperflip1", minetest.sound_play("paperflip1",
{to_player=player_name, gain = 1.0}) {to_player=player_name, gain = 1.0})
unified_inventory.current_index[player_name] = (start_i - 1) * unified_inventory.items_per_page + 1 unified_inventory.current_index[player_name] = (start_i - 1) * unified_inventory.items_per_page + 1
@ -106,7 +109,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
unified_inventory.current_page[player_name]) unified_inventory.current_page[player_name])
end end
local clicked_item = nil local clicked_item
for name, value in pairs(fields) do for name, value in pairs(fields) do
if string.sub(name, 1, 12) == "item_button_" then if string.sub(name, 1, 12) == "item_button_" then
local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$") local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$")
@ -116,7 +119,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
unified_inventory.apply_filter(player, clicked_item, new_dir) unified_inventory.apply_filter(player, clicked_item, new_dir)
return return
end end
if new_dir == "recipe" or new_dir == "usage" then if new_dir == "recipe"
or new_dir == "usage" then
unified_inventory.current_craft_direction[player_name] = new_dir unified_inventory.current_craft_direction[player_name] = new_dir
end end
break break
@ -126,16 +130,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
minetest.sound_play("click", minetest.sound_play("click",
{to_player=player_name, gain = 0.1}) {to_player=player_name, gain = 0.1})
local page = unified_inventory.current_page[player_name] local page = unified_inventory.current_page[player_name]
if not unified_inventory.is_creative(player_name) then local player_creative = unified_inventory.is_creative(player_name)
if not player_creative then
page = "craftguide" page = "craftguide"
end end
if page == "craftguide" then if page == "craftguide" then
unified_inventory.current_item[player_name] = clicked_item unified_inventory.current_item[player_name] = clicked_item
unified_inventory.alternate[player_name] = 1 unified_inventory.alternate[player_name] = 1
unified_inventory.set_inventory_formspec(player, unified_inventory.set_inventory_formspec(player, "craftguide")
"craftguide") elseif player_creative then
else
if unified_inventory.is_creative(player_name) then
local inv = player:get_inventory() local inv = player:get_inventory()
local stack = ItemStack(clicked_item) local stack = ItemStack(clicked_item)
stack:set_count(stack:get_stack_max()) stack:set_count(stack:get_stack_max())
@ -144,7 +147,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
end end
end end
end
if fields.searchbutton then if fields.searchbutton then
unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange") unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange")
@ -156,27 +158,29 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
-- alternate button -- alternate button
if fields.alternate then if not fields.alternate then
return
end
minetest.sound_play("click", minetest.sound_play("click",
{to_player=player_name, gain = 0.1}) {to_player=player_name, gain = 0.1})
local item_name = unified_inventory.current_item[player_name] local item_name = unified_inventory.current_item[player_name]
if item_name then if not item_name then
local alternates = 0 return
local alternate = unified_inventory.alternate[player_name]
local crafts = unified_inventory.crafts_for[unified_inventory.current_craft_direction[player_name]][item_name]
if crafts ~= nil then
alternates = #crafts
end end
if alternates > 1 then local crafts = unified_inventory.crafts_for[unified_inventory.current_craft_direction[player_name]][item_name]
alternate = alternate + 1 if not crafts then
return
end
local alternates = #crafts
if alternates <= 1 then
return
end
local alternate = unified_inventory.alternate[player_name] + 1
if alternate > alternates then if alternate > alternates then
alternate = 1 alternate = 1
end end
unified_inventory.alternate[player_name] = alternate unified_inventory.alternate[player_name] = alternate
unified_inventory.set_inventory_formspec(player, unified_inventory.set_inventory_formspec(player,
unified_inventory.current_page[player_name]) unified_inventory.current_page[player_name])
end
end
end
end) end)

View File

@ -23,28 +23,30 @@ function unified_inventory.get_formspec(player, page)
unified_inventory.current_page[player_name] = page unified_inventory.current_page[player_name] = page
local pagedef = unified_inventory.pages[page] local pagedef = unified_inventory.pages[page]
local formspec = "size[14,10]" local formspec = {
-- Background "size[14,10]",
formspec = formspec .. "background[-0.19,-0.25;14.4,10.75;ui_form_bg.png]" "background[-0.19,-0.25;14.4,10.75;ui_form_bg.png]" -- Background
}
local n = 3
if unified_inventory.lite_mode then if unified_inventory.lite_mode then
formspec = "size[11,7.7]" formspec[1] = "size[11,7.7]"
formspec = formspec .. "background[-0.19,-0.2;11.4,8.4;ui_form_bg.png]" formspec[2] = "background[-0.19,-0.2;11.4,8.4;ui_form_bg.png]"
end end
if unified_inventory.is_creative(player_name) and page == "craft" then if unified_inventory.is_creative(player_name)
formspec = formspec.."background[0,"..(unified_inventory.formspec_y + 2)..";1,1;ui_single_slot.png]" and page == "craft" then
formspec[n] = "background[0,"..(unified_inventory.formspec_y + 2)..";1,1;ui_single_slot.png]"
n = n+1
end end
local fsdata = nil
-- Current page -- Current page
if unified_inventory.pages[page] then if not unified_inventory.pages[page] then
fsdata = pagedef.get_formspec(player)
formspec = formspec .. fsdata.formspec
else
return "" -- Invalid page name return "" -- Invalid page name
end end
local fsdata = pagedef.get_formspec(player)
formspec[n] = fsdata.formspec
n = n+1
local button_row = 0 local button_row = 0
local button_col = 0 local button_col = 0
@ -57,34 +59,35 @@ function unified_inventory.get_formspec(player, page)
button_col = 1 button_col = 1
end end
local tooltip = def.tooltip or ""
if def.type == "image" then if def.type == "image" then
formspec = formspec.."image_button[" formspec[n] = "image_button["
..( unified_inventory.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) formspec[n+1] = ( unified_inventory.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4)
..","..(unified_inventory.main_button_y + button_row * 0.7)..";0.8,0.8;" formspec[n+2] = ","..(unified_inventory.main_button_y + button_row * 0.7)..";0.8,0.8;"
..minetest.formspec_escape(def.image)..";" formspec[n+3] = minetest.formspec_escape(def.image)..";"
..minetest.formspec_escape(def.name)..";]" formspec[n+4] = minetest.formspec_escape(def.name)..";]"
.."tooltip["..minetest.formspec_escape(def.name) formspec[n+5] = "tooltip["..minetest.formspec_escape(def.name)
..";"..tooltip.."]" formspec[n+6] = ";"..(def.tooltip or "").."]"
n = n+7
end end
end end
if fsdata.draw_inventory ~= false then if fsdata.draw_inventory ~= false then
-- Player inventory -- Player inventory
formspec = formspec.."listcolors[#00000000;#00000000]" formspec[n] = "listcolors[#00000000;#00000000]"
formspec = formspec .. "list[current_player;main;0,"..(unified_inventory.formspec_y + 3.5)..";8,4;]" formspec[n+1] = "list[current_player;main;0,"..(unified_inventory.formspec_y + 3.5)..";8,4;]"
n = n+2
end end
if fsdata.draw_item_list == false then if fsdata.draw_item_list == false then
return formspec return table.concat(formspec, "")
end end
-- Controls to flip items pages -- Controls to flip items pages
local start_x = 9.2 local start_x = 9.2
if not unified_inventory.lite_mode then if not unified_inventory.lite_mode then
formspec = formspec formspec[n] =
.. "image_button[" .. (start_x + 0.6 * 0) "image_button[" .. (start_x + 0.6 * 0)
.. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]" .. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]"
.. "tooltip[start_list;" .. minetest.formspec_escape(S("First page")) .. "]" .. "tooltip[start_list;" .. minetest.formspec_escape(S("First page")) .. "]"
@ -106,8 +109,8 @@ function unified_inventory.get_formspec(player, page)
.. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]" .. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]"
.. "tooltip[end_list;" .. minetest.formspec_escape(S("Last page")) .. "]" .. "tooltip[end_list;" .. minetest.formspec_escape(S("Last page")) .. "]"
else else
formspec = formspec formspec[n] =
.. "image_button[" .. (8.2 + 0.65 * 0) "image_button[" .. (8.2 + 0.65 * 0)
.. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]" .. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]"
.. "tooltip[start_list;" .. minetest.formspec_escape(S("First page")) .. "]" .. "tooltip[start_list;" .. minetest.formspec_escape(S("First page")) .. "]"
.. "image_button[" .. (8.2 + 0.65 * 1) .. "image_button[" .. (8.2 + 0.65 * 1)
@ -120,20 +123,22 @@ function unified_inventory.get_formspec(player, page)
.. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]" .. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]"
.. "tooltip[end_list;" .. minetest.formspec_escape(S("Last page")) .. "]" .. "tooltip[end_list;" .. minetest.formspec_escape(S("Last page")) .. "]"
end end
n = n+1
-- Search box -- Search box
if not unified_inventory.lite_mode then if not unified_inventory.lite_mode then
formspec = formspec .. "field[9.5,8.325;3,1;searchbox;;" formspec[n] = "field[9.5,8.325;3,1;searchbox;;"
.. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]" .. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]"
formspec = formspec .. "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]" formspec[n+1] = "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]"
.. "tooltip[searchbutton;" ..S("Search") .. "]" .. "tooltip[searchbutton;" ..S("Search") .. "]"
else else
formspec = formspec .. "field[8.5,5.225;2.2,1;searchbox;;" formspec[n] = "field[8.5,5.225;2.2,1;searchbox;;"
.. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]" .. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]"
formspec = formspec .. "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]" formspec[n+1] = "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]"
.. "tooltip[searchbutton;" ..S("Search") .. "]" .. "tooltip[searchbutton;" ..S("Search") .. "]"
end end
n = n+2
local no_matches = "No matching items" local no_matches = "No matching items"
if unified_inventory.lite_mode then if unified_inventory.lite_mode then
@ -142,7 +147,7 @@ function unified_inventory.get_formspec(player, page)
-- Items list -- Items list
if #unified_inventory.filtered_items_list[player_name] == 0 then if #unified_inventory.filtered_items_list[player_name] == 0 then
formspec = formspec.."label[8.2,"..unified_inventory.form_header_y..";" .. S(no_matches) .. "]" formspec[n] = "label[8.2,"..unified_inventory.form_header_y..";" .. S(no_matches) .. "]"
else else
local dir = unified_inventory.active_search_direction[player_name] local dir = unified_inventory.active_search_direction[player_name]
local list_index = unified_inventory.current_index[player_name] local list_index = unified_inventory.current_index[player_name]
@ -155,35 +160,39 @@ function unified_inventory.get_formspec(player, page)
for x = 0, unified_inventory.pagecols - 1 do for x = 0, unified_inventory.pagecols - 1 do
local name = unified_inventory.filtered_items_list[player_name][list_index] local name = unified_inventory.filtered_items_list[player_name][list_index]
if minetest.registered_items[name] then if minetest.registered_items[name] then
formspec = formspec.."item_image_button[" formspec[n] = "item_image_button["
..(8.2 + x * 0.7).."," ..(8.2 + x * 0.7)..","
..(unified_inventory.formspec_y + unified_inventory.page_y + y * 0.7)..";.81,.81;" ..(unified_inventory.formspec_y + unified_inventory.page_y + y * 0.7)..";.81,.81;"
..name..";item_button_"..dir.."_" ..name..";item_button_"..dir.."_"
..unified_inventory.mangle_for_formspec(name)..";]" ..unified_inventory.mangle_for_formspec(name)..";]"
n = n+1
list_index = list_index + 1 list_index = list_index + 1
end end
end end
end end
formspec = formspec.."label[8.2,"..unified_inventory.form_header_y..";"..S("Page") .. ": " formspec[n] = "label[8.2,"..unified_inventory.form_header_y..";"..S("Page") .. ": "
.. S("%s of %s"):format(page,pagemax).."]" .. S("%s of %s"):format(page,pagemax).."]"
end end
n= n+1
if unified_inventory.activefilter[player_name] ~= "" then if unified_inventory.activefilter[player_name] ~= "" then
formspec = formspec.."label[8.2,"..(unified_inventory.form_header_y + 0.4)..";" .. S("Filter") .. ":]" formspec[n] = "label[8.2,"..(unified_inventory.form_header_y + 0.4)..";" .. S("Filter") .. ":]"
formspec = formspec.."label[9.1,"..(unified_inventory.form_header_y + 0.4)..";"..minetest.formspec_escape(unified_inventory.activefilter[player_name]).."]" formspec[n+1] = "label[9.1,"..(unified_inventory.form_header_y + 0.4)..";"..minetest.formspec_escape(unified_inventory.activefilter[player_name]).."]"
end end
return formspec return table.concat(formspec, "")
end end
function unified_inventory.set_inventory_formspec(player, page) function unified_inventory.set_inventory_formspec(player, page)
if player then if player then
local formspec = unified_inventory.get_formspec(player, page) player:set_inventory_formspec(unified_inventory.get_formspec(player, page))
player:set_inventory_formspec(formspec)
end end
end end
--apply filter to the inventory list (create filtered copy of full one) --apply filter to the inventory list (create filtered copy of full one)
function unified_inventory.apply_filter(player, filter, search_dir) function unified_inventory.apply_filter(player, filter, search_dir)
if not player then return false end if not player then
return false
end
local player_name = player:get_player_name() local player_name = player:get_player_name()
local lfilter = string.lower(filter) local lfilter = string.lower(filter)
local ffilter local ffilter
@ -191,7 +200,8 @@ function unified_inventory.apply_filter(player, filter, search_dir)
local groups = lfilter:sub(7):split(",") local groups = lfilter:sub(7):split(",")
ffilter = function(name, def) ffilter = function(name, def)
for _, group in ipairs(groups) do for _, group in ipairs(groups) do
if not ((def.groups[group] or 0) > 0) then if not def.groups[group]
or def.groups[group] <= 0 then
return false return false
end end
end end
@ -206,8 +216,10 @@ function unified_inventory.apply_filter(player, filter, search_dir)
end end
unified_inventory.filtered_items_list[player_name]={} unified_inventory.filtered_items_list[player_name]={}
for name, def in pairs(minetest.registered_items) do for name, def in pairs(minetest.registered_items) do
if (def.groups.not_in_creative_inventory or 0) == 0 if (not def.groups.not_in_creative_inventory
and (def.description or "") ~= "" or def.groups.not_in_creative_inventory == 0)
and def.description
and def.description ~= ""
and ffilter(name, def) and ffilter(name, def)
and (unified_inventory.is_creative(player_name) and (unified_inventory.is_creative(player_name)
or unified_inventory.crafts_for.recipe[def.name]) then or unified_inventory.crafts_for.recipe[def.name]) then

View File

@ -1,4 +1,4 @@
# Translation by Xanthin # Translation mostly by Xanthin
### bags.lua ### ### bags.lua ###
Bags = Rucksaecke Bags = Rucksaecke
@ -11,23 +11,23 @@ Medium Bag = Rucksack (mittel)
Large Bag = Rucksack (gross) Large Bag = Rucksack (gross)
### inernal.lua ### ### inernal.lua ###
First page = First page = Erste Seite
Back three pages = Back three pages = Drei Seiten zurueckblaettern
Back one page = Back one page = Eine Seiten zurueckblaettern
Forward one page = Forward one page = Eine Seiten vorblaettern
Forward three pages = Forward three pages = Drei Seiten vorblaettern
Last page = Last page = Letzte Seite
No matching items = No matching items = Keine passenden Gegenstände
Page = Seite Page = Seite
%s of %s = %s von %s %s of %s = %s von %s
Filter = Suche Filter = Suche
Search = Search = Suchen
### register.lua ### ### register.lua ###
Can use the creative inventory = Kann das Kreativinventar nutzen Can use the creative inventory = Kann das Kreativinventar nutzen
Home position set to: %s = Ausgangsposition nach: %s gesetzt Home position set to: %s = Ausgangsposition nach: %s gesetzt
Time of day set to 6am = Tageszeit auf 6 Uhr morgens geaendert Time of day set to 6am = Tageszeit auf 6 Uhr morgens geaendert
You don't have the settime priviledge! = Du hast nicht das "settime" Privileg! You don't have the settime privilege! = Du hast nicht das "settime" Privileg!
Time of day set to 9pm = Tageszeit auf 9 Uhr abends geaendert Time of day set to 9pm = Tageszeit auf 9 Uhr abends geaendert
This button has been disabled outside of creative mode to prevent accidental inventory trashing. Use the trash slot instead. = Diese Funktion ist ausserhalb des Kreativmodus deaktiviert um ein versehentliches Loeschen des ganzen Inventars zu verhindern.\nNutze stattdessen das Muellfeld. This button has been disabled outside of creative mode to prevent accidental inventory trashing. Use the trash slot instead. = Diese Funktion ist ausserhalb des Kreativmodus deaktiviert um ein versehentliches Loeschen des ganzen Inventars zu verhindern.\nNutze stattdessen das Muellfeld.
Inventory Cleared! = Inventar geleert! Inventory Cleared! = Inventar geleert!
@ -48,23 +48,23 @@ Alternate = Alternative
Crafting Grid = Crafting Grid =
### waypoints.lua ### ### waypoints.lua ###
White = White = Weiß
Yellow = Yellow = Gelb
Red = Red = Rot
Green = Green = Gruen
Blue = Blue = Blau
Waypoints = Waypoints = Markierungen
Waypoint active = Waypoint active = Markierung aktiv
Waypoint inactive = Waypoint inactive = Markierung inaktiv
World position = World position = Welt Position
Name = Name =
HUD text color = HUD text color =
Edit waypoint name = Edit waypoint name = Name der Markierung aendern
Rename waypoint = Rename waypoint = Markierung umbenennen
Change color of waypoint display = Change color of waypoint display = Farbe der Darstellung der Markierung aendern
Set waypoint to current location = Set waypoint to current location = Setze Markierung zur derzeitigen Position
Make waypoint visible = Make waypoint visible = Markierung sichtbar machen
Make waypoint invisible = Make waypoint invisible = Markierung verstecken
Disable display of waypoint coordinates = Disable display of waypoint coordinates =
Enable display of waypoint coordinates = Enable display of waypoint coordinates =
Finish editing = Finish editing =

View File

@ -87,7 +87,7 @@ if not unified_inventory.lite_mode then
S("Time of day set to 6am")) S("Time of day set to 6am"))
else else
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("You don't have the settime priviledge!")) S("You don't have the settime privilege!"))
end end
end, end,
}) })
@ -106,7 +106,7 @@ if not unified_inventory.lite_mode then
S("Time of day set to 9pm")) S("Time of day set to 9pm"))
else else
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("You don't have the settime priviledge!")) S("You don't have the settime privilege!"))
end end
end, end,
}) })
@ -326,6 +326,80 @@ local function craftguide_giveme(player, formname, fields)
player_inv:add_item("main", {name = output, count = amount}) player_inv:add_item("main", {name = output, count = amount})
end end
-- tells if an item can be moved and returns an index if so
local function item_fits(player_inv, craft_item, needed_item)
local need_group = string.sub(needed_item, 1, 6) == "group:"
if need_group then
need_group = string.sub(needed_item, 7)
end
if craft_item
and not craft_item:is_empty() then
local ciname = craft_item:get_name()
-- abort if the item there isn't usable
if ciname ~= needed_item
and not need_group then
return
end
-- abort if no item fits onto it
if craft_item:get_count() >= craft_item:get_definition().stack_max then
return
end
-- use the item there if it's in the right group and a group item is needed
if need_group then
if minetest.get_item_group(ciname, need_group) == 0 then
return
end
needed_item = ciname
need_group = false
end
end
if need_group then
-- search an item of the specific group
for i,item in pairs(player_inv:get_list("main")) do
if not item:is_empty()
and minetest.get_item_group(item:get_name(), need_group) > 0 then
return i
end
end
-- no index found
return
end
-- search an item with a the name needed_item
for i,item in pairs(player_inv:get_list("main")) do
if not item:is_empty()
and item:get_name() == needed_item then
return i
end
end
-- no index found
end
-- modifies the player inventory and returns the changed craft_item if possible
local function move_item(player_inv, craft_item, needed_item)
local stackid = item_fits(player_inv, craft_item, needed_item)
if not stackid then
return
end
local wanted_stack = player_inv:get_stack("main", stackid)
local taken_item = wanted_stack:take_item()
player_inv:set_stack("main", stackid, wanted_stack)
if not craft_item
or craft_item:is_empty() then
return taken_item
end
craft_item:add_item(taken_item)
return craft_item
end
local function craftguide_craft(player, formname, fields) local function craftguide_craft(player, formname, fields)
local amount local amount
for k, v in pairs(fields) do for k, v in pairs(fields) do
@ -358,11 +432,13 @@ local function craftguide_craft(player, formname, fields)
width = 3 width = 3
end end
amount = tonumber(amount) or 99
--[[
if amount == "max" then if amount == "max" then
amount = 99 -- Arbitrary; need better way to do this. amount = 99 -- Arbitrary; need better way to do this.
else else
amount = tonumber(amount) amount = tonumber(amount)
end end--]]
for iter = 1, amount do for iter = 1, amount do
local index = 1 local index = 1
@ -372,17 +448,9 @@ local function craftguide_craft(player, formname, fields)
if needed_item then if needed_item then
local craft_index = ((y - 1) * 3) + x local craft_index = ((y - 1) * 3) + x
local craft_item = craft_list[craft_index] local craft_item = craft_list[craft_index]
if (not craft_item) or (craft_item:is_empty()) or (craft_item:get_name() == needed_item) then local newitem = move_item(player_inv, craft_item, needed_item)
itemname = craft_item and craft_item:get_name() or needed_item if newitem then
local needed_stack = ItemStack(needed_item) craft_list[craft_index] = newitem
if player_inv:contains_item("main", needed_stack) then
local count = (craft_item and craft_item:get_count() or 0) + 1
if count <= needed_stack:get_definition().stack_max then
local stack = ItemStack({name=needed_item, count=count})
craft_list[craft_index] = stack
player_inv:remove_item("main", needed_stack)
end
end
end end
end end
index = index + 1 index = index + 1
@ -399,10 +467,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
for k, v in pairs(fields) do for k, v in pairs(fields) do
if k:match("craftguide_craft_") then if k:match("craftguide_craft_") then
craftguide_craft(player, formname, fields) craftguide_craft(player, formname, fields)
break return
elseif k:match("craftguide_giveme_") then end
if k:match("craftguide_giveme_") then
craftguide_giveme(player, formname, fields) craftguide_giveme(player, formname, fields)
break return
end end
end end
end) end)