mirror of
https://github.com/minetest-mods/hopper.git
synced 2024-11-19 22:03:47 +01:00
Fix sorter filter and error in eject (#32)
Also corrects eject for sorter, and simplifies it.
This commit is contained in:
parent
0baf36e7d9
commit
e91bc6ef0c
12
abms.lua
12
abms.lua
@ -97,9 +97,9 @@ minetest.register_abm({
|
|||||||
destination_pos = vector.add(pos, destination_dir)
|
destination_pos = vector.add(pos, destination_dir)
|
||||||
end
|
end
|
||||||
|
|
||||||
local output_direction
|
local output_direction = "bottom"
|
||||||
if destination_dir.y == 0 then
|
if destination_dir.y == 0 then
|
||||||
output_direction = "horizontal"
|
output_direction = "side"
|
||||||
end
|
end
|
||||||
|
|
||||||
local source_node = minetest.get_node(source_pos)
|
local source_node = minetest.get_node(source_pos)
|
||||||
@ -112,13 +112,11 @@ minetest.register_abm({
|
|||||||
|
|
||||||
local registered_destination_inventories = hopper.get_registered(destination_node.name)
|
local registered_destination_inventories = hopper.get_registered(destination_node.name)
|
||||||
if registered_destination_inventories ~= nil then
|
if registered_destination_inventories ~= nil then
|
||||||
if output_direction == "horizontal" then
|
if not hopper.send_item_to(pos, destination_pos, destination_node, registered_destination_inventories[output_direction]) then
|
||||||
hopper.send_item_to(pos, destination_pos, destination_node, registered_destination_inventories["side"])
|
hopper.try_eject_item(pos, destination_pos)
|
||||||
else
|
|
||||||
hopper.send_item_to(pos, destination_pos, destination_node, registered_destination_inventories["bottom"])
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
hopper.send_item_to(pos, destination_pos, destination_node) -- for handling ejection
|
hopper.try_eject_item(pos, destination_pos)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
@ -88,21 +88,19 @@ minetest.register_node("hopper:chute", {
|
|||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
local dir = minetest.facedir_to_dir(node.param2)
|
local dir = minetest.facedir_to_dir(node.param2)
|
||||||
local destination_pos = vector.add(pos, dir)
|
local destination_pos = vector.add(pos, dir)
|
||||||
local output_direction
|
local output_direction = "bottom"
|
||||||
if dir.y == 0 then
|
if dir.y == 0 then
|
||||||
output_direction = "horizontal"
|
output_direction = "side"
|
||||||
end
|
end
|
||||||
|
|
||||||
local destination_node = minetest.get_node(destination_pos)
|
local destination_node = minetest.get_node(destination_pos)
|
||||||
local registered_inventories = hopper.get_registered(destination_node.name)
|
local registered_inventories = hopper.get_registered(destination_node.name)
|
||||||
if registered_inventories ~= nil then
|
if registered_inventories ~= nil then
|
||||||
if output_direction == "horizontal" then
|
if not hopper.send_item_to(pos, destination_pos, destination_node, registered_inventories[output_direction]) then
|
||||||
hopper.send_item_to(pos, destination_pos, destination_node, registered_inventories["side"])
|
hopper.try_eject_item(pos, destination_pos)
|
||||||
else
|
|
||||||
hopper.send_item_to(pos, destination_pos, destination_node, registered_inventories["bottom"])
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
hopper.send_item_to(pos, destination_pos, destination_node)
|
hopper.try_eject_item(pos, destination_pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
if not inv:is_empty("main") then
|
if not inv:is_empty("main") then
|
||||||
|
@ -175,21 +175,23 @@ minetest.register_node("hopper:sorter", {
|
|||||||
local filter_output_direction = (dir.y == 0) and "side" or "bottom"
|
local filter_output_direction = (dir.y == 0) and "side" or "bottom"
|
||||||
|
|
||||||
--- returns success? = true/false
|
--- returns success? = true/false
|
||||||
local function try_send_item(output_dir, dst_pos)
|
local function try_send_item(output_dir, dst_pos, filter_items_map)
|
||||||
local dst_node = minetest.get_node(dst_pos)
|
local dst_node = minetest.get_node(dst_pos)
|
||||||
local registered_inventories = hopper.get_registered(dst_node.name)
|
local registered_inventories = hopper.get_registered(dst_node.name)
|
||||||
|
|
||||||
if registered_inventories ~= nil then
|
if registered_inventories ~= nil then
|
||||||
return hopper.send_item_to(pos, dst_pos, dst_node, registered_inventories[output_dir], filter_items)
|
return hopper.send_item_to(pos, dst_pos, dst_node, registered_inventories[output_dir], filter_items_map)
|
||||||
end
|
end
|
||||||
|
|
||||||
return hopper.send_item_to(pos, dst_pos, dst_node, nil, filter_items)
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
if not try_send_item(filter_output_direction, filter_destination_pos) then
|
if not try_send_item(filter_output_direction, filter_destination_pos, filter_items) then
|
||||||
-- weren't able to put something in the filter destination, for whatever reason.
|
-- weren't able to put something in the filter destination, for whatever reason.
|
||||||
-- Now we can start moving stuff forward to the default.
|
-- Now we can start moving stuff forward to the default.
|
||||||
try_send_item(default_output_direction, default_destination_pos)
|
if not try_send_item(default_output_direction, default_destination_pos) then
|
||||||
|
hopper.try_eject_item(pos, default_destination_pos)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if not inv:is_empty("main") then
|
if not inv:is_empty("main") then
|
||||||
|
75
utility.lua
75
utility.lua
@ -108,45 +108,56 @@ hopper.take_item_from = function(hopper_pos, target_pos, target_node, target_inv
|
|||||||
if target_inv:is_empty(target_inv_name) == false then
|
if target_inv:is_empty(target_inv_name) == false then
|
||||||
for i = 1,target_inv_size do
|
for i = 1,target_inv_size do
|
||||||
local stack = target_inv:get_stack(target_inv_name, i)
|
local stack = target_inv:get_stack(target_inv_name, i)
|
||||||
local item = stack:get_name()
|
|
||||||
if item ~= "" then
|
if not stack:is_empty() and hopper_inv:room_for_item("main", stack:get_name()) then
|
||||||
if hopper_inv:room_for_item("main", item) then
|
local stack_to_take = stack:take_item(1)
|
||||||
local stack_to_take = stack:take_item(1)
|
|
||||||
if target_def.allow_metadata_inventory_take == nil
|
if target_def.allow_metadata_inventory_take == nil
|
||||||
or placer == nil -- backwards compatibility, older versions of this mod didn't record who placed the hopper
|
or placer == nil -- backwards compatibility, older versions of this mod didn't record who placed the hopper
|
||||||
or target_def.allow_metadata_inventory_take(target_pos, target_inv_name, i, stack_to_take, placer) > 0 then
|
or target_def.allow_metadata_inventory_take(target_pos, target_inv_name, i, stack_to_take, placer) > 0 then
|
||||||
target_inv:set_stack(target_inv_name, i, stack)
|
|
||||||
--add to hopper
|
target_inv:set_stack(target_inv_name, i, stack)
|
||||||
hopper_inv:add_item("main", stack_to_take)
|
--add to hopper
|
||||||
if target_def.on_metadata_inventory_take ~= nil and placer ~= nil then
|
hopper_inv:add_item("main", stack_to_take)
|
||||||
target_def.on_metadata_inventory_take(target_pos, target_inv_name, i, stack_to_take, placer)
|
if target_def.on_metadata_inventory_take ~= nil and placer ~= nil then
|
||||||
end
|
target_def.on_metadata_inventory_take(target_pos, target_inv_name, i, stack_to_take, placer)
|
||||||
break
|
|
||||||
end
|
end
|
||||||
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
end -- for
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function send_item_to_air(hopper_inv, target_pos, filtered_items)
|
local function try_send_item_to_air(hopper_inv, target_pos)
|
||||||
local stack
|
local stack
|
||||||
local stack_num
|
local stack_num
|
||||||
for i = 1, hopper_inv:get_size("main") do
|
for i = 1, hopper_inv:get_size("main") do
|
||||||
stack = hopper_inv:get_stack("main", i)
|
stack = hopper_inv:get_stack("main", i)
|
||||||
local item = stack:get_name()
|
if not stack:is_empty() then
|
||||||
if item ~= "" and (filtered_items == nil or filtered_items[item]) then
|
|
||||||
stack_num = i
|
stack_num = i
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if not stack_num then
|
|
||||||
return false
|
local eject_node = minetest.get_node(target_pos)
|
||||||
|
local ndef = minetest.registered_nodes[eject_node.name]
|
||||||
|
if not ndef or not ndef.buildable_to then
|
||||||
|
minetest.log("verbose", "hopper.try_send_item_to_air: eject direction not buildable ("
|
||||||
|
..eject_node.name.." at "..target_pos:to_string().."). Looking for alternate.")
|
||||||
|
local air_pos = minetest.find_node_near(target_pos, 2, {"air"})
|
||||||
|
if not air_pos then
|
||||||
|
minetest.log("warning", "hopper.try_send_item_to_air: could not find an air node nearby")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
target_pos = air_pos
|
||||||
end
|
end
|
||||||
|
|
||||||
local stack_to_put = stack:take_item(1)
|
local stack_to_put = stack:take_item(1)
|
||||||
minetest.add_item(target_pos, stack_to_put)
|
minetest.add_item(target_pos, stack_to_put)
|
||||||
hopper_inv:set_stack("main", stack_num, stack)
|
hopper_inv:set_stack("main", stack_num, stack)
|
||||||
|
hopper.log_inventory("hopper ejecting "..stack:get_name().." as object to "..target_pos:to_string())
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -204,10 +215,24 @@ hopper.send_item_to = function(hopper_pos, target_pos, target_node, target_inv_i
|
|||||||
return send_item_to_inv(hopper_inv, target_pos, filtered_items, placer, target_inv_info, target_def)
|
return send_item_to_inv(hopper_inv, target_pos, filtered_items, placer, target_inv_info, target_def)
|
||||||
end
|
end
|
||||||
|
|
||||||
if hopper.config.eject_button_enabled and target_def.buildable_to
|
|
||||||
and hopper_meta:get_string("eject") == "true" then
|
|
||||||
return send_item_to_air(hopper_inv, target_pos, filtered_items)
|
|
||||||
end
|
|
||||||
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
hopper.try_eject_item = function(hopper_pos, target_pos)
|
||||||
|
if not hopper.config.eject_button_enabled then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local hopper_meta = minetest.get_meta(hopper_pos)
|
||||||
|
if hopper_meta:get_string("eject") ~= "true" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local hopper_inv = hopper_meta:get_inventory()
|
||||||
|
if hopper_inv:is_empty("main") then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
return try_send_item_to_air(hopper_inv, target_pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user