diff --git a/doc.lua b/doc.lua index d7fee24..fbba15f6b 100644 --- a/doc.lua +++ b/doc.lua @@ -21,4 +21,4 @@ hopper.doc.chute_long_desc = S("A chute to transfer items over longer distances. hopper.doc.chute_usage = S("Chutes operate much like hoppers but do not have their own intake capability. Items can only be inserted into a chute manually or by a hopper connected to a chute. They transfer items in the direction indicated by the arrow on their narrow segment at a rate of one item per second. They have a small buffer capacity, and any items that can't be placed into the target block's inventory will remain lodged in the chute's buffer until manually removed or their destination becomes available.") hopper.doc.sorter_long_desc = S("A sorter to redirect certain items to an alternate target.") -hopper.doc.sorter_usage = S("This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled \"Filter\" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.\n\nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.") \ No newline at end of file +hopper.doc.sorter_usage = S("This is similar to a chute but has a secondary output that is used to shunt specific items to an alternate destination. There is a set of inventory slots labeled \"Filter\" at the top of this block's inventory display, if you place an item into one of these slots the sorter will record the item's type (without actually taking it from you). Then when items come through the sorter's inventory that match one of the items in the filter list it will first attempt to send it in the direction marked with an arrow on the sorter's sides.\n\nIf the item doesn't match the filter list, or the secondary output is unable to take the item for whatever reason, the sorter will try to send the item out the other output instead.\n\nIn addition, there is a button labeled \"Filter All\" that will tell the sorter to not use the filter list and instead first attempt to shunt all items out of the filter, only sending items along the non-filter path if the target cannot accept it for whatever reason. This feature is useful for handling \"overflow\" (when the target's inventory fills up) or for dealing with targets that are selective about what they accept (for example, a furnace's fuel slot).") \ No newline at end of file diff --git a/init.lua b/init.lua index f2c7cfc..981c05b 100644 --- a/init.lua +++ b/init.lua @@ -30,6 +30,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local pos = minetest.string_to_pos(string.sub(formname, 17, -1)) local meta = minetest.get_meta(pos) local eject_setting = meta:get_string("eject") == "true" + local filter_all_setting = meta:get_string("filter_all") == "true" if fields.eject then if eject_setting then meta:set_string("eject", nil) @@ -37,6 +38,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) meta:set_string("eject", "true") end end + if fields.filter_all then + if filter_all_setting then + meta:set_string("filter_all", nil) + else + meta:set_string("filter_all", "true") + end + end end end) diff --git a/locale/de.po b/locale/de.po index b6d91b4..f087708 100644 --- a/locale/de.po +++ b/locale/de.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-03-31 00:35-0600\n" +"POT-Creation-Date: 2017-04-01 09:43-0600\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -98,10 +98,18 @@ msgid "" "\n" "If the item doesn't match the filter list, or the secondary output is unable " "to take the item for whatever reason, the sorter will try to send the item " -"out the other output instead." +"out the other output instead.\n" +"\n" +"In addition, there is a button labeled \"Filter All\" that will tell the " +"sorter to not use the filter list and instead first attempt to shunt all " +"items out of the filter, only sending items along the non-filter path if the " +"target cannot accept it for whatever reason. This feature is useful for " +"handling \"overflow\" (when the target's inventory fills up) or for dealing " +"with targets that are selective about what they accept (for example, a " +"furnace's fuel slot)." msgstr "" -#: hopper\init.lua:53 +#: hopper\init.lua:61 msgid "[MOD] Hopper loaded" msgstr "[MOD] Trichter geladen" @@ -135,7 +143,7 @@ msgstr "" msgid "Hopper Chute" msgstr "" -#: hopper\nodes\chute.lua:77 +#: hopper\nodes\chute.lua:78 #, fuzzy msgid "@1 moves stuff to chute at @2" msgstr "@1 verlagert Dinge in einen Trichter bei @2" @@ -144,34 +152,65 @@ msgstr "@1 verlagert Dinge in einen Trichter bei @2" msgid "Hopper" msgstr "Trichter" -#: hopper\nodes\hoppers.lua:121 -#: hopper\nodes\hoppers.lua:212 +#: hopper\nodes\hoppers.lua:122 +#: hopper\nodes\hoppers.lua:214 msgid "@1 moves stuff in hopper at @2" msgstr "@1 bewegt Dinge in einem Trichter bei @2" -#: hopper\nodes\hoppers.lua:126 -#: hopper\nodes\hoppers.lua:217 +#: hopper\nodes\hoppers.lua:127 +#: hopper\nodes\hoppers.lua:219 msgid "@1 moves stuff to hopper at @2" msgstr "@1 verlagert Dinge in einen Trichter bei @2" -#: hopper\nodes\hoppers.lua:131 -#: hopper\nodes\hoppers.lua:222 +#: hopper\nodes\hoppers.lua:132 +#: hopper\nodes\hoppers.lua:224 msgid "@1 moves stuff from hopper at @2" msgstr "@1 nimmt Dinge aus einem Trichter bei @2" -#: hopper\nodes\hoppers.lua:147 +#: hopper\nodes\hoppers.lua:148 msgid "Side Hopper" msgstr "Seitentrichter" +#: hopper\nodes\sorter.lua:22 +#: hopper\nodes\sorter.lua:39 +msgid "" +"Selective\n" +"Filter" +msgstr "" + #: hopper\nodes\sorter.lua:23 +#: hopper\nodes\sorter.lua:40 +msgid "" +"This sorter is currently set to try sending all items\n" +"in the direction of the arrow. Click this button\n" +"to enable an item-type-specific filter." +msgstr "" + +#: hopper\nodes\sorter.lua:25 +#: hopper\nodes\sorter.lua:43 +msgid "" +"Filter\n" +"All" +msgstr "" + +#: hopper\nodes\sorter.lua:26 +#: hopper\nodes\sorter.lua:44 +msgid "" +"This sorter is currently set to only send items listed\n" +"in the filter list in the direction of the arrow.\n" +"Click this button to set it to try sending all\n" +"items that way first." +msgstr "" + +#: hopper\nodes\sorter.lua:42 msgid "Filter" msgstr "" -#: hopper\nodes\sorter.lua:36 +#: hopper\nodes\sorter.lua:64 msgid "Sorter" msgstr "" -#: hopper\nodes\sorter.lua:115 +#: hopper\nodes\sorter.lua:143 #, fuzzy msgid "@1 moves stuff to sorter at @2" msgstr "@1 verlagert Dinge in einen Trichter bei @2" diff --git a/locale/template.pot b/locale/template.pot index 1c28eeb..8a47c95 100644 --- a/locale/template.pot +++ b/locale/template.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-03-31 00:35-0600\n" +"POT-Creation-Date: 2017-04-01 09:43-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -98,10 +98,18 @@ msgid "" "\n" "If the item doesn't match the filter list, or the secondary output is unable " "to take the item for whatever reason, the sorter will try to send the item " -"out the other output instead." +"out the other output instead.\n" +"\n" +"In addition, there is a button labeled \"Filter All\" that will tell the " +"sorter to not use the filter list and instead first attempt to shunt all " +"items out of the filter, only sending items along the non-filter path if the " +"target cannot accept it for whatever reason. This feature is useful for " +"handling \"overflow\" (when the target's inventory fills up) or for dealing " +"with targets that are selective about what they accept (for example, a " +"furnace's fuel slot)." msgstr "" -#: hopper\init.lua:53 +#: hopper\init.lua:61 msgid "[MOD] Hopper loaded" msgstr "" @@ -135,7 +143,7 @@ msgstr "" msgid "Hopper Chute" msgstr "" -#: hopper\nodes\chute.lua:77 +#: hopper\nodes\chute.lua:78 msgid "@1 moves stuff to chute at @2" msgstr "" @@ -143,33 +151,64 @@ msgstr "" msgid "Hopper" msgstr "" -#: hopper\nodes\hoppers.lua:121 -#: hopper\nodes\hoppers.lua:212 +#: hopper\nodes\hoppers.lua:122 +#: hopper\nodes\hoppers.lua:214 msgid "@1 moves stuff in hopper at @2" msgstr "" -#: hopper\nodes\hoppers.lua:126 -#: hopper\nodes\hoppers.lua:217 +#: hopper\nodes\hoppers.lua:127 +#: hopper\nodes\hoppers.lua:219 msgid "@1 moves stuff to hopper at @2" msgstr "" -#: hopper\nodes\hoppers.lua:131 -#: hopper\nodes\hoppers.lua:222 +#: hopper\nodes\hoppers.lua:132 +#: hopper\nodes\hoppers.lua:224 msgid "@1 moves stuff from hopper at @2" msgstr "" -#: hopper\nodes\hoppers.lua:147 +#: hopper\nodes\hoppers.lua:148 msgid "Side Hopper" msgstr "" +#: hopper\nodes\sorter.lua:22 +#: hopper\nodes\sorter.lua:39 +msgid "" +"Selective\n" +"Filter" +msgstr "" + #: hopper\nodes\sorter.lua:23 +#: hopper\nodes\sorter.lua:40 +msgid "" +"This sorter is currently set to try sending all items\n" +"in the direction of the arrow. Click this button\n" +"to enable an item-type-specific filter." +msgstr "" + +#: hopper\nodes\sorter.lua:25 +#: hopper\nodes\sorter.lua:43 +msgid "" +"Filter\n" +"All" +msgstr "" + +#: hopper\nodes\sorter.lua:26 +#: hopper\nodes\sorter.lua:44 +msgid "" +"This sorter is currently set to only send items listed\n" +"in the filter list in the direction of the arrow.\n" +"Click this button to set it to try sending all\n" +"items that way first." +msgstr "" + +#: hopper\nodes\sorter.lua:42 msgid "Filter" msgstr "" -#: hopper\nodes\sorter.lua:36 +#: hopper\nodes\sorter.lua:64 msgid "Sorter" msgstr "" -#: hopper\nodes\sorter.lua:115 +#: hopper\nodes\sorter.lua:143 msgid "@1 moves stuff to sorter at @2" msgstr "" diff --git a/nodes/chute.lua b/nodes/chute.lua index c354318..f92cc5e 100644 --- a/nodes/chute.lua +++ b/nodes/chute.lua @@ -8,7 +8,7 @@ local function get_chute_formspec(pos) "size[8,7]" .. hopper.formspec_bg .. "list[nodemeta:" .. spos .. ";main;3,0.3;2,2;]" - .. hopper.get_eject_button_texts(pos, 7, 1) + .. hopper.get_eject_button_texts(pos, 7, 0.8) .. "list[current_player;main;0,2.85;8,1;]" .. "list[current_player;main;0,4.08;8,3;8]" .. "listring[nodemeta:" .. spos .. ";main]" diff --git a/nodes/sorter.lua b/nodes/sorter.lua index e678bb1..48fb503 100644 --- a/nodes/sorter.lua +++ b/nodes/sorter.lua @@ -17,15 +17,30 @@ end local function get_sorter_formspec(pos) local spos = hopper.get_string_pos(pos) + + local filter_all = minetest.get_meta(pos):get_string("filter_all") == "true" + local y_displace = 0 + local filter_button_text, filter_button_tooltip, filter_body + if filter_all then + filter_body = "" + filter_button_text = S("Selective\nFilter") + filter_button_tooltip = S("This sorter is currently set to try sending all items\nin the direction of the arrow. Click this button\nto enable an item-type-specific filter.") + else + filter_body = "label[3.7,0;"..S("Filter").."]list[nodemeta:" .. spos .. ";filter;0,0.5;8,1;]" + filter_button_text = S("Filter\nAll") + filter_button_tooltip = S("This sorter is currently set to only send items listed\nin the filter list in the direction of the arrow.\nClick this button to set it to try sending all\nitems that way first.") + y_displace = 1.6 + end + local formspec = - "size[8,8.4]" + "size[8," .. 7 + y_displace .. "]" .. hopper.formspec_bg - .. "label[3.7,0;"..S("Filter").."]" - .. "list[nodemeta:" .. spos .. ";filter;0,0.5;8,1;]" - .. "list[nodemeta:" .. spos .. ";main;3,2.1;2,2;]" - .. hopper.get_eject_button_texts(pos, 7, 3) - .. "list[current_player;main;0,4.5;8,1;]" - .. "list[current_player;main;0,5.7;8,3;8]" + .. filter_body + .. "list[nodemeta:" .. spos .. ";main;3,".. tostring(0.3 + y_displace) .. ";2,2;]" + .. "button_exit[7,".. tostring(0.8 + y_displace) .. ";1,1;filter_all;".. filter_button_text .. "]tooltip[filter_all;" .. filter_button_tooltip.. "]" + .. hopper.get_eject_button_texts(pos, 6, 0.8 + y_displace) + .. "list[current_player;main;0,".. tostring(2.85 + y_displace) .. ";8,1;]" + .. "list[current_player;main;0,".. tostring(4.08 + y_displace) .. ";8,3;8]" .. "listring[nodemeta:" .. spos .. ";main]" .. "listring[current_player;main]" return formspec @@ -44,8 +59,8 @@ minetest.register_node("hopper:sorter", { tiles = { "hopper_bottom_" .. hopper.config.texture_resolution .. ".png", "hopper_top_" .. hopper.config.texture_resolution .. ".png", - "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^hopper_sorter_arrow_" .. hopper.config.texture_resolution .. ".png^[transformFX", - "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^hopper_sorter_arrow_" .. hopper.config.texture_resolution .. ".png", + "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^hopper_sorter_arrow_" .. hopper.config.texture_resolution .. ".png^[transformFX^hopper_sorter_sub_arrow_" .. hopper.config.texture_resolution .. ".png^[transformFX", + "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^hopper_sorter_arrow_" .. hopper.config.texture_resolution .. ".png^hopper_sorter_sub_arrow_" .. hopper.config.texture_resolution .. ".png", "hopper_top_" .. hopper.config.texture_resolution .. ".png", "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^hopper_sorter_arrow_" .. hopper.config.texture_resolution .. ".png", }, @@ -126,13 +141,16 @@ minetest.register_node("hopper:sorter", { local inv = meta:get_inventory() -- build a filter list - local filter_items = {} - local filter_inv_size = inv:get_size("filter") - for i = 1, filter_inv_size do - local stack = inv:get_stack("filter", i) - local item = stack:get_name() - if item ~= "" then - filter_items[item] = true + local filter_items = nil + if meta:get_string("filter_all") ~= "true" then + filter_items = {} + local filter_inv_size = inv:get_size("filter") + for i = 1, filter_inv_size do + local stack = inv:get_stack("filter", i) + local item = stack:get_name() + if item ~= "" then + filter_items[item] = true + end end end diff --git a/textures/hopper_sorter_sub_arrow_16.png b/textures/hopper_sorter_sub_arrow_16.png new file mode 100644 index 0000000..e8439f1 Binary files /dev/null and b/textures/hopper_sorter_sub_arrow_16.png differ diff --git a/textures/hopper_sorter_sub_arrow_32.png b/textures/hopper_sorter_sub_arrow_32.png new file mode 100644 index 0000000..4c91908 Binary files /dev/null and b/textures/hopper_sorter_sub_arrow_32.png differ diff --git a/utility.lua b/utility.lua index 2d9c2c9..5a3a567 100644 --- a/utility.lua +++ b/utility.lua @@ -37,7 +37,7 @@ hopper.get_eject_button_texts = function(pos, loc_X, loc_Y) eject_button_text = S("Eject\nItems") eject_button_tooltip = S("This hopper is currently set to hold on to item if there\nisn't a compatible block positioned to receive it.\nClick this button to have it eject items instead.") end - return string.format("button_exit[%i,%i;1,1;eject;%s]tooltip[eject;%s]", loc_X, loc_Y, eject_button_text, eject_button_tooltip) + return "button_exit["..loc_X..","..loc_Y..";1,1;eject;"..eject_button_text.."]tooltip[eject;"..eject_button_tooltip.."]" end hopper.get_string_pos = function(pos)