From 014da42d6fa20e799dc3ac5b345fa36bacd8ba4f Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Wed, 25 Jan 2017 20:24:18 +0000 Subject: [PATCH 1/5] side hopper now appears on placement --- init.lua | 49 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/init.lua b/init.lua index bcd1011..55f47da 100644 --- a/init.lua +++ b/init.lua @@ -48,6 +48,36 @@ minetest.register_node("hopper:hopper", { inv:set_size("main", 4*4) end, + on_place = function(itemstack, placer, pointed_thing) + + local pos = pointed_thing.under + local pos2 = pointed_thing.above + local x = pos.x - pos2.x + local z = pos.z - pos2.z + + if x == -1 then + minetest.set_node(pos2, {name = "hopper:hopper_side", param2 = 0}) + + elseif x == 1 then + minetest.set_node(pos2, {name = "hopper:hopper_side", param2 = 2}) + + elseif z == -1 then + minetest.set_node(pos2, {name = "hopper:hopper_side", param2 = 3}) + + elseif z == 1 then + minetest.set_node(pos2, {name = "hopper:hopper_side", param2 = 1}) + + else + minetest.set_node(pos2, {name = "hopper:hopper"}) + end + + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + + return itemstack + end, + can_dig = function(pos, player) local inv = minetest.get_meta(pos):get_inventory() @@ -92,7 +122,7 @@ minetest.register_node("hopper:hopper", { -- side hopper minetest.register_node("hopper:hopper_side", { description = "Side Hopper", - groups = {cracky = 3}, + groups = {cracky = 3, not_in_creative_inventory = 1}, drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", @@ -101,6 +131,7 @@ minetest.register_node("hopper:hopper_side", { "hopper_side.png", "hopper_back.png", "hopper_back.png" }, inventory_image = "hopper_side_inv.png", + drop = "hopper:hopper", node_box = { type = "fixed", fixed = { @@ -360,22 +391,6 @@ minetest.register_craft({ }, }) --- hopper to side hopper recipe -minetest.register_craft({ - output = "hopper:hopper", - recipe = { - {"hopper:hopper_side"}, - }, -}) - --- side hopper back to hopper recipe -minetest.register_craft({ - output = "hopper:hopper_side", - recipe = { - {"hopper:hopper"}, - }, -}) - -- add lucky blocks -- Hopper mod From 7cddb3a12442046e3a948dc942cc6a9d2f6786b5 Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Thu, 26 Jan 2017 16:34:15 +0000 Subject: [PATCH 2/5] Added simple API to expand hopper usage --- README.md | 1 + api.txt | 34 +++++++++++ init.lua | 165 ++++++++++++++++++++++++++++++++++-------------------- 3 files changed, 138 insertions(+), 62 deletions(-) create mode 100644 api.txt diff --git a/README.md b/README.md index ded99e2..32d2e0b 100644 --- a/README.md +++ b/README.md @@ -17,5 +17,6 @@ Change log: - 0.9 - Added support for Wine mod's wine barrels - 1.0 - New furances do not work properly with hoppers so old reverted to abm furnaces - 1.1 - Hoppers now work with new node timer Furnaces. Reduced Abm's and tidied code. +- 1.2 - Added simple API so that hoppers can work with other containers. Lucky Blocks: 2 diff --git a/api.txt b/api.txt new file mode 100644 index 0000000..2d05099 --- /dev/null +++ b/api.txt @@ -0,0 +1,34 @@ + +Hopper API +---------- + +This API is kept simple by adding a single command which allows mods to add +containers like chests and furnaces to the hopper check list. + + +Command Usage +------------- + +Make sure any mods using this function has 'hopper' in the depends.txt file. + +hopper:add_container({ {"where_from", "node_name", "inventory_name"} }) + + 'where_from' is a string telling the api that items are coming from either + the 'top', going to the 'bottom' or coming from the 'side'. + + 'node_name" is the name of the container itself (e.g. "default:chest") + + 'inventory_name' is the name of the container inventory that is affected. + +e.g. + +hopper:add_container({ + {"top", "default:furnace", "dst"}, -- take cooked items into hopper + {"bottom", "default:furnace", "src"}, -- insert items to be cooked from hopper + {"side", "default:furnace", "fuel"}, -- replenish furnace fuel from hopper +}) + + +We already have support for the wine barrel inside of the Wine mod and protected +chests inside of Protector Redo, as well as default chests, furnaces and hoppers +themselves. diff --git a/init.lua b/init.lua index 55f47da..c7823be 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,60 @@ +-- define global +hopper = {} + + +-- default containers ( from position [into hopper], from node, into node inventory ) +local containers = { + + {"top", "hopper:hopper", "main"}, + {"bottom", "hopper:hopper", "main"}, + {"side", "hopper:hopper", "main"}, + {"side", "hopper:hopper_side", "main"}, + + {"top", "default:chest", "main"}, + {"bottom", "default:chest", "main"}, + {"side", "default:chest", "main"}, + + {"top", "default:furnace", "dst"}, + {"bottom", "default:furnace", "src"}, + {"side", "default:furnace", "fuel"}, + + {"top", "default:furnace_active", "dst"}, + {"bottom", "default:furnace_active", "src"}, + {"side", "default:furnace_active", "fuel"}, +} + +-- global function to add new containers +function hopper:add_container(list) + + for n = 1, #list do + table.insert(containers, list[n]) + end +end + + +-- protector redo mod support +if minetest.get_modpath("protector") then + + hopper:add_container({ + {"top", "protector:chest", "main"}, + {"bottom", "protector:chest", "main"}, + {"side", "protector:chest", "main"}, + }) +end + + +-- wine mod support +if minetest.get_modpath("wine") then + + hopper:add_container({ + {"top", "wine:wine_barrel", "dst"}, + {"bottom", "wine:wine_barrel", "src"}, + {"side", "wine:wine_barrel", "src"}, + }) +end + + -- formspec local function get_hopper_formspec(pos) @@ -17,6 +73,7 @@ local function get_hopper_formspec(pos) return formspec end + -- hopper minetest.register_node("hopper:hopper", { description = "Hopper", @@ -43,7 +100,8 @@ minetest.register_node("hopper:hopper", { on_construct = function(pos) - local inv = minetest.get_meta(pos):get_inventory() + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() inv:set_size("main", 4*4) end, @@ -119,6 +177,7 @@ minetest.register_node("hopper:hopper", { on_rotate = screwdriver.disallow, }) + -- side hopper minetest.register_node("hopper:hopper_side", { description = "Side Hopper", @@ -150,7 +209,8 @@ minetest.register_node("hopper:hopper_side", { on_construct = function(pos) - local inv = minetest.get_meta(pos):get_inventory() + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() inv:set_size("main", 4*4) end, @@ -196,6 +256,7 @@ minetest.register_node("hopper:hopper_side", { on_rotate = screwdriver.rotate_simple, }) + -- suck in items on top of hopper minetest.register_abm({ @@ -236,8 +297,9 @@ minetest.register_abm({ end, }) + -- transfer function -local transfer = function(src, srcpos, dst, dstpos, name) +local transfer = function(src, srcpos, dst, dstpos) -- source inventory local inv = minetest.get_meta(srcpos):get_inventory() @@ -275,28 +337,23 @@ local transfer = function(src, srcpos, dst, dstpos, name) return end end - end + -- hopper workings minetest.register_abm({ label = "Hopper transfer", nodenames = {"hopper:hopper", "hopper:hopper_side"}, - neighbors = { - "default:chest","default:chest_locked","protector:chest", - "hopper:hopper","hopper:hopper_side","default:furnace", - "default:furnace_active", "wine:wine_barrel" - }, interval = 1.0, chance = 1, catch_up = false, action = function(pos, node) - local front = {} + local front - -- if side hopper check which way it's facing + -- if side hopper check which way spout is facing if node.name == "hopper:hopper_side" then local face = minetest.get_node(pos).param2 @@ -320,68 +377,52 @@ minetest.register_abm({ front = {x = pos.x, y = pos.y - 1, z = pos.z} end - -- what is above hopper and on other end of funnel - local a = minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name - local b = minetest.get_node(front).name + -- get node above hopper + local top = minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name - -- funnel input + -- get node at other end of spout + local out = minetest.get_node(front).name - if a == "default:chest" - or a == "default:chest_locked" - or a == "protector:chest" - or a == "hopper:hopper" - or a == "hopper:hopper_side" then + local where, nod, inv, def - transfer("main", { - x = pos.x, - y = pos.y + 1, - z = pos.z - }, "main", pos) + -- do for loop here for api check + for n = 1, #containers do - elseif a == "default:furnace" - or a == "default:furnace_active" - or a == "wine:wine_barrel" then + where = containers[n][1] + nod = containers[n][2] + inv = containers[n][3] - transfer("dst", { - x = pos.x, - y = pos.y + 1, - z = pos.z - }, "main", pos) - end + -- take from top node into hopper + if where == "top" and top == nod + and (node.name == "hopper:hopper" or node.name == "hopper:hopper_side") then +--print ("-- top") + transfer(inv, {x = pos.x, y = pos.y + 1, z = pos.z}, "main", pos) + minetest.get_node_timer( + {x = pos.x, y = pos.y + 1, z = pos.z}):start(0.5) + return - -- spout output + -- take from hopper into bottom node + elseif where == "bottom" and out == nod + and node.name == "hopper:hopper" then +--print ("-- bot") + transfer("main", pos, inv, front) + minetest.get_node_timer(front):start(0.5) + return - if b == "default:chest" - or b == "default:chest_locked" - or b == "protector:chest" - or b == "hopper:hopper" - or b == "hopper:hopper_side" then + -- take from side hopper into node + elseif where == "side" and out == nod + and node.name == "hopper:hopper_side" then +--print ("-- sid") + transfer("main", pos, inv, front) + minetest.get_node_timer(front):start(0.5) + return - transfer("main", pos, "main", front) - - elseif b == "default:furnace" - or b == "default:furnace_active" then - - if node.name == "hopper:hopper" then - -- hopper above to furnace source below - transfer("main", pos, "src", front) - else - -- hopper to furnace fuel beside - transfer("main", pos, "fuel", front) end - - -- re-start furnace timer - minetest.get_node_timer(front):start(0.5)--(1.0) - - elseif b == "wine:wine_barrel" then - - -- hopper to wine source beside - transfer("main", pos, "src", front) end - end, }) + -- hopper recipe minetest.register_craft({ output = "hopper:hopper", @@ -391,9 +432,8 @@ minetest.register_craft({ }, }) --- add lucky blocks --- Hopper mod +-- add lucky blocks if minetest.get_modpath("lucky_block") then lucky_block:add_blocks({ @@ -402,4 +442,5 @@ if minetest.get_modpath("lucky_block") then }) end + print ("[MOD] Hopper loaded") From ea10762e0eec7ff9c5e261d9ee0713643af89268 Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Fri, 27 Jan 2017 13:30:04 +0000 Subject: [PATCH 3/5] tweak wording a little --- api.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/api.txt b/api.txt index 2d05099..86e2eeb 100644 --- a/api.txt +++ b/api.txt @@ -14,7 +14,8 @@ Make sure any mods using this function has 'hopper' in the depends.txt file. hopper:add_container({ {"where_from", "node_name", "inventory_name"} }) 'where_from' is a string telling the api that items are coming from either - the 'top', going to the 'bottom' or coming from the 'side'. + the 'top' node into a hopper, going into the 'bottom' node from a + hopper or coming from a 'side' hopper into a container. 'node_name" is the name of the container itself (e.g. "default:chest") @@ -23,9 +24,9 @@ hopper:add_container({ {"where_from", "node_name", "inventory_name"} }) e.g. hopper:add_container({ - {"top", "default:furnace", "dst"}, -- take cooked items into hopper - {"bottom", "default:furnace", "src"}, -- insert items to be cooked from hopper - {"side", "default:furnace", "fuel"}, -- replenish furnace fuel from hopper + {"top", "default:furnace", "dst"}, -- take cooked items from above into hopper + {"bottom", "default:furnace", "src"}, -- insert items below to be cooked from hopper + {"side", "default:furnace", "fuel"}, -- replenish furnace fuel from hopper at side }) From 8a308e62914750b0819228148538bd7481117a78 Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Fri, 27 Jan 2017 14:11:36 +0000 Subject: [PATCH 4/5] added screenshot --- screenshot.png | Bin 0 -> 20417 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshot.png diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9c2988fc7e54a09dcdf9bc90b9b8115f0681f191 GIT binary patch literal 20417 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�b0c_OGgMgg%jzj+G6+L{>kq>hY2)ZMi19*({ zlWZ1`HXH}!{BQkG0GWTw{uD$`>B^>XT&(Ph3pEQ@n@RTBF6l$tTdT`=Cf(b5?;nsE znq~H*9s@+y=6OVr`^^EF#lu(d7~0yhaXKLCd#(QQ6hPkjfcsfMsvGIEwZpz;DX(OX ziN5GfK6ES0jP53P?5*+8W?$AY)Tq=+cnmc>9`ZITUkZS{>)FsR*~dY=PTpFgdz-NBwfDC88X_!akNS}iHdXpKu%79&`5UkP9;W4yFK65@_sVau%GfbBxS!W?J7#N}HdWn@6k@kP0IsFZpVs>Oy8`yB!Y{ad7w9 zQ>J-9`guSOA(949sCbLC)reNLao$kWd{;Zz)o0PPDkmnJ!2RY}!@7Dc)43FswZ4K? z8H0Lik0{YqD~jaKzpKy5l@NydxX-)9&4&=BGwxMjtmcGjPOAC*ko77afgK>~ADI&X zpY=>ZG1VA+azKLd5I;D2+8oEcLV-|qsMisp{UPV!AxE#~1S{#rTy@O7`zNYJ#@nIy%i)%!vR1F38RXKtJlcKny&&9 z&H!ZicmV0o1tjm_=9KcjHbMI16U1k9)sN=_;uRo$MGg4GfD}(Y5s{%bMaD-V(##q| zD$)Nl@XaZ5B8Pb1_*QSYZb=L5h=C0&o&Jeha*bAR!V*|O)Xyq^t{1jyJb)93Y#GaE zo(P#$p_%J8O`66zL%RjJKOFb21f;K9>Ss*F^(d9Kt!AYL^I>Kp6|+~27&EUt=IU<= zV50j%FXjgZr>6gq*Hk@E)h^Hq9^(N#`lA~o4&iYKkQuTx1IWXwp|bHVV=1#t;L5u8#y{Pb8dpKkZp8>8avDb#sfxNytj3k(%?`H^FIi5`r%qPIZ z&nyb6=MN!v7?49umGa3xxW)evASY~GKJ?n*03v?&v^7?OWJj-7@Cb+Scr+m6(GTnE zA9i^_4o>XH0HW2e<9UcQm9Q}<#SJ7p^a?WLR5vry9yll)10r|w2~tul14us)$V0iF z6dO|x@E}NOL;bT#w2n`a!-zBo`AwrYRHx~&0H}kP9+N-vZ48=OOP!-6&B6DlILz0) zKTFY(qtR9j$iwmX)*CP$>ik!UUm-uwAmVeH)SQS%0f Date: Fri, 27 Jan 2017 19:13:59 +0000 Subject: [PATCH 5/5] can insert into locked chests but not take :) --- init.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index c7823be..6746820 100644 --- a/init.lua +++ b/init.lua @@ -22,6 +22,9 @@ local containers = { {"top", "default:furnace_active", "dst"}, {"bottom", "default:furnace_active", "src"}, {"side", "default:furnace_active", "fuel"}, + + {"bottom", "default:chest_locked", "main"}, + {"side", "default:chest_locked", "main"}, } -- global function to add new containers @@ -392,7 +395,7 @@ minetest.register_abm({ nod = containers[n][2] inv = containers[n][3] - -- take from top node into hopper + -- hopper on top into container below if where == "top" and top == nod and (node.name == "hopper:hopper" or node.name == "hopper:hopper_side") then --print ("-- top") @@ -401,7 +404,7 @@ minetest.register_abm({ {x = pos.x, y = pos.y + 1, z = pos.z}):start(0.5) return - -- take from hopper into bottom node + -- container on top into hopper below elseif where == "bottom" and out == nod and node.name == "hopper:hopper" then --print ("-- bot") @@ -409,7 +412,7 @@ minetest.register_abm({ minetest.get_node_timer(front):start(0.5) return - -- take from side hopper into node + -- side hopper into container beside elseif where == "side" and out == nod and node.name == "hopper:hopper_side" then --print ("-- sid")