forked from MineClone5/MineClone5
#375 Use single ABM for all hopper logic, fix hopper model, clean up hopper code
This commit is contained in:
parent
e80f95710d
commit
ee5d45152d
|
@ -1,13 +0,0 @@
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
Version 2, December 2004
|
|
||||||
|
|
||||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim or modified
|
|
||||||
copies of this license document, and changing it is allowed as long
|
|
||||||
as the name is changed.
|
|
||||||
|
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
|
|
@ -1,5 +0,0 @@
|
||||||
# Hoppers
|
|
||||||
This is the Hoppers mod for Minetest. It's just a clone of Minecraft hoppers, functions nearly identical to them minus mesecons making them stop and the way they're placed.
|
|
||||||
|
|
||||||
## Forum Topic
|
|
||||||
- https://forum.minetest.net/viewtopic.php?f=11&t=12379
|
|
|
@ -1,14 +1,25 @@
|
||||||
local S = minetest.get_translator(minetest.get_current_modname())
|
local S = minetest.get_translator(minetest.get_current_modname())
|
||||||
|
|
||||||
local minetest_get_item_group = minetest.get_item_group
|
|
||||||
local minetest_registered_items = minetest.registered_items
|
|
||||||
local minetest_get_node = minetest.get_node
|
|
||||||
local minetest_get_meta = minetest.get_meta
|
|
||||||
local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius
|
|
||||||
local math_abs = math.abs
|
local math_abs = math.abs
|
||||||
|
local minetest_facedir_to_dir = minetest.facedir_to_dir
|
||||||
|
local minetest_get_inventory = minetest.get_inventory
|
||||||
|
local minetest_get_item_group = minetest.get_item_group
|
||||||
|
local minetest_get_meta = minetest.get_meta
|
||||||
|
local minetest_get_node = minetest.get_node
|
||||||
|
local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius
|
||||||
|
local minetest_registered_nodes = minetest.registered_nodes
|
||||||
|
|
||||||
--[[ BEGIN OF NODE DEFINITIONS ]]
|
local HOPPER = "mcl_hoppers:hopper"
|
||||||
|
local HOPPER_SIDE = "mcl_hoppers:hopper_side"
|
||||||
|
local GROUPS_TO_PUT_INTO_COMMON_SLOT = {
|
||||||
|
[2] = true,
|
||||||
|
[3] = true,
|
||||||
|
[5] = true,
|
||||||
|
[6] = true,
|
||||||
|
}
|
||||||
|
local GROUPS_TO_PUT_INTO_FUEL_SLOT = {
|
||||||
|
[4] = true,
|
||||||
|
}
|
||||||
local mcl_hoppers_formspec =
|
local mcl_hoppers_formspec =
|
||||||
"size[9,7]"..
|
"size[9,7]"..
|
||||||
"label[2,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Hopper"))).."]"..
|
"label[2,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Hopper"))).."]"..
|
||||||
|
@ -30,31 +41,37 @@ local def_hopper = {
|
||||||
groups = {pickaxey=1, container=2,deco_block=1,hopper=1},
|
groups = {pickaxey=1, container=2,deco_block=1,hopper=1},
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
-- FIXME: mcl_hoppers_hopper_inside.png is unused by hoppers.
|
tiles = {
|
||||||
tiles = {"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png"},
|
"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png"
|
||||||
|
},
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
--funnel walls
|
--funnel walls
|
||||||
{-0.5, 0.0, 0.4, 0.5, 0.5, 0.5},
|
{-0.5, 0.0, 0.4, 0.5, 0.5, 0.5,},
|
||||||
{0.4, 0.0, -0.5, 0.5, 0.5, 0.5},
|
{ 0.4, 0.0, -0.5, 0.5, 0.5, 0.5,},
|
||||||
{-0.5, 0.0, -0.5, -0.4, 0.5, 0.5},
|
{-0.5, 0.0, -0.5, -0.4, 0.5, 0.5,},
|
||||||
{-0.5, 0.0, -0.5, 0.5, 0.5, -0.4},
|
{-0.5, 0.0, -0.5, 0.5, 0.5, -0.4,},
|
||||||
--funnel base
|
--funnel base
|
||||||
{-0.5, 0.0, -0.5, 0.5, 0.1, 0.5},
|
{-0.5, 0.0, -0.5, 0.5, 0.1, 0.5,},
|
||||||
--spout
|
--spout
|
||||||
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3},
|
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3,},
|
||||||
{-0.1, -0.3, -0.1, 0.1, -0.5, 0.1},
|
{-0.1, -0.3, -0.1, 0.1, -0.5, 0.1,},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
--funnel
|
--funnel
|
||||||
{-0.5, 0.0, -0.5, 0.5, 0.5, 0.5},
|
{-0.5, 0.0, -0.5, 0.5, 0.5, 0.5,},
|
||||||
--spout
|
--spout
|
||||||
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3},
|
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3,},
|
||||||
{-0.1, -0.3, -0.1, 0.1, -0.5, 0.1},
|
{-0.1, -0.3, -0.1, 0.1, -0.5, 0.1,},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
|
@ -125,10 +142,8 @@ local def_hopper = {
|
||||||
_mcl_hardness = 3,
|
_mcl_hardness = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
-- Redstone variants (on/off) of downwards hopper.
|
|
||||||
-- Note a hopper is enabled when it is *not* supplied with redstone power and disabled when it is supplied with redstone power.
|
|
||||||
|
|
||||||
-- Enabled downwards hopper
|
-- Enabled downwards hopper
|
||||||
|
|
||||||
local def_hopper_enabled = table.copy(def_hopper)
|
local def_hopper_enabled = table.copy(def_hopper)
|
||||||
def_hopper_enabled.description = S("Hopper")
|
def_hopper_enabled.description = S("Hopper")
|
||||||
def_hopper_enabled._tt_help = S("5 inventory slots").."\n"..S("Collects items from above, moves items to container below").."\n"..S("Can be disabled with redstone power")
|
def_hopper_enabled._tt_help = S("5 inventory slots").."\n"..S("Collects items from above, moves items to container below").."\n"..S("Can be disabled with redstone power")
|
||||||
|
@ -146,7 +161,7 @@ def_hopper_enabled.on_place = function(itemstack, placer, pointed_thing)
|
||||||
local apos = pointed_thing.above
|
local apos = pointed_thing.above
|
||||||
|
|
||||||
local uposnode = minetest_get_node(upos)
|
local uposnode = minetest_get_node(upos)
|
||||||
local uposnodedef = minetest.registered_nodes[uposnode.name]
|
local uposnodedef = minetest_registered_nodes[uposnode.name]
|
||||||
if not uposnodedef then return itemstack end
|
if not uposnodedef then return itemstack end
|
||||||
-- Use pointed node's on_rightclick function first, if present
|
-- Use pointed node's on_rightclick function first, if present
|
||||||
if placer and not placer:get_player_control().sneak then
|
if placer and not placer:get_player_control().sneak then
|
||||||
|
@ -155,26 +170,16 @@ def_hopper_enabled.on_place = function(itemstack, placer, pointed_thing)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local x = upos.x - apos.x
|
|
||||||
local z = upos.z - apos.z
|
|
||||||
|
|
||||||
local fake_itemstack = ItemStack(itemstack)
|
local fake_itemstack = ItemStack(itemstack)
|
||||||
|
local dx = apos.x - upos.x
|
||||||
|
local dz = apos.z - upos.z
|
||||||
local param2
|
local param2
|
||||||
if x == -1 then
|
if (dx ~= 0) or (dz ~= 0) then
|
||||||
fake_itemstack:set_name("mcl_hoppers:hopper_side")
|
param2 = minetest.dir_to_facedir({x = dx, y = 0, z = dz})
|
||||||
param2 = 0
|
fake_itemstack:set_name(HOPPER_SIDE)
|
||||||
elseif x == 1 then
|
|
||||||
fake_itemstack:set_name("mcl_hoppers:hopper_side")
|
|
||||||
param2 = 2
|
|
||||||
elseif z == -1 then
|
|
||||||
fake_itemstack:set_name("mcl_hoppers:hopper_side")
|
|
||||||
param2 = 3
|
|
||||||
elseif z == 1 then
|
|
||||||
fake_itemstack:set_name("mcl_hoppers:hopper_side")
|
|
||||||
param2 = 1
|
|
||||||
end
|
end
|
||||||
local itemstack,_ = minetest.item_place_node(fake_itemstack, placer, pointed_thing, param2)
|
local itemstack, _ = minetest.item_place_node(fake_itemstack, placer, pointed_thing, param2)
|
||||||
itemstack:set_name("mcl_hoppers:hopper")
|
itemstack:set_name(HOPPER)
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
def_hopper_enabled.mesecons = {
|
def_hopper_enabled.mesecons = {
|
||||||
|
@ -185,64 +190,71 @@ def_hopper_enabled.mesecons = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
minetest.register_node("mcl_hoppers:hopper", def_hopper_enabled)
|
minetest.register_node(HOPPER, def_hopper_enabled)
|
||||||
|
|
||||||
-- Disabled downwards hopper
|
-- Disabled downwards hopper
|
||||||
|
|
||||||
local def_hopper_disabled = table.copy(def_hopper)
|
local def_hopper_disabled = table.copy(def_hopper)
|
||||||
def_hopper_disabled.description = S("Disabled Hopper")
|
def_hopper_disabled.description = S("Disabled Hopper")
|
||||||
def_hopper_disabled.inventory_image = nil
|
def_hopper_disabled.inventory_image = nil
|
||||||
def_hopper_disabled._doc_items_create_entry = false
|
def_hopper_disabled._doc_items_create_entry = false
|
||||||
def_hopper_disabled.groups.not_in_creative_inventory = 1
|
def_hopper_disabled.groups.not_in_creative_inventory = 1
|
||||||
def_hopper_disabled.drop = "mcl_hoppers:hopper"
|
def_hopper_disabled.drop = HOPPER
|
||||||
def_hopper_disabled.mesecons = {
|
def_hopper_disabled.mesecons = {
|
||||||
effector = {
|
effector = {
|
||||||
action_off = function(pos, node)
|
action_off = function(pos, node)
|
||||||
minetest.swap_node(pos, {name="mcl_hoppers:hopper", param2=node.param2})
|
minetest.swap_node(pos, {name=HOPPER, param2=node.param2})
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
minetest.register_node("mcl_hoppers:hopper_disabled", def_hopper_disabled)
|
minetest.register_node("mcl_hoppers:hopper_disabled", def_hopper_disabled)
|
||||||
|
|
||||||
|
-- Sidewadrs hopper (base definition)
|
||||||
|
|
||||||
|
|
||||||
local on_rotate
|
|
||||||
if minetest.get_modpath("screwdriver") then
|
|
||||||
on_rotate = screwdriver.rotate_simple
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Sidewars hopper (base definition)
|
|
||||||
local def_hopper_side = {
|
local def_hopper_side = {
|
||||||
_doc_items_create_entry = false,
|
_doc_items_create_entry = false,
|
||||||
drop = "mcl_hoppers:hopper",
|
drop = HOPPER,
|
||||||
groups = {pickaxey=1, container=2,not_in_creative_inventory=1,hopper=2},
|
groups = {
|
||||||
|
container = 2,
|
||||||
|
hopper = 2,
|
||||||
|
not_in_creative_inventory = 1,
|
||||||
|
pickaxey = 1,
|
||||||
|
},
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
tiles = {"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png", "mcl_hoppers_hopper_outside.png"},
|
tiles = {
|
||||||
|
"mcl_hoppers_hopper_inside.png^mcl_hoppers_hopper_top.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
"mcl_hoppers_hopper_outside.png",
|
||||||
|
},
|
||||||
node_box = {
|
node_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
--funnel walls
|
--funnel walls
|
||||||
{-0.5, 0.0, 0.4, 0.5, 0.5, 0.5},
|
{-0.5, 0.0, 0.4, 0.5, 0.5, 0.5,},
|
||||||
{0.4, 0.0, -0.5, 0.5, 0.5, 0.5},
|
{ 0.4, 0.0, -0.5, 0.5, 0.5, 0.5,},
|
||||||
{-0.5, 0.0, -0.5, -0.4, 0.5, 0.5},
|
{-0.5, 0.0, -0.5, -0.4, 0.5, 0.5,},
|
||||||
{-0.5, 0.0, -0.5, 0.5, 0.5, -0.4},
|
{-0.5, 0.0, -0.5, 0.5, 0.5, -0.4,},
|
||||||
--funnel base
|
--funnel base
|
||||||
{-0.5, 0.0, -0.5, 0.5, 0.1, 0.5},
|
{-0.5, 0.0, -0.5, 0.5, 0.1, 0.5,},
|
||||||
--spout
|
--spout
|
||||||
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3},
|
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3,},
|
||||||
{-0.5, -0.3, -0.1, 0.1, -0.1, 0.1},
|
{-0.1, -0.3, -0.5, 0.1, -0.1, 0.1,},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = {
|
fixed = {
|
||||||
--funnel
|
--funnel
|
||||||
{-0.5, 0.0, -0.5, 0.5, 0.5, 0.5},
|
{-0.5, 0.0, -0.5, 0.5, 0.5, 0.5,},
|
||||||
--spout
|
--spout
|
||||||
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3},
|
{-0.3, -0.3, -0.3, 0.3, 0.0, 0.3,},
|
||||||
{-0.5, -0.3, -0.1, 0.1, -0.1, 0.1},
|
{-0.1, -0.3, -0.5, 0.1, -0.1, 0.1,},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
|
@ -307,13 +319,15 @@ local def_hopper_side = {
|
||||||
minetest.log("action", player:get_player_name()..
|
minetest.log("action", player:get_player_name()..
|
||||||
" takes stuff from mcl_hoppers at "..minetest.pos_to_string(pos))
|
" takes stuff from mcl_hoppers at "..minetest.pos_to_string(pos))
|
||||||
end,
|
end,
|
||||||
on_rotate = on_rotate,
|
on_rotate = screwdriver.rotate_simple,
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
|
|
||||||
_mcl_blast_resistance = 4.8,
|
_mcl_blast_resistance = 4.8,
|
||||||
_mcl_hardness = 3,
|
_mcl_hardness = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- Enabled sidewards hopper
|
||||||
|
|
||||||
local def_hopper_side_enabled = table.copy(def_hopper_side)
|
local def_hopper_side_enabled = table.copy(def_hopper_side)
|
||||||
def_hopper_side_enabled.description = S("Side Hopper")
|
def_hopper_side_enabled.description = S("Side Hopper")
|
||||||
def_hopper_side_enabled.mesecons = {
|
def_hopper_side_enabled.mesecons = {
|
||||||
|
@ -323,24 +337,26 @@ def_hopper_side_enabled.mesecons = {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
minetest.register_node("mcl_hoppers:hopper_side", def_hopper_side_enabled)
|
minetest.register_node(HOPPER_SIDE, def_hopper_side_enabled)
|
||||||
|
|
||||||
|
-- Disabled sidewards hopper
|
||||||
|
|
||||||
local def_hopper_side_disabled = table.copy(def_hopper_side)
|
local def_hopper_side_disabled = table.copy(def_hopper_side)
|
||||||
def_hopper_side_disabled.description = S("Disabled Side Hopper")
|
def_hopper_side_disabled.description = S("Disabled Side Hopper")
|
||||||
def_hopper_side_disabled.mesecons = {
|
def_hopper_side_disabled.mesecons = {
|
||||||
effector = {
|
effector = {
|
||||||
action_off = function(pos, node)
|
action_off = function(pos, node)
|
||||||
minetest.swap_node(pos, {name="mcl_hoppers:hopper_side", param2=node.param2})
|
minetest.swap_node(pos, {name=HOPPER_SIDE, param2=node.param2})
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
minetest.register_node("mcl_hoppers:hopper_side_disabled", def_hopper_side_disabled)
|
minetest.register_node("mcl_hoppers:hopper_side_disabled", def_hopper_side_disabled)
|
||||||
|
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
label = "Hoppers suck in dropped items",
|
label = "Hopper",
|
||||||
nodenames = {
|
nodenames = {
|
||||||
"mcl_hoppers:hopper",
|
HOPPER,
|
||||||
"mcl_hoppers:hopper_side",
|
HOPPER_SIDE,
|
||||||
},
|
},
|
||||||
interval = 1,
|
interval = 1,
|
||||||
chance = 1,
|
chance = 1,
|
||||||
|
@ -349,13 +365,56 @@ minetest.register_abm({
|
||||||
local meta = minetest_get_meta(pos)
|
local meta = minetest_get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
if not inv then return end
|
if not inv then return end
|
||||||
local x, y, z = pos.x, pos.y, pos.z
|
|
||||||
local y_above = y + 1
|
|
||||||
|
|
||||||
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
|
|
||||||
|
-- Move an item from the hopper into the container to which the hopper points to
|
||||||
|
local dst_pos
|
||||||
|
if node.name == HOPPER then
|
||||||
|
dst_pos = {x = x, y = y - 1, z = z}
|
||||||
|
else
|
||||||
|
local param2 = node.param2
|
||||||
|
local dir = minetest_facedir_to_dir(param2)
|
||||||
|
if not dir then return end
|
||||||
|
dst_pos = {x = x - dir.x, y = y, z = z - dir.z}
|
||||||
|
end
|
||||||
|
local dst_node = minetest_get_node(dst_pos)
|
||||||
|
local dst_node_name = dst_node.name
|
||||||
|
local dst_container_group = minetest_get_item_group(dst_node_name, "container")
|
||||||
|
if GROUPS_TO_PUT_INTO_COMMON_SLOT[dst_container_group] then
|
||||||
|
mcl_util.move_item_container(pos, dst_pos)
|
||||||
|
elseif GROUPS_TO_PUT_INTO_FUEL_SLOT[dst_container_group] then
|
||||||
|
local sinv = minetest_get_inventory({type="node", pos = pos})
|
||||||
|
local dinv = minetest_get_inventory({type="node", pos = dst_pos})
|
||||||
|
local slot_id,_ = mcl_util.get_eligible_transfer_item_slot(
|
||||||
|
sinv,
|
||||||
|
"main",
|
||||||
|
dinv,
|
||||||
|
"fuel",
|
||||||
|
function(itemstack, src_inventory, src_list, dst_inventory, dst_list)
|
||||||
|
-- Returns true if itemstack is fuel, but not for lava bucket if destination already has one
|
||||||
|
if not mcl_util.is_fuel(itemstack) then return false end
|
||||||
|
if itemstack:get_name() ~= "mcl_buckets:bucket_lava" then return true end
|
||||||
|
return dst_inventory:is_empty(dst_list)
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
local y_above = y + 1
|
||||||
local pos_above = {x = x, y = y_above, z = z}
|
local pos_above = {x = x, y = y_above, z = z}
|
||||||
local above_node = minetest_get_node(pos_above)
|
local above_node = minetest_get_node(pos_above)
|
||||||
local above_node_name = above_node.name
|
local above_node_name = above_node.name
|
||||||
if minetest_registered_items[above_node_name] and minetest_get_item_group(above_node_name, "container") == 0 then
|
local above_container_group = minetest_get_item_group(above_node_name, "container")
|
||||||
|
if above_container_group ~= 0 then
|
||||||
|
-- Suck an item from the container above into the hopper
|
||||||
|
if not mcl_util.move_item_container(pos_above, pos)
|
||||||
|
and above_container_group == 4 then
|
||||||
|
local finv = minetest_get_inventory({type="node", pos = pos_above})
|
||||||
|
if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then
|
||||||
|
mcl_util.move_item_container(pos_above, pos, "fuel")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
-- Suck in dropped items
|
-- Suck in dropped items
|
||||||
local y_top_touch_to_suck = y_above + 0.5
|
local y_top_touch_to_suck = y_above + 0.5
|
||||||
for _, object in pairs(minetest_get_objects_inside_radius(pos_above, 1)) do
|
for _, object in pairs(minetest_get_objects_inside_radius(pos_above, 1)) do
|
||||||
|
@ -365,9 +424,6 @@ minetest.register_abm({
|
||||||
if entity_name == "__builtin:item" then
|
if entity_name == "__builtin:item" then
|
||||||
local itemstring = entity.itemstring
|
local itemstring = entity.itemstring
|
||||||
if itemstring and itemstring ~= "" and inv:room_for_item("main", ItemStack(itemstring)) then
|
if itemstring and itemstring ~= "" and inv:room_for_item("main", ItemStack(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.
|
|
||||||
-- Test: Items on farmland and slabs get sucked, but items on full blocks don't
|
|
||||||
local object_pos = object:get_pos()
|
local object_pos = object:get_pos()
|
||||||
local object_pos_y = object_pos.y
|
local object_pos_y = object_pos.y
|
||||||
local object_collisionbox = object:get_properties().collisionbox
|
local object_collisionbox = object:get_properties().collisionbox
|
||||||
|
@ -387,117 +443,8 @@ minetest.register_abm({
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Returns true if itemstack is fuel, but not for lava bucket if destination already has one
|
|
||||||
local is_transferrable_fuel = function(itemstack, src_inventory, src_list, dst_inventory, dst_list)
|
|
||||||
if mcl_util.is_fuel(itemstack) then
|
|
||||||
if itemstack:get_name() == "mcl_buckets:bucket_lava" then
|
|
||||||
return dst_inventory:is_empty(dst_list)
|
|
||||||
else
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
else
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
label = "Hopper/container item exchange",
|
|
||||||
nodenames = {"mcl_hoppers:hopper"},
|
|
||||||
neighbors = {"group:container"},
|
|
||||||
interval = 1.0,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos, node)
|
|
||||||
-- Get node pos' for item transfer
|
|
||||||
local uppos = {x=pos.x,y=pos.y+1,z=pos.z}
|
|
||||||
local downpos = {x=pos.x,y=pos.y-1,z=pos.z}
|
|
||||||
|
|
||||||
-- 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_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
|
|
||||||
if not sucked and g == 4 then
|
|
||||||
local finv = minetest.get_inventory({type="node", pos=uppos})
|
|
||||||
if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then
|
|
||||||
mcl_util.move_item_container(uppos, pos, "fuel")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Move an item from the hopper into container below
|
|
||||||
local downnode = minetest_get_node(downpos)
|
|
||||||
if not minetest.registered_nodes[downnode.name] then return end
|
|
||||||
mcl_util.move_item_container(pos, downpos)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_abm({
|
|
||||||
label = "Side-hopper/container item exchange",
|
|
||||||
nodenames = {"mcl_hoppers:hopper_side"},
|
|
||||||
neighbors = {"group:container"},
|
|
||||||
interval = 1.0,
|
|
||||||
chance = 1,
|
|
||||||
action = function(pos, node)
|
|
||||||
-- Determine to which side the hopper is facing, get nodes
|
|
||||||
local face = minetest_get_node(pos).param2
|
|
||||||
local front = {}
|
|
||||||
if face == 0 then
|
|
||||||
front = {x=pos.x-1,y=pos.y,z=pos.z}
|
|
||||||
elseif face == 1 then
|
|
||||||
front = {x=pos.x,y=pos.y,z=pos.z+1}
|
|
||||||
elseif face == 2 then
|
|
||||||
front = {x=pos.x+1,y=pos.y,z=pos.z}
|
|
||||||
elseif face == 3 then
|
|
||||||
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
|
|
||||||
|
|
||||||
-- 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_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
|
|
||||||
if not sucked and g == 4 then
|
|
||||||
local finv = minetest.get_inventory({type="node", pos=above})
|
|
||||||
if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then
|
|
||||||
mcl_util.move_item_container(above, pos, "fuel")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Try to move an item below before moving it sideways
|
|
||||||
local downnode = minetest_get_node(downpos)
|
|
||||||
|
|
||||||
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 = minetest_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
|
|
||||||
-- Put fuel into fuel slot
|
|
||||||
local sinv = minetest.get_inventory({type="node", pos = pos})
|
|
||||||
local dinv = minetest.get_inventory({type="node", pos = front})
|
|
||||||
local slot_id,_ = mcl_util.get_eligible_transfer_item_slot(sinv, "main", dinv, "fuel", is_transferrable_fuel)
|
|
||||||
if slot_id then
|
|
||||||
mcl_util.move_item_container(pos, front, nil, slot_id, "fuel")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "mcl_hoppers:hopper",
|
output = HOPPER,
|
||||||
recipe = {
|
recipe = {
|
||||||
{"mcl_core:iron_ingot","","mcl_core:iron_ingot"},
|
{"mcl_core:iron_ingot","","mcl_core:iron_ingot"},
|
||||||
{"mcl_core:iron_ingot","mcl_chests:chest","mcl_core:iron_ingot"},
|
{"mcl_core:iron_ingot","mcl_chests:chest","mcl_core:iron_ingot"},
|
||||||
|
@ -505,14 +452,10 @@ minetest.register_craft({
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Add entry aliases for the Help
|
|
||||||
if minetest.get_modpath("doc") then
|
if minetest.get_modpath("doc") then
|
||||||
doc.add_entry_alias("nodes", "mcl_hoppers:hopper", "nodes", "mcl_hoppers:hopper_side")
|
doc.add_entry_alias("nodes", HOPPER, "nodes", HOPPER_SIDE)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Legacy
|
|
||||||
minetest.register_alias("mcl_hoppers:hopper_item", "mcl_hoppers:hopper")
|
|
||||||
|
|
||||||
minetest.register_lbm({
|
minetest.register_lbm({
|
||||||
label = "Update hopper formspecs (0.60.0",
|
label = "Update hopper formspecs (0.60.0",
|
||||||
name = "mcl_hoppers:update_formspec_0_60_0",
|
name = "mcl_hoppers:update_formspec_0_60_0",
|
||||||
|
@ -523,3 +466,6 @@ minetest.register_lbm({
|
||||||
meta:set_string("formspec", mcl_hoppers_formspec)
|
meta:set_string("formspec", mcl_hoppers_formspec)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Legacy
|
||||||
|
minetest.register_alias("mcl_hoppers:hopper_item", HOPPER)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
name = mcl_hoppers
|
name = mcl_hoppers
|
||||||
|
author = jordan4ibanez
|
||||||
description = It's just a clone of Minecraft hoppers, functions nearly identical to them minus mesecons making them stop and the way they're placed.
|
description = It's just a clone of Minecraft hoppers, functions nearly identical to them minus mesecons making them stop and the way they're placed.
|
||||||
depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util
|
depends = mcl_core, mcl_formspec, mcl_sounds, mcl_util
|
||||||
optional_depends = doc, screwdriver
|
optional_depends = doc, screwdriver
|
||||||
|
|
Loading…
Reference in New Issue