diff --git a/releasenotes.md b/releasenotes.md index a5aad15..e078e78 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -1,6 +1,24 @@ # Release Notes for ModPack TechPack [techpack] +## V2.03.02 (2019-05-09) + +### Additions + +### Removals + +### Changes +- HighPerf Pusher support for autocrafter, grinder, and harvester + added (issue #22, #23) +- Both distributor behaviours changed (issue #26) + +### Fixes +- Black Hole "items disappeared" counter bugfix (issue #24) +- HighPerf distributor behaviour without an active filtered channel + changed (issue #25) + + + ## V2.03.01 (2019-05-03) ### Additions diff --git a/tubelib/blackhole.lua b/tubelib/blackhole.lua index cc890ae..baef64f 100644 --- a/tubelib/blackhole.lua +++ b/tubelib/blackhole.lua @@ -77,7 +77,7 @@ tubelib.register_node("tubelib:blackhole", {}, { on_push_item = function(pos, side, item) if side == "L" then local meta = minetest.get_meta(pos) - local disappeared = meta:get_int("disappeared") + 1 + local disappeared = meta:get_int("disappeared") + item:get_count() meta:set_int("disappeared", disappeared) meta:set_string("infotext", disappeared.." items disappeared") return true diff --git a/tubelib/distributor.lua b/tubelib/distributor.lua index 3de6dc7..c70ce0d 100644 --- a/tubelib/distributor.lua +++ b/tubelib/distributor.lua @@ -112,6 +112,18 @@ local function AddToTbl(kvTbl, new_items) return kvTbl end +local function countItemOccurrenceInFilters(kvTbl, new_items) + for _, l in ipairs(new_items) do + local name = l[1] + if kvTbl[name] == nil then + kvTbl[name] = 1 + else + kvTbl[name] = kvTbl[name] + 1 + end + end + return kvTbl +end + -- return the number of items to be pushed to an unconfigured slot local function num_items(moved_items, name, filter_item_names, rejected_item_names) if filter_item_names[name] == nil then -- not configured in one filter? @@ -170,6 +182,7 @@ local function filter_settings(pos) local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} local kvFilterItemNames = {} -- { = true,...} local kvSide2ItemNames = {} -- {"F" = {,...},...} + local kvNumOccur = {} -- collect all filter settings for idx,slot in ipairs(SlotColors) do @@ -179,6 +192,7 @@ local function filter_settings(pos) local filter = invlist_entries_as_list(list) AddToTbl(kvFilterItemNames, filter) kvSide2ItemNames[side] = filter + countItemOccurrenceInFilters(kvNumOccur, filter) end end @@ -186,6 +200,7 @@ local function filter_settings(pos) kvFilterItemNames = kvFilterItemNames, kvSide2ItemNames = kvSide2ItemNames, kvRejectedItemNames = {}, + kvNumOccur = kvNumOccur, } end @@ -213,6 +228,7 @@ local function distributing(pos, meta) local kvFilterItemNames = FilterCache[hash].kvFilterItemNames -- filter items of one slot as list {{, },...} local items = FilterCache[hash].kvSide2ItemNames[side] + local kvNumOccur = FilterCache[hash].kvNumOccur -- rejected items from other filter slots local rejected = FilterCache[hash].kvRejectedItemNames @@ -244,7 +260,7 @@ local function distributing(pos, meta) local num = num_items(moved_items, name, kvFilterItemNames, rejected) if num then local item = tubelib.get_this_item(meta, "src", kvSrc[name], num) -- <<=== tubelib - if item then + if item and (not kvNumOccur[item:get_name()] or kvNumOccur[item:get_name()] < 2) then if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib tubelib.put_item(meta, "src", item) else diff --git a/tubelib_addons1/autocrafter.lua b/tubelib_addons1/autocrafter.lua index 5a06e63..4c9aa3d 100644 --- a/tubelib_addons1/autocrafter.lua +++ b/tubelib_addons1/autocrafter.lua @@ -426,6 +426,9 @@ minetest.register_craft({ tubelib.register_node("tubelib_addons1:autocrafter", {"tubelib_addons1:autocrafter_active", "tubelib_addons1:autocrafter_defect"}, { + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "dst") + end, on_pull_item = function(pos, side) return tubelib.get_item(M(pos), "dst") end, diff --git a/tubelib_addons1/grinder.lua b/tubelib_addons1/grinder.lua index 653aac3..693c402 100644 --- a/tubelib_addons1/grinder.lua +++ b/tubelib_addons1/grinder.lua @@ -265,6 +265,9 @@ minetest.register_craft({ tubelib.register_node("tubelib_addons1:grinder", {"tubelib_addons1:grinder_active", "tubelib_addons1:grinder_defect"}, { + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "dst") + end, on_pull_item = function(pos, side) return tubelib.get_item(M(pos), "dst") end, diff --git a/tubelib_addons1/harvester.lua b/tubelib_addons1/harvester.lua index 7ad040e..8213d28 100644 --- a/tubelib_addons1/harvester.lua +++ b/tubelib_addons1/harvester.lua @@ -425,6 +425,9 @@ minetest.register_craft({ tubelib.register_node("tubelib_addons1:harvester_base", {"tubelib_addons1:harvester_defect"}, { + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "main") + end, on_pull_item = function(pos, side) return tubelib.get_item(M(pos), "main") end, diff --git a/tubelib_addons3/distributor.lua b/tubelib_addons3/distributor.lua index f664117..bed3ae5 100644 --- a/tubelib_addons3/distributor.lua +++ b/tubelib_addons3/distributor.lua @@ -194,7 +194,7 @@ local function distributing(pos, meta) local open_ports = table.copy(FilterCache[hash].OpenPorts) -- no filter configured? - if next(kvFilterItemNames) == nil then return end + if not next(kvFilterItemNames) and not next(open_ports) then return end local busy = false local inv = meta:get_inventory() @@ -230,7 +230,7 @@ local function distributing(pos, meta) end -- try unconfigured open output ports - if second_try then + if second_try and (not kvFilterItemNames[name] or #kvFilterItemNames[name] == 1) then side = random_list_elem(open_ports) if side then if tubelib.push_items(pos, side, stack, player_name) then diff --git a/tubelib_addons3/pushing_chest.lua b/tubelib_addons3/pushing_chest.lua index 53baa91..a5d5d32 100644 --- a/tubelib_addons3/pushing_chest.lua +++ b/tubelib_addons3/pushing_chest.lua @@ -48,6 +48,22 @@ local function allow_metadata_inventory_move(pos, from_list, from_index, to_list return count end +local function keep_the_rest(meta, list, taken) + if taken then + local inv = meta:get_inventory() + local rest = ItemStack(taken:get_name()) + if not inv:contains_item(list, rest) then + inv:add_item(list, rest) + if taken:get_count() > 1 then + taken:set_count(taken:get_count() - 1) + return taken + end + else + return taken + end + end +end + local function aging(pos, meta) local cnt = meta:get_int("tubelib_aging") + 1 meta:set_int("tubelib_aging", cnt) @@ -286,6 +302,11 @@ tubelib.register_node("tubelib_addons3:pushing_chest", return "not supported" end end, + on_pull_stack = function(pos, side) + local meta = minetest.get_meta(pos) + local taken = tubelib.get_stack(meta, "main") + return keep_the_rest(meta, "main", taken) + end, on_pull_item = function(pos, side) local meta = minetest.get_meta(pos) local items = tubelib.get_num_items(meta, "main", 2)