From eee07f56b5d99aaffbd6ed6534e2301800a9b2e8 Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Thu, 17 Feb 2022 17:39:45 -0300 Subject: [PATCH 1/8] Make sideways hoppers try pushing down before sideways This is consistent with its behaviour in Minecraft. --- mods/ITEMS/mcl_hoppers/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 36a21ad95..7d0c9d531 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -453,6 +453,11 @@ minetest.register_abm({ end end + -- Try to move an item below before moving it sideways + local downnode = minetest.get_node(downpos) + if not minetest.registered_nodes[downnode.name] then return end + if mcl_util.move_item_container(pos, downpos) then return end + -- Move an item from the hopper into the container to which the hopper points to local g = minetest.registered_nodes[frontnode.name].groups.container if g == 2 or g == 3 or g == 5 or g == 6 then From 0c6da14e1fd8651ec010606a617d10bf95a6f845 Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Thu, 17 Feb 2022 21:30:15 -0300 Subject: [PATCH 2/8] Set _removed to true in item entities sucked by hoppers This double-check might just prevent future commits from triggering regressions allowing hoppers to duplicate items. --- mods/ITEMS/mcl_hoppers/init.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 7d0c9d531..aceab7160 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -350,7 +350,8 @@ minetest.register_abm({ local inv = meta:get_inventory() for _,object in pairs(minetest.get_objects_inside_radius(pos, 2)) do - if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and not object:get_luaentity()._removed then + local entity = object:get_luaentity() + if not object:is_player() and entity and entity.name == "__builtin:item" and not entity._removed then if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then -- Item must get sucked in when the item just TOUCHES the block above the hopper -- This is the reason for the Y calculation. @@ -359,7 +360,8 @@ minetest.register_abm({ local posob_miny = posob.y + object:get_properties().collisionbox[2] if math.abs(posob.x-pos.x) <= 0.5 and (posob_miny-pos.y < 1.5 and posob.y-pos.y >= 0.3) then inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) - object:get_luaentity().itemstring = "" + entity._removed = true + entity.itemstring = "" object:remove() end end From 2c8194bd6df6a9320b994a141149bf1d4625f848 Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Thu, 17 Feb 2022 21:34:01 -0300 Subject: [PATCH 3/8] Slight reorder to prevent race condition in hopper item collection --- mods/ITEMS/mcl_hoppers/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index aceab7160..d488527c3 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -359,10 +359,10 @@ minetest.register_abm({ local posob = object:get_pos() local posob_miny = posob.y + object:get_properties().collisionbox[2] if math.abs(posob.x-pos.x) <= 0.5 and (posob_miny-pos.y < 1.5 and posob.y-pos.y >= 0.3) then - inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) entity._removed = true entity.itemstring = "" object:remove() + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) end end end From 024904eadd884feedd1a840f7ab577a690cde919 Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Sat, 19 Feb 2022 12:36:06 -0300 Subject: [PATCH 4/8] Use get_item_group accessor in hopper code --- mods/ITEMS/mcl_hoppers/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index d488527c3..e12649cae 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -343,7 +343,7 @@ minetest.register_abm({ local abovenode = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) if not minetest.registered_items[abovenode.name] then return end -- Don't bother checking item enties if node above is a container (should save some CPU) - if minetest.registered_items[abovenode.name].groups.container then + if get_item_group(abovenode.name, "container") then return end local meta = minetest.get_meta(pos) @@ -399,7 +399,7 @@ minetest.register_abm({ -- Suck an item from the container above into the hopper local upnode = minetest.get_node(uppos) if not minetest.registered_nodes[upnode.name] then return end - local g = minetest.registered_nodes[upnode.name].groups.container + local g = get_item_group(upnode.name, "container") local sucked = mcl_util.move_item_container(uppos, pos) -- Also suck in non-fuel items from furnace fuel slot @@ -444,7 +444,7 @@ minetest.register_abm({ -- Suck an item from the container above into the hopper local abovenode = minetest.get_node(above) if not minetest.registered_nodes[abovenode.name] then return end - local g = minetest.registered_nodes[abovenode.name].groups.container + local g = get_item_group(abovenode.name, "container") local sucked = mcl_util.move_item_container(above, pos) -- Also suck in non-fuel items from furnace fuel slot @@ -461,7 +461,7 @@ minetest.register_abm({ if mcl_util.move_item_container(pos, downpos) then return end -- Move an item from the hopper into the container to which the hopper points to - local g = minetest.registered_nodes[frontnode.name].groups.container + local g = get_item_group(frontnode.name, "container") if g == 2 or g == 3 or g == 5 or g == 6 then mcl_util.move_item_container(pos, front) elseif g == 4 then From 54e9477f37e9c18d403c8e96fc95067d78d3be3c Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Mon, 20 Jun 2022 17:05:18 -0300 Subject: [PATCH 5/8] Fix hopper downpos priority check --- mods/ITEMS/mcl_hoppers/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index e12649cae..278e9d8ea 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -457,8 +457,9 @@ minetest.register_abm({ -- Try to move an item below before moving it sideways local downnode = minetest.get_node(downpos) - if not minetest.registered_nodes[downnode.name] then return end - if mcl_util.move_item_container(pos, downpos) then return end + + if minetest.registered_nodes[downnode.name] and \ + mcl_util.move_item_container(pos, downpos) then return end -- Move an item from the hopper into the container to which the hopper points to local g = get_item_group(frontnode.name, "container") From d57097baefd65c674b3bc9d2ad3067a805876ba3 Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Mon, 20 Jun 2022 20:37:15 -0300 Subject: [PATCH 6/8] Fix syntax error with hopper check --- mods/ITEMS/mcl_hoppers/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 278e9d8ea..7ae0a4916 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -458,7 +458,7 @@ minetest.register_abm({ -- Try to move an item below before moving it sideways local downnode = minetest.get_node(downpos) - if minetest.registered_nodes[downnode.name] and \ + if minetest.registered_nodes[downnode.name] and mcl_util.move_item_container(pos, downpos) then return end -- Move an item from the hopper into the container to which the hopper points to From f3cc8f0f8a5b64fdd3abd0d79653b96519a6d21c Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Thu, 23 Jun 2022 14:29:36 -0300 Subject: [PATCH 7/8] Fix get_item_group crash in mcl_hoppers --- mods/ITEMS/mcl_hoppers/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 7ae0a4916..90057ea75 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local get_item_group = minetest.get_item_group + --[[ BEGIN OF NODE DEFINITIONS ]] local mcl_hoppers_formspec = From b8f89e5569c16600a5247166f434967d2814ad23 Mon Sep 17 00:00:00 2001 From: Gustavo Ramos Rehermann Date: Thu, 23 Jun 2022 18:23:29 -0300 Subject: [PATCH 8/8] Add missing local definition of var downpos --- mods/ITEMS/mcl_hoppers/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 90057ea75..c8435ce03 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -439,6 +439,7 @@ minetest.register_abm({ front = {x=pos.x,y=pos.y,z=pos.z-1} end local above = {x=pos.x,y=pos.y+1,z=pos.z} + local downpos = {x=pos.x,y=pos.y-1,z=pos.z} local frontnode = minetest.get_node(front) if not minetest.registered_nodes[frontnode.name] then return end