From cc5d98c58519cc4463ff84ec5282fe422877461d Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Wed, 8 Aug 2018 11:37:27 +0200 Subject: [PATCH] tubelib_addon3 with "high performance" nodes added --- tubelib/command.lua | 28 +++ tubelib_addons3/chest.lua | 29 +-- tubelib_addons3/distributor.lua | 6 +- tubelib_addons3/init.lua | 5 +- tubelib_addons3/pusher.lua | 234 ++++++++++++++++++ tubelib_addons3/pushing_chest.lua | 10 +- .../tubelib_addons3_distributor_active.png | Bin 16104 -> 2846 bytes .../textures/tubelib_addons3_node_frame.png | Bin 962 -> 375 bytes .../textures/tubelib_addons3_node_frame4.png | Bin 0 -> 406 bytes ....png => tubelib_addons3_pusher_active.png} | Bin 10 files changed, 282 insertions(+), 30 deletions(-) create mode 100644 tubelib_addons3/pusher.lua create mode 100644 tubelib_addons3/textures/tubelib_addons3_node_frame4.png rename tubelib_addons3/textures/{tubelib_addons3_pushing_chest.png => tubelib_addons3_pusher_active.png} (100%) diff --git a/tubelib/command.lua b/tubelib/command.lua index b9ce3b5..6dbe926 100644 --- a/tubelib/command.lua +++ b/tubelib/command.lua @@ -298,6 +298,20 @@ function tubelib.unpull_items(pos, side, items, player_name) return false end +function tubelib.pull_stack(pos, side, player_name) + local npos, facedir = get_neighbor_pos(pos, side) + if npos == nil then return end + local nside, node = get_node_side(npos, facedir) + local name = Name2Name[node.name] + if tubelib_NodeDef[name] then + if tubelib_NodeDef[name].on_pull_stack then + return tubelib_NodeDef[name].on_pull_stack(npos, nside, player_name) + elseif tubelib_NodeDef[name].on_pull_item then + return tubelib_NodeDef[name].on_pull_item(npos, nside, player_name) + end + end + return nil +end ------------------------------------------------------------------- -- Server side helper functions @@ -379,6 +393,20 @@ function tubelib.get_num_items(meta, listname, num) return nil end +function tubelib.get_stack(meta, listname) + local inv = meta:get_inventory() + local item = tubelib.get_item(meta, listname) + if item and inv:contains_item(listname, item) then + -- try to remove a complete stack + item:set_count(98) + local taken = inv:remove_item(listname, item) + -- add the already removed + taken:set_count(taken:get_count() + 1) + return taken + end + return item +end + -- Return "full", "loaded", or "empty" depending -- on the number of fuel stack items. -- Function only works on fuel inventories with one stacks/99 items diff --git a/tubelib_addons3/chest.lua b/tubelib_addons3/chest.lua index 3a1159e..93660b7 100644 --- a/tubelib_addons3/chest.lua +++ b/tubelib_addons3/chest.lua @@ -33,21 +33,6 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player return stack:get_count() end -local function get_stack(meta, list) - local inv = meta:get_inventory() - local item = tubelib.get_item(meta, list) - if item and inv:contains_item(list, item) then - -- try to remove a complete stack - item:set_count(98) - local taken = inv:remove_item(list, item) - -- add the already removed - taken:set_count(taken:get_count() + 1) - return taken - end - return item -end - - local function formspec() return "size[12,10]".. default.gui_bg.. @@ -111,16 +96,20 @@ minetest.register_node("tubelib_addons3:chest", { minetest.register_craft({ output = "tubelib_addons3:chest", recipe = { - {"", "default:steel_ingot", ""}, - {"tubelib_addons1:chest", "default:gold_ingot", "tubelib_addons1:chest"}, - {"", "default:tin_ingot", ""}, - } + {"default:tin_ingot", "tubelib_addons1:chest", ""}, + {"tubelib_addons1:chest", "default:gold_ingot", ""}, + {"", "", ""}, + }, }) tubelib.register_node("tubelib_addons3:chest", {}, { + on_pull_stack = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_stack(meta, "main") + end, on_pull_item = function(pos, side) local meta = minetest.get_meta(pos) - return get_stack(meta, "main") + return tubelib.get_item(meta, "main") end, on_push_item = function(pos, side, item) local meta = minetest.get_meta(pos) diff --git a/tubelib_addons3/distributor.lua b/tubelib_addons3/distributor.lua index 0357a20..5f7f381 100644 --- a/tubelib_addons3/distributor.lua +++ b/tubelib_addons3/distributor.lua @@ -446,9 +446,9 @@ minetest.register_node("tubelib_addons3:distributor_active", { minetest.register_craft({ output = "tubelib_addons3:distributor", recipe = { - {"", "default:steel_ingot", ""}, - {"default:gold_ingot", "tubelib:distributor", "default:tin_ingot"}, - {"", "default:steel_ingot", ""}, + {"default:tin_ingot", "tubelib:distributor", ""}, + {"tubelib:distributor", "default:gold_ingot", ""}, + {"", "", ""}, }, }) diff --git a/tubelib_addons3/init.lua b/tubelib_addons3/init.lua index be003d1..e6ba08f 100644 --- a/tubelib_addons3/init.lua +++ b/tubelib_addons3/init.lua @@ -10,6 +10,7 @@ ]]-- -dofile(minetest.get_modpath("tubelib_addons3") .. '/pushing_chest.lua') dofile(minetest.get_modpath("tubelib_addons3") .. '/chest.lua') -dofile(minetest.get_modpath("tubelib_addons3") .. '/distributor.lua') \ No newline at end of file +dofile(minetest.get_modpath("tubelib_addons3") .. '/pusher.lua') +dofile(minetest.get_modpath("tubelib_addons3") .. '/distributor.lua') +dofile(minetest.get_modpath("tubelib_addons3") .. '/pushing_chest.lua') diff --git a/tubelib_addons3/pusher.lua b/tubelib_addons3/pusher.lua new file mode 100644 index 0000000..b8b0629 --- /dev/null +++ b/tubelib_addons3/pusher.lua @@ -0,0 +1,234 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + pusher.lua + + A high performance pusher + +]]-- + +local RUNNING_STATE = 10 + +local function switch_on(pos, node) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", RUNNING_STATE) + meta:set_string("infotext", "HighPerf Pusher "..number..": running") + node.name = "tubelib_addons3:pusher_active" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):start(2) + return false +end + +local function switch_off(pos, node) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", tubelib.STATE_STOPPED) + meta:set_string("infotext", "HighPerf Pusher "..number..": stopped") + node.name = "tubelib_addons3:pusher" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):stop() + return false +end + +local function goto_standby(pos, node) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", tubelib.STATE_STANDBY) + meta:set_string("infotext", "HighPerf Pusher "..number..": standby") + node.name = "tubelib_addons3:pusher" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):start(20) + return false +end + +local function goto_blocked(pos, node) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", tubelib.STATE_BLOCKED) + meta:set_string("infotext", "HighPerf Pusher "..number..": blocked") + node.name = "tubelib_addons3:pusher" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):start(20) + return false +end + +local function keep_running(pos, elapsed) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + local running = meta:get_int("running") - 1 + local player_name = meta:get_string("player_name") + local items = tubelib.pull_stack(pos, "L", player_name) + if items ~= nil then + if tubelib.push_items(pos, "R", items, player_name) == false then + -- place item back + tubelib.unpull_items(pos, "L", items, player_name) + local node = minetest.get_node(pos) + return goto_blocked(pos, node) + end + meta:set_int("item_counter", meta:get_int("item_counter") + 1) + if running <= 0 then + local node = minetest.get_node(pos) + return switch_on(pos, node) + else + -- reload running state + running = RUNNING_STATE + end + else + if running <= 0 then + local node = minetest.get_node(pos) + return goto_standby(pos, node) + end + end + meta:set_int("running", running) + return true +end + +minetest.register_node("tubelib_addons3:pusher", { + description = "HighPerf Pusher", + tiles = { + -- up, down, right, left, back, front + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_outp.png^tubelib_addons3_node_frame4.png', + 'tubelib_inp.png^tubelib_addons3_node_frame4.png', + "tubelib_pusher1.png^[transformR180]^tubelib_addons3_node_frame4.png^[transformR180]", + "tubelib_pusher1.png^tubelib_addons3_node_frame4.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + local number = tubelib.add_node(pos, "tubelib_addons3:pusher") + meta:set_string("number", number) + meta:set_string("infotext", "HighPerf Pusher "..number..": stopped") + meta:set_int("item_counter", 0) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_on(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib_addons3:pusher_active", { + description = "HighPerf Pusher", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_outp.png^tubelib_addons3_node_frame4.png', + 'tubelib_inp.png^tubelib_addons3_node_frame4.png', + { + image = "tubelib_addons3_pusher_active.png^[transformR180]", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + }, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_off(pos, node) + end + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "tubelib_addons3:pusher", + recipe = { + {"default:tin_ingot", "tubelib:pusher", ""}, + {"tubelib:pusher", "default:gold_ingot", ""}, + {"", "", ""}, + }, +}) + +tubelib.register_node("tubelib_addons3:pusher", {"tubelib_addons3:pusher_active"}, { + is_pusher = true, -- is a pulling/pushing node + + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + return switch_on(pos, node) + elseif topic == "off" then + return switch_off(pos, node) + elseif topic == "state" then + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") or tubelib.STATE_STOPPED + return tubelib.statestring(running) + elseif topic == "counter" then + local meta = minetest.get_meta(pos) + return meta:get_int("item_counter") + elseif topic == "clear_counter" then + local meta = minetest.get_meta(pos) + return meta:set_int("item_counter", 0) + else + return "not supported" + end + end, +}) diff --git a/tubelib_addons3/pushing_chest.lua b/tubelib_addons3/pushing_chest.lua index 07dc1bd..74507e8 100644 --- a/tubelib_addons3/pushing_chest.lua +++ b/tubelib_addons3/pushing_chest.lua @@ -100,7 +100,7 @@ minetest.register_node("tubelib_addons3:pushing_chest", { tiles = { -- up, down, right, left, back, front { - image = "tubelib_addons3_pushing_chest.png", + image = "tubelib_addons3_pusher_active.png", backface_culling = false, animation = { type = "vertical_frames", @@ -165,10 +165,10 @@ minetest.register_node("tubelib_addons3:pushing_chest", { minetest.register_craft({ output = "tubelib_addons3:pushing_chest", recipe = { - { "", "default:tin_ingot", ""}, - {"default:chest", "default:gold_ingot", "tubelib:distributor"}, - {"", "default:steel_ingot", ""}, - } + {"default:tin_ingot", "tubelib_addons3:pusher", ""}, + {"tubelib_addons1:chest", "default:gold_ingot", ""}, + {"", "", ""}, + }, }) tubelib.register_node("tubelib_addons3:pushing_chest", {}, { diff --git a/tubelib_addons3/textures/tubelib_addons3_distributor_active.png b/tubelib_addons3/textures/tubelib_addons3_distributor_active.png index 3be1eddd228993b2db325226801be6ec51661e5b..9c22a4643b932cd74657cb9f928f3c412ab36d99 100644 GIT binary patch delta 2821 zcmV+g3;OiveV!JO7*YfS0000l*JCLF001yhOjJb#7X%0%3@J1rMNK|qXIraTF1Bhr zgoc2`fl-{Eo~*5_yS=>4&db%;)ZpLV>g(uPs%}lbEy^AYL#=*IB8Q{%{g;~+k&ZQB>9SwXEbi? zfUqug*IN6`C4J0;=0!S-efBwjXRmMn>tCB)UfQzr%f|BZ^1`z1nA^#up8^k_|tEm#ovWIE0k>fWs~%q-D0bo z>fbcQogH>#gT|hlp*vTW+3G!-tuUh|-D0!P>I3_C*y`>2z=a$uyr>HV7T`@^4AugT zm$q2Ox>gH}Wpd0Z8r1-QERfBdN5-{EU@U&BM2q~n3N#vj{&kV1|90A#r$8W{_~0Xx zU4C@>myoE!OjBI@-3PGh<)v*(<b1|;9!VFz5A6iIU z)`F6Cq$+%T5j3?R_m4#@eCWg0jO>Un?lvFukiC&qjgOIk5T-w0Tn3Pj7cmnfFol$UHX0DXH(GlFB}Q{ZEJP>MIK367C0@$orM z0m&Ag^G}q1a8Cin0U~2AAA1x)QbrXYgFk~QP=Put`Y}#|BLmg?q9kUM#eaN%#$7h$=u$z95D1@{0m}m<2i0nQ#WR?LLLS_9-@P`X3{hSZkdJ0de`-Tp~HC` zazfP?7|;sAVd*1(8iE;yDcVL#_o4>}(0#)##K)wm9trUQB-5sL`INp8aRw+!_I z_rBPZ*6~^#aP@-^#L~{ULg@$CQT|>jo0t|=KG=KfRw8?byZUjTu16IxX9AluhbXne_qK?#;bhv3c#?Ks`IBK?d?sw??3dk^!e+~Kdw-2o2us@T5DJ4 zV{G24e8_#~tvWvRHt9ARKGnZmA5k3N$LQ#ct;EQ7YR;V(LBBi(-A*wDjn3@Kp<&4bqQ0iK%wR_ZE>L zAMr7atye>723s%HztGOWmPYI&K2+;+8Id}!{Arup7GZ;bM|@mC{@$=IvVE2Mf&~X2 z(_H04KPm(;cDznMdV74d2-;H9n?-*ogXS=VL)JfT^tVF@&kaB|YTw5yG8~ z2tj*aIUn0+lIXlce0)|p{-~Uf4OR|FaMiJY!S(VIWQ@J<>Ia^wFy=ehcfs`^%oAU0 z?u$f|v*; literal 16104 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 diff --git a/tubelib_addons3/textures/tubelib_addons3_node_frame.png b/tubelib_addons3/textures/tubelib_addons3_node_frame.png index 2aae6d5421609e4bb79f0b0b1e9d99275fc43f5c..1e1312e0eb2cf094e9bd46da6a271565807de524 100644 GIT binary patch delta 359 zcmV-t0hs>62loPy8Gi!+002a!ipBr{00d`2O+f$vv5yPtGm|JK;l(9+NC@9g8|;@;ldzrel9%*nX9x2>R<4Ht8R5;6pRNIopAP8d#*Y^MacSHMfUVo%IIu_EPNR&HZ)_|sJ za!gA+EgDu*?m&5Qc6U?uS+skN>yiunuVQ%U3yTOY=%$ITmW+^Ni@2q<|Bist6x7C0 zkoH;t-U443iU5V50S+aDodE_&5_AT5GQ`55t~w1l^czbj@y4QE+*Yf~m-v6vG29=daI#vJx002ovPDHLk FV1kA=r^EmN delta 951 zcmV;o14#V$0>TH78Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-*t2No?ey{?C90009|Nkl=iE&#(+AzX*mwR*iXoaev%T<-1d zad~-x)`ldBnN6=q!jQRe?w!nXhwXL;r4&+1lu~%Qq;MTNVZ^(#px;mN{cQ@ZN&9JK zYdW0*RBPSd+~74HH3%9$LBr>>$B!K>pm%ao8e@3z>wgQx)^?qDcelJc{EMtH@==bI z5-}Q$iQ~9B7F&pFdU{!Cp4sKN)UwB z2=x0YQ52!IStKIYb(zoatPv=RyDA!lQVKr^7+A~&%k`v`h#*+B(f*EajX>H@E6pHQ z+ay~^!m!d90$|V|Fc*$B0(0SDv|03oul_#blg&rGonBcZa5b6IJ3S+b6TG+A*KBXq zF@MHbBe3K9Z2LQ$o}A)+`|K%mG_&g|!z?X5&*k{&_5YG)oiO4&&*+2^XTv^4VJM0_ z{2;g|&1$A(E*vJa3GH@={36Hs>G_Z4{{H?waaym}$;UbW6|GCh$+8R~+^VE5#i`aB zV>DToRpGY$KMcZ;+We?Eee>qLGQK*$S};zNq|I=sXf}g;^HNH*HdV=8hWRR%Hcwvv Z!@qle#=A4P%`pG~002ovPDHLkV1m}szcv5> diff --git a/tubelib_addons3/textures/tubelib_addons3_node_frame4.png b/tubelib_addons3/textures/tubelib_addons3_node_frame4.png new file mode 100644 index 0000000000000000000000000000000000000000..70d586a8b8848669633d69e04980aa66b14a28ff GIT binary patch literal 406 zcmV;H0crk;P)Px#9#BkFMNDaN(9+M=*wo+O-LkW>?e6Qnzr2~5m*wZ= z%FN07_KZvb0004WQchCd0fNdkhJqZF?+gyc0LdLtb|l+f*MHk6o~U$Plupnl9{-Nzute$t%@7i*~F4DIB~` z6FiGo!Q@mF3ubrGA7FKH7gIFvnl#`MWPpJvMFMI@Ml_=y%c~mXWw@gImma(Dh-n%l zwK?L|E8$`h530sO(=~qLjnV1oUcM*4?hha$e<`>JBrx9(Bme*a07*qoM6N<$f_PM{ A3IG5A literal 0 HcmV?d00001 diff --git a/tubelib_addons3/textures/tubelib_addons3_pushing_chest.png b/tubelib_addons3/textures/tubelib_addons3_pusher_active.png similarity index 100% rename from tubelib_addons3/textures/tubelib_addons3_pushing_chest.png rename to tubelib_addons3/textures/tubelib_addons3_pusher_active.png