From e8bad31a17d0b10d77825db5d141239c003e9933 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Wed, 8 Aug 2018 01:06:16 +0200 Subject: [PATCH] Some improvements on the robot (still WIP) First draft of tubelib_addons3 (still WIP) --- sl_robot/commands.lua | 39 +- sl_robot/init.lua | 1 + sl_robot/robot.lua | 93 ++-- sl_robot/run_cmnd.lua | 122 +++++ tubelib_addons1/init.lua | 2 +- .../textures/tubelib_addons1_autocrafter.png | Bin 2034 -> 1679 bytes .../tubelib_addons1_autocrafter_active.png | Bin 2524 -> 1849 bytes .../textures/tubelib_addons1_biofuel.png | Bin 2730 -> 1813 bytes .../textures/tubelib_addons1_biogas.png | Bin 3849 -> 2238 bytes .../tubelib_addons1_fermenter_bottom.png | Bin 2691 -> 1858 bytes .../tubelib_addons1_fermenter_inventory.png | Bin 6006 -> 5855 bytes .../tubelib_addons1_fermenter_top.png | Bin 2460 -> 1874 bytes .../textures/tubelib_addons1_funnel.png | Bin 2127 -> 1769 bytes .../textures/tubelib_addons1_funnel_top.png | Bin 1998 -> 1694 bytes .../textures/tubelib_addons1_grinder.png | Bin 3038 -> 1874 bytes .../tubelib_addons1_grinder_active.png | Bin 8206 -> 3433 bytes .../textures/tubelib_addons1_harvester.png | Bin 2167 -> 1807 bytes .../tubelib_addons1_harvester_top.png | Bin 159 -> 119 bytes .../textures/tubelib_addons1_pusher.png | Bin 423 -> 400 bytes .../textures/tubelib_addons1_quarry.png | Bin 2286 -> 1852 bytes .../tubelib_addons1_quarry_active.png | Bin 2978 -> 2231 bytes .../tubelib_addons1_quarry_passive.png | Bin 1442 -> 1378 bytes .../tubelib_addons1_reformer2_bottom.png | Bin 1857 -> 1718 bytes .../tubelib_addons1_reformer2_top.png | Bin 1839 -> 1740 bytes .../tubelib_addons1_reformer_inventory.png | Bin 5501 -> 5480 bytes tubelib_addons3/chest.lua | 137 +++++ tubelib_addons3/depends.txt | 3 + tubelib_addons3/description.txt | 2 + tubelib_addons3/distributor.lua | 491 ++++++++++++++++++ tubelib_addons3/init.lua | 15 + tubelib_addons3/mod.conf | 1 + tubelib_addons3/pushing_chest.lua | 203 ++++++++ .../textures/tubelib_addons3_chest_bottom.png | Bin 0 -> 752 bytes .../textures/tubelib_addons3_chest_front.png | Bin 0 -> 737 bytes .../textures/tubelib_addons3_chest_out.png | Bin 0 -> 585 bytes .../textures/tubelib_addons3_chest_side.png | Bin 0 -> 485 bytes .../tubelib_addons3_distributor_active.png | Bin 0 -> 16104 bytes .../textures/tubelib_addons3_node_frame.png | Bin 0 -> 962 bytes .../tubelib_addons3_pushing_chest.png | Bin 0 -> 1743 bytes .../tubelib_addons3_stack_chest_front.png | Bin 0 -> 500 bytes .../tubelib_addons3_stack_chest_side.png | Bin 0 -> 484 bytes 41 files changed, 1035 insertions(+), 74 deletions(-) create mode 100644 sl_robot/run_cmnd.lua create mode 100644 tubelib_addons3/chest.lua create mode 100644 tubelib_addons3/depends.txt create mode 100644 tubelib_addons3/description.txt create mode 100644 tubelib_addons3/distributor.lua create mode 100644 tubelib_addons3/init.lua create mode 100644 tubelib_addons3/mod.conf create mode 100644 tubelib_addons3/pushing_chest.lua create mode 100644 tubelib_addons3/textures/tubelib_addons3_chest_bottom.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_chest_front.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_chest_out.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_chest_side.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_distributor_active.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_node_frame.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_pushing_chest.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_stack_chest_front.png create mode 100644 tubelib_addons3/textures/tubelib_addons3_stack_chest_side.png diff --git a/sl_robot/commands.lua b/sl_robot/commands.lua index 1f12c02..78dc94b 100644 --- a/sl_robot/commands.lua +++ b/sl_robot/commands.lua @@ -14,6 +14,15 @@ ]]-- +-- constrict value to the given range +local function range(val, min, max) + val = tonumber(val) + if val < min then return min end + if val > max then return max end + return val +end + + sl_robot.register_action("get_ms_time", { cmnd = function(self) @@ -25,7 +34,7 @@ sl_robot.register_action("get_ms_time", { sl_robot.register_action("forward", { cmnd = function(self, steps) - steps = math.min(tonumber(steps or 1), 100) + steps = range(steps, 1, 100) local idx = 1 while idx <= steps do local meta = minetest.get_meta(self.meta.pos) @@ -49,7 +58,7 @@ sl_robot.register_action("forward", { sl_robot.register_action("backward", { cmnd = function(self, steps) - steps = math.min(tonumber(steps or 1), 100) + steps = range(steps, 1, 100) local idx = 1 while idx <= steps do local meta = minetest.get_meta(self.meta.pos) @@ -140,8 +149,8 @@ sl_robot.register_action("down", { sl_robot.register_action("take", { cmnd = function(self, num, slot) - num = math.min(tonumber(num or 1), 99) - slot = math.min(tonumber(slot or 1), 8) + num = range(num, 1, 99) + slot = range(slot, 1, 8) local meta = minetest.get_meta(self.meta.pos) local robot_pos = minetest.string_to_pos(meta:get_string("robot_pos")) local robot_param2 = meta:get_int("robot_param2") @@ -159,8 +168,8 @@ sl_robot.register_action("take", { sl_robot.register_action("add", { cmnd = function(self, num, slot) - num = math.min(tonumber(num or 1), 99) - slot = math.min(tonumber(slot or 1), 8) + num = range(num, 1, 99) + slot = range(slot, 1, 8) local meta = minetest.get_meta(self.meta.pos) local robot_pos = minetest.string_to_pos(meta:get_string("robot_pos")) local robot_param2 = meta:get_int("robot_param2") @@ -177,7 +186,7 @@ sl_robot.register_action("add", { sl_robot.register_action("place", { cmnd = function(self, slot, dir) - slot = math.min(tonumber(slot or 1), 8) + slot = range(slot, 1, 8) local meta = minetest.get_meta(self.meta.pos) local robot_pos = minetest.string_to_pos(meta:get_string("robot_pos")) local robot_param2 = meta:get_int("robot_param2") @@ -193,7 +202,7 @@ sl_robot.register_action("place", { sl_robot.register_action("dig", { cmnd = function(self, slot, dir) - slot = math.min(tonumber(slot or 1), 8) + slot = range(slot, 1, 8) local meta = minetest.get_meta(self.meta.pos) local robot_pos = minetest.string_to_pos(meta:get_string("robot_pos")) local robot_param2 = meta:get_int("robot_param2") @@ -215,17 +224,3 @@ sl_robot.register_action("stop", { end, help = "tbd" }) - ---sl_robot.register_action("run", { --- cmnd = function(self, sCmd, reverse) --- slot = math.min(tonumber(slot or 1), 8) --- local meta = minetest.get_meta(self.meta.pos) --- local robot_pos = minetest.string_to_pos(meta:get_string("robot_pos")) --- local robot_param2 = meta:get_int("robot_param2") - --- for cmnd in sCmd:gmatch("%w+") do --- if cmnd:byte() --- end --- end, --- help = " " ---}) diff --git a/sl_robot/init.lua b/sl_robot/init.lua index 2dd146b..ecfe824 100644 --- a/sl_robot/init.lua +++ b/sl_robot/init.lua @@ -16,3 +16,4 @@ sl_robot = {} dofile(minetest.get_modpath("sl_robot") .. "/robot.lua") dofile(minetest.get_modpath("sl_robot") .. "/base.lua") dofile(minetest.get_modpath("sl_robot") .. "/commands.lua") +dofile(minetest.get_modpath("sl_robot") .. "/run_cmnd.lua") diff --git a/sl_robot/robot.lua b/sl_robot/robot.lua index 40ced31..d8b4548 100644 --- a/sl_robot/robot.lua +++ b/sl_robot/robot.lua @@ -23,40 +23,38 @@ local Face2Dir = {[0]= local Inventories = { - ["default:chest"] = {take = "main", add = "main", fuel = "main"}, - ["default:chest_locked"] = {take = "main", add = "main", fuel = "main"}, - ["default:chest_locked"] = {take = "main", add = "main", fuel = "main"}, - ["default:furnace"] = {take = "dst", add = "src", fuel = "fuel"}, - ["default:furnace_active"] = {take = "dst", add = "src", fuel = "fuel"}, - ["tubelib:distributor"] = {take = "src", add = "src", fuel = "src"}, - ["gravelsieve:sieve"] = {take = "dst", add = "src", fuel = "src"}, - ["gravelsieve:auto_sieve0"] = {take = "dst", add = "src", fuel = "src"}, - ["gravelsieve:auto_sieve1"] = {take = "dst", add = "src", fuel = "src"}, - ["gravelsieve:auto_sieve2"] = {take = "dst", add = "src", fuel = "src"}, - ["gravelsieve:auto_sieve3"] = {take = "dst", add = "src", fuel = "src"}, - ["tubelib_addons1:autocrafter"] = {take = "dst", add = "src", fuel = "src"}, - ["tubelib_addons1:autocrafter_active"] = {take = "dst", add = "src", fuel = "src"}, - ["tubelib_addons1:chest"] = {take = "main", add = "main", fuel = "main"}, - ["tubelib_addons1:fermenter"] = {take = "dst", add = "src", fuel = "src"}, - ["tubelib_addons1:reformer"] = {take = "dst", add = "src", fuel = "src"}, - ["tubelib_addons1:funnel"] = {take = "main", add = "main", fuel = "main"}, - ["tubelib_addons1:grinder"] = {take = "dst", add = "src", fuel = "src"}, - ["tubelib_addons1:grinder_active"] = {take = "dst", add = "src", fuel = "src"}, - ["tubelib_addons1:harvester_base"] = {take = "main", add = "main", fuel = "fuel"}, - ["tubelib_addons1:quarry"] = {take = "main", add = "main", fuel = "fuel"}, - ["tubelib_addons1:quarry_active"] = {take = "main", add = "main", fuel = "fuel"}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, --- [""] = {take = "", add = "", fuel = ""}, + ["tubelib:distributor"] = {take = "src", add = "src"}, + ["tubelib_addons1:harvester_base"] = {take = "main", add = "fuel"}, + ["tubelib_addons1:quarry"] = {take = "main", add = "fuel"}, + ["tubelib_addons1:quarry_active"] = {take = "main", add = "fuel"}, +-- [""] = {take = "", add = ""}, +-- [""] = {take = "", add = ""}, +-- [""] = {take = "", add = ""}, } +local function inv_list_add(inv, name) + if Inventories[name] then + return inv:get_list(Inventories[name].add) + elseif inv:get_list("src") then + return inv:get_list("src") + elseif inv:get_list("main") then + return inv:get_list("main") + end + return nil +end + +local function inv_list_take(inv, name) + if Inventories[name] then + return inv:get_list(Inventories[name].take) + elseif inv:get_list("dst") then + return inv:get_list("dst") + elseif inv:get_list("main") then + return inv:get_list("main") + end + return nil +end + + -- return the largest stack local function peek(src_list) local max_val = 0 @@ -264,19 +262,13 @@ function sl_robot.robot_take(base_pos, robot_pos, param2, owner, num, slot) return end local node = minetest.get_node_or_nil(pos1) or read_node_with_vm(pos1) - if Inventories[node.name] then - local listname = Inventories[node.name].take - local src_inv = minetest.get_inventory({type="node", pos=pos1}) - if src_inv:is_empty(listname) then - return - end - local src_list = src_inv:get_list(listname) - local dst_inv = minetest.get_inventory({type="node", pos=base_pos}) - local dst_list = dst_inv:get_list("main") - if take_num_items(src_list, num, dst_list[slot]) then - src_inv:set_list(listname, src_list) - dst_inv:set_list("main", dst_list) - end + local src_inv = minetest.get_inventory({type="node", pos=pos1}) + local src_list = inv_list_take(src_inv, node.name) + local dst_inv = minetest.get_inventory({type="node", pos=base_pos}) + local dst_list = dst_inv:get_list("main") + if src_list and take_num_items(src_list, num, dst_list[slot]) then + src_inv:set_list(listname, src_list) + dst_inv:set_list("main", dst_list) end end @@ -286,12 +278,11 @@ function sl_robot.robot_add(base_pos, robot_pos, param2, owner, num, slot) return end local node = minetest.get_node_or_nil(pos1) or read_node_with_vm(pos1) - if Inventories[node.name] then - local listname = Inventories[node.name].take - local dst_inv = minetest.get_inventory({type="node", pos=pos1}) - local dst_list = dst_inv:get_list(listname) - local src_inv = minetest.get_inventory({type="node", pos=base_pos}) - local src_list = src_inv:get_list("main") + local dst_inv = minetest.get_inventory({type="node", pos=pos1}) + local dst_list = inv_list_add(dst_inv, node.name) + local src_inv = minetest.get_inventory({type="node", pos=base_pos}) + local src_list = src_inv:get_list("main") + if dst_list then local taken = src_list[slot]:take_item(num) if dst_inv:room_for_item(listname, taken) then dst_inv:add_item(listname, taken) diff --git a/sl_robot/run_cmnd.lua b/sl_robot/run_cmnd.lua new file mode 100644 index 0000000..a879cc0 --- /dev/null +++ b/sl_robot/run_cmnd.lua @@ -0,0 +1,122 @@ +--[[ + + sl_robot + ======== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + run_cmnd.lua: + + Register the run command + +]]-- + +local function Reverse(arr) + local i, j = 1, #arr + + while i < j do + arr[i], arr[j] = arr[j], arr[i] + + i = i + 1 + j = j - 1 + end +end + +local switch = { + f = function(cmnd) + local num = (cmnd:byte(2) or 0x31) - 0x30 + print("forward("..num..")") + end, + b = function(cmnd) + local num = (cmnd:byte(2) or 0x31) - 0x30 + print("backward("..num..")") + end, + l = function(cmnd, reverse) + if reverse then + print("right()") + else + print("left()") + end + end, + r = function(cmnd, reverse) + if reverse then + print("left()") + else + print("right()") + end + end, + u = function(cmnd) + print("up()") + end, + d = function(cmnd) + print("down()") + end, + t = function(cmnd) + local num, slot + if cmnd:sub(2,2) == "s" then + num = 99 + slot = (cmnd:byte(3) or 0x31) - 0x30 + else + num = 1 + slot = (cmnd:byte(2) or 0x31) - 0x30 + end + print("take("..num..","..slot..")") + end, + a = function(cmnd) + local num, slot + if cmnd:sub(2,2) == "s" then + num = 99 + slot = (cmnd:byte(3) or 0x31) - 0x30 + else + num = 1 + slot = (cmnd:byte(2) or 0x31) - 0x30 + end + print("add("..num..","..slot..")") + end, + p = function(cmnd) + local num, slot + if cmnd:sub(2,2) == "u" then + slot = (cmnd:byte(3) or 0x31) - 0x30 + print("place("..slot..",U)") + elseif cmnd:sub(2,2) == "d" then + slot = (cmnd:byte(3) or 0x31) - 0x30 + print("place("..slot..",D)") + else + slot = (cmnd:byte(2) or 0x31) - 0x30 + print("place("..slot..")") + end + end, + e = function(cmnd) + print(cmnd.." is a invalid command") + end, +} + +local function run(task, reverse) + task = task:gsub("\n", " ") + task = task:gsub("\t", " ") + local cmnds = task:split(" ") + if reverse then + Reverse(cmnds) + end + for i,cmnd in ipairs(cmnds) do + (switch[cmnd:sub(1,1)] or switch["e"])(cmnd, reverse) + end +end + +sl_robot.register_action("run", { + cmnd = function(self, sCmndList, reverse) + sCmndList = sCmndList:gsub("\n", " ") + sCmndList = sCmndList:gsub("\t", " ") + local cmnds = sCmndList:split(" ") + if reverse then + Reverse(cmnds) + end + for i,cmnd in ipairs(cmnds) do + (switch[cmnd:sub(1,1)] or switch["e"])(cmnd, reverse) + end + end, + help = " " +}) diff --git a/tubelib_addons1/init.lua b/tubelib_addons1/init.lua index 48cd012..6ef127f 100644 --- a/tubelib_addons1/init.lua +++ b/tubelib_addons1/init.lua @@ -19,4 +19,4 @@ dofile(minetest.get_modpath("tubelib_addons1") .. '/fermenter.lua') dofile(minetest.get_modpath("tubelib_addons1") .. '/reformer.lua') dofile(minetest.get_modpath("tubelib_addons1") .. '/funnel.lua') dofile(minetest.get_modpath("tubelib_addons1") .. "/pusher_fast.lua") -dofile(minetest.get_modpath("tubelib_addons1") .. '/chest.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. '/chest.lua') \ No newline at end of file diff --git a/tubelib_addons1/textures/tubelib_addons1_autocrafter.png b/tubelib_addons1/textures/tubelib_addons1_autocrafter.png index fbc1d2c9d6bda9319e57679efb66a3d469d9f02c..c831b2be6ecd29df848b5405bca8dfb0277cc07c 100644 GIT binary patch delta 1674 zcmV;526g%J504Fy8Gi!+002a!ipBr{00d`2O+f$vv5yPQQtPS&%9%%Eh(nO(ndKfiH6#ea4~%YIACe@n@KO3_AMxMeugv4qj1am9EG}Etu*tLkvgG{<xN14BS}@0Y zM$n^l#(PJ@bwjLIFUfsLv12o?Trtq6amIN@uU<0Fp>nQSFvf#U)2@53VKdUKcgT`q z&!ug&WjM%>U&Wto#ePi1eM`!jXSHKCv0yaPta-?UP=CRBN5ObU$dP2TU^UaQfz6(9 z(5ZCFn{BgSHOGWdvtl*KlVjDXe6(XV&!czCoo>8qJ-TT+%z{n1XF9!ZJ*`|Z$d_W$ zrghS)bknedB?S~Rz3ILer0#(z!AoM+LgbkeSV*RzGrooC6HV6rEslUG0~)Q$BtXYoMX+Q zXU(H($bwDAl32);WvNsyz?fpoo^Z&ca@4PV*td$jazVg%MzLQr$(Ur!m}m}tnKal@5l)w6}acSejp)~s&9jby@? zbAP*vX2y_Wws%m-qj1caXv2C)*S3kvmubS4Z_%h|zm8kKjbYWTa>kr?x`JNNq;<-E zO87UjfB*mkElET{R5;6H@F<(pq5XP8wc(B(B?jNtmTYEb7T!?JCuWl}_jIpjwgW>R zJI5-I^kBS9PIq<@>75U z%hzzQC%a6J=3t-Au;7CIaSJ}C5@tOnW+uKkJI(d;om?!=PM65%oWmNMg9v4CJ73HX@8|a zs};|my<|u{X}3QiAy&j)P|!?kstm83yWAo$t;CaXJNd<920IS+uKY@^sUo~`Ub#xL zQj0|7Ou=*@PreNY`y&Q1b`BS=%3LJ|G+-KN$pw_##9+N~@pLY(Z9NPuY;0^uL{nf3 z7vDmOO$>2m$!e>)wrMc1aB?yt5r4)!CR}`Xm#ZsyHoogC~= zu3TDE8CY0ZS&;~1OG#ItoErl(JI5#2e6Lz`M}icTuwRZBKm|c&VKMRX%FT-EX6C$L zdfj#1cSRp`82_;XYTFA~3Ej|UFH%mcz(*T?| zOVyTeuv<(9GPAe0LGq@Zy>*yQ7@ U&U+H>00000NkvXXt^-0~f`Y_cW&i*H delta 2031 zcmVRm00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-&t2@*RS$e|v#000MnNkl`NWn2UHZ$W4u(<7x9S0O?Qo4(K&#C*JsybhNRYzTV>1jzO zhit#U#ro;H2pemR_q$}tlzcoSXf(+u6F~4+PvCh0qpeNyJfm`Y9WMw$1OTNp!<}vN z@ex6zL9n<)I)CUB_4|l%9F1cZ>NQHsEuvnJpixC<(=qw^A99)dNRtU!8euh5TP?f? zp5S74mFoIBcCpN$x65SpQT{SH&*G==W_ZvA5vB)wj88nm%a=6Ol@d6yC zd4?#M^pB`FYm61_ZFJ}U@zym&!NJ}E#uyqWSJ;`1sFpm^fx>GpV;34VOde4wg%CoH z!YaXNjaD#?6Vzf26qKqZ(l|jWjZzA&HO%@LV}A-FYITQSYmL$xP^_IlM;;mcPZ>u2 zDZ1WV!&*c2R152eCZw^e6^Njf0^rFXKS{6Go5z0P_b+^Go4RF10j38% z4!3^I{nZ@Q87xW>`Uhi14$oRw~bUGa#Y+XlfZGRxZ z&gJWPzTszAykpJ(SC2O5LR4N^r2M%rkgR`)zrOM!pFeeo1qioa=4-15jE;tc&LQa8 z?{aJs3W7KR1L7R{(GdCj^L%+NX3!sCqy2qK%gY2|nQZ^C$h&fdAk7AF91<2Om`%sc zI5AD|$|0?D%jhgk=68~6DZW)EC)fsm8NJbG7#n}3(br8Yj z8N;1z#0etB*137nI2H-r3`QtYp){wybU)+W8@M<|z4hEv^5)@PwA*d+zdcWS{ThPM z+t@=}`1yPOv1b45Hx@bA>tj8Spi!fI;j>)aTch1>6TkjTEFyC$e(YS6bbsqAIET_7 z?7`!Z5Fkl1thKYHaPxRyQD9LpdHXpYT5{y03Qh#!HVHTu2}K0Y8pH`s3gpS#&vAeC z2;bGvo*&|+37+T8m@0^KAPTKM2?h$z33=`c4wTB+c#Om;c@$w0#lre|1Yz3WN2DNO z?i}RDS3)Na=L%gH5v&aetA8tm%S(*6Hc^-V_>8=AsW_6&r570d;~ks`gZKL=1Hae^ zjqDLn_AM6nKSn$P*5x3L{PI^5)?TVHzTY#f=W>x$!wc_*q^02QJev= z`|lmRWPlcjlylzr_Y|`y+2*0(pu)m^*-v-OHYd=eX?|dXMOyz%yeQw;An3L>v@zGmr2tpL34R_ zP-wK)47aZX;Q1Eo`DAHEX{AMS&_jX%;s|j$;xe3Zj1wVnIe(?b;_bCzeC9{Iv3-Fk z%1ETjaOVcPQo(!R3I063fT>oAM+fZhY%*DWlvm$1AVM6E$;T7CMxE(}@AKAw0$iHV zyYepGolVlu{Gg}}eT_>a{CI@Y+5fK%qi&bRxwE&`hJs*2?x+pRr7ESxD$&saolb{) zANekm?k@F{t7w#LKJS|hBl1`w=>Jh0DudFRxOV^=Y`u=2PKm~20BUQei1zmZC@n3K z4h}K38tI^i%QJd=yO`Wj3QM33;vD6rMG(-H3R#-WPFTShI~OIy@n6qZp$Mmo!%hGI N002ovPDHLkV1gZ~!Ri12 diff --git a/tubelib_addons1/textures/tubelib_addons1_autocrafter_active.png b/tubelib_addons1/textures/tubelib_addons1_autocrafter_active.png index 6f3f59b49fba7fa0bdc0ab41f7f8ca2ce8d211d0..3e35ef1dd551e2736f56f5106ff7a32187e72295 100644 GIT binary patch delta 1845 zcmV-52g>-|6S)qM8Gi!+003RMnazgH5kqGS{<($c0hKe@e!BMxRwTu4G5iq;rRQT%weB*MGE!x@$YGSu(O?HMM3p zv0^jDeoND=c-FFk*|&?nImdcNu39j|bwkO0Nw{S=u3RzDr*XApHqfeguwFC9gHEquGs1I1 z%$#YiSuoSFgU_XH%9&@iV>ZQjM9-pfs#Y%4uYJgbP=C*-bknYT$BtUScSgsAP_tq+ z&7N@6uYk#zWVB;7#GPu$lVi`Lcg&b-ylXwoflR$@JiTr`(4%y}azVy>N6wyVuv#>& zTrtakOURdE%9v!ve@)DvZo+aw(yVvVu71?7e#CY|%b#V#d`i!zZ_b@((x!FNs&vSb zVXIm%$A5iD%AjbqjaJ8%U%ifE&Y*I|oMWw8F}7(qy_I0emtfPZcg>+^#*$dPi&w;* zXt!oK#d}D_iCf5&Wy+gv$fI(_pKZ*gaLu1%YRI2)%bRA;oNLIKXt!lK z&Yx}0pKQo~O22nTm4bM{f=|VHMWj$Gs8cP&pKQ*bai2>m%AIMfctN~#Lc@7P$BO!hwU&5DjyNYJPjbzB9aMh}O)~s&aw0O^?c*2!$(Wq$Et#ZGOVY-4|#+-J)j$6{N zfMgATzW@LO*GWV{R9M4furi%9-R`?hwM%WSnX~O$vtVXs6`SfDD~TC%k9GxQ`ZFl8 zbL_CvkY?uyHMM8wP}#sN!OkI+0c3Utseeym=UB#|#KC@F*{X_zT_Z@HgI#)>!4eL3 z<)Y;r?0v0M<2cx-Fifyg)#&kIGGlgRVrI(mJs7ZgWx=L1rxFZWQ^O zzW&VQMR#w{j8%vh)m@~k3#R=R>EC?u@)^T|)MJPAO=1<2MRj!q<+NwbN}e?fOn=LJ z=`VQodLBdJk%I@4k_6=xX3f$`^wVY(Q8*_8rsZXlD*B#2XE?~go{(RX=qJZ0l4vR4 z(X1sWq6MbCWb!3A*i#v-*g4J$msrX(pn-ZXcVVDh9>e_gvlE1cEmtwHu(7cr5dvO~ z!a0l8^B8`{sCNPz}^V>9*(D;b!TH*Pj50V+Uuq&vR} zQ_qPN3@*$8TMP{oJOMitb1)O;5!p4)!$+>)1KU6<4d3qB~N{&r{Kdons9{i2ZD) z$qzsZP~FfG-Z0t6Ufq_VrXqvsfw@{1x&rN0nh%`jE`QHZ6Y9)lUTm#~?nuV?)8>y| zoNXC`IoO%Z&$n5lJCZ*u%YWR7gWZ;)oSlQI*rClsr;%Sz)}t;gLZ?LpOsg#{2Ffur z)JU&)bhst!(H<6|CmX35CEDH+4W^B99qgp592uOP{yI6lk&V=e5=~1p3Qx(_5oH9^ zSFSsJ*!50>;m_}XKel?M8Es3+*3-+4>7BT3^(8R9@bXr>x1T;TSbzQc`SshEJ=L~* zb~8IO+u7JKIX0>62mAJ^KxSq|CnRqkRK4c=-!UYF*~KMP!%D(n#ltN#?pRm^6cl*(O$X-9(ei=R z@_|oEN(zan4`_}YEgwe92U?d8+~VTmNCam2z|F?O00000NkvXXu0mjfN@1Z^ literal 2524 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 T*1OMj{)Yj~jp48=BLwb0StGtd diff --git a/tubelib_addons1/textures/tubelib_addons1_biofuel.png b/tubelib_addons1/textures/tubelib_addons1_biofuel.png index 047391a0463d254b5bde287f84dd2a124cec6168..d91aaac264787d1a6894728d8a10e8ce43e66733 100644 GIT binary patch delta 1809 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 LNkvXXu0mjfy}~YH diff --git a/tubelib_addons1/textures/tubelib_addons1_fermenter_bottom.png b/tubelib_addons1/textures/tubelib_addons1_fermenter_bottom.png index 62c084e055b85743de127d101f03c96fbe8f14a6..d9d1ac8b92a6f1b39ea5fc8b6d27d2210dcbd0af 100644 GIT binary patch delta 1854 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 Cqz`NW literal 6006 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 diff --git a/tubelib_addons1/textures/tubelib_addons1_fermenter_top.png b/tubelib_addons1/textures/tubelib_addons1_fermenter_top.png index 52efab6c4d21976d05b9f93d78c4bd18cefad91f..d361b5f788201b0920808ccf1acf4edd6ae6db45 100644 GIT binary patch delta 1870 zcmV-U2eJ5^6VeWl8Gi!+002a!ipBr{00d`2O+f$vv5yP&da|jC@9dQbMNl; zM@UKM=<3A8z~SH6+}zjV;^0tGQI3s>LO?l6Oidwl&l$4R8osA(NAw@(z&Yo(~sdGU=K;GfxW-`m*M(9zAq%f`5ljfFTk zHNZ!e5a+G9UUCguz}2; zaLu4)%9v)%m}*v2OS87N;N$16tfh#BcCoRj$jZz{MnRRPyMm6MoS~|nvB%TV%D=z9 zbaQQ+o0rws)yTrM@A2?&ZDoOyq^+o%uBo5Dx__-vQBJ|YxVpHln3IIl)z>L0C7zdt z!M?7zwW=f|BZq{1v96ubrFNyFmz9>8y11r2J2-@eh1ax)wzH(hnO)ALYuL7l(5G<6 zkXh#A+qSo@iim%Zjef7Qy3)|btFpL=kdmdRtfHZvXmp2$h>LrQm8rbcc7>Ftz0hiP ze1D^{yQj6pVQ_tghJUcIu6=%f1Ox-Sw57U=R~j1^wT)KGpJl+9VsCMDiJ7X~*V2xX zmA;uQ*Z=?n@JU2LR5;6HSfu+?m+|7t0^T)iR$O0Gu;TXZ+l)Y79&f?o@2kC5>oRz8 zvfNsff1Q)%wyrlP3#0dKUQU+0TR`UGRev{sak8vp@M7W2&CT;>;mluklZEs8#U+b@ z0(bASaC+(J++pFo!>}}OQT|F^-W9j=d2jRbF3I)!?Omv&v)XHkj*eGhp{_0i1H;$l zKTe%rX8%vf#M*SC>ZsrP(=7WyZw0hlI7wnGVK*h z?s{^@ylktP*Vs9LN{-Gt;Ou;9+2OM)F4Lxb4&Bv0ZT|cz%iL#scx2B5N;7br(-OaM z;z%O5yQ z@{&LWY=X6Jj#h@nHHIJq7!B!HDhFgG+WM`Pk!+ayFd8Zqbu&bgzNP&!8xqo$iQ8#~M zF*DeTOdjS1>D(rdg@on7j^s09vkrGHQZ4aOUFotk+Gc4JmJ9ljUL!iuNljRqzEzmQ{-Qk<;qx=6^yq*6o6VwL1kZ zWvi5fk}M=j8-2l%HOoo-+v&u_7AB^k2OB3p+}L3xT_t5FW>HegzZM*ls)kn&X{tN4 z1~Ns2c5K+RX_vIDEGtk!nW*SmaAb8W^k--}c~n=SmcV8!W}4m9^Ob%31#0E53#QGs1K>Hq)$07*qo IM6N<$f)yn1d;kCd literal 2460 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 D!gc&> diff --git a/tubelib_addons1/textures/tubelib_addons1_funnel_top.png b/tubelib_addons1/textures/tubelib_addons1_funnel_top.png index fccbbb9060fbe7f594682d0b2c9c8a25485e209f..f18d0b60e5c0591fab2720642acf333675decb59 100644 GIT binary patch delta 1689 zcmV;K24?xr51tK>8Gi!+002a!ipBr{00d`2O+f$vv5yPhJ)~YXuxmiFa6-_da?`DP*|&?+v4pR2Mboc<)TnvawTI85b+>g$s%1N^ zYCof2HMDa^t!X}~V>+W@IjCVevT{VVdQGBQHJ(*5oK!H?v4PN|bkV4Cu5U!yxQxu8 zWXYIhtZhQrwSS1DU^k&#G`V?8wslCLSv0b4Lbh~Av~onARxzJhGq7zzr(ZauTQ;0h zFrQpBo>(%oaz)RmbJ3!3(5G?Ep>d^SInktZ&!=>&pe64Fh zBqk)ccuAvMHK}Aesb)K+VmPX1JEvngomeu`rgg}dVx(a=v2H=qtasC}gV3sY&Yo(t zbw|*lZnJhu$(LZvpKi#IUd)_muyaV)vxUx|Y_)hx&YfqRRxq4WFwLK9yo*%Ajb}uYS*_Z_S==$CY2bm0-o6ZOfl!&YyA8q;tTSV$Gv!(WG+6j$6s0 zY|Wu(%%yO>j$*}}W5|?c%bsw`oNlRRJ*sO!)2w>MiCfyZjm@5L*td$xn`_dndAWmJ z%$RDxjbgZYNz$ry(4ud?f>NMXG|H7_vw2L&n15)@rgYAraxlvchs?f z#*$dTf=|nvW}1n7&!B6+h*iRvY`Th9$d+ozpK-&LWYx2U&zx(+pKPmcLzz%6m4bMd zO)bipWXhdskx47htbNzEim-7)&!KM8u71j$ZqBB1w0cdZWIC*PLEN->)~s&NqUJV``BR5;6H5YCyIu=VZwe7)VfvvuXyWp8I=(^#LMDif13|MI=fnf44j zIa!to%ZhNaxaRP1vS=)1i{WJHj|VavoPXpNak8vpkY?euO_t$d;goffW8oC3@91LT z%vf=Tg|oSBQX~uKT!uN z6c;x+BwF?HbO^*jdwAu?Y**c*2GZp5Q`Iu{-U17#v$$PV1K&t z<*c>uzpP=%yKwqw+F^fDabsgMFC%?EUU6PtFx|+X=G^>gC4(&s=PAn!onFV$?XMHz|PJA1t7LZm5C%!PMU#@lchkCn;AoaLXC-JHs_rg3~aWmmri`a z%!RICFTcq|#_n^|81&fGQ-p-PL@^W?mRq=YROhP~@u1 zsO8{Q!HyDHW$b*)fm$tkx_|Nv+gUh)3JwaQMR%E@va;4k7EXBvZB7{%7<~ncRU@p=`k+;6fByY~G3v+>OpE*2nCRzj+^?H*-OG(;1XEujSfup6@@q zfRiQCsSBPr=YjI3E;w&)%UaFCId2k>nd#gB$(y#xi=(u4ii_Fw^ju|SmOq(xu_vV` jD?&XsHoSRXjy(W^3K9h(cdoDy00000NkvXXu0mjfOY~ek delta 1995 zcmV;+2Q>Je4bBgc8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-*m1QZ1&2nK~<000MDNklE+Q34T-NCFbdA|et3zCkv80}xWa0e@nd1q;L?3l^EMNTOgs zNQhOC&?FLMl9`F8$76T9yWQRQeTv1sz8+_WJd~8w_qM9))Z>4u>fEEQz4o%C%L#iQ z-Q>dghX^`-7KaDqX+p7>;diy$g`ASy+=ISM+8I!f3-uAr;HEo;J6;GMhhE9C^Tu35p-7}iYW4|(qAFV zauC6BG=GT2+_?T8>)jm|<0)>l!Q{j12yk%yHjZ!bJeO8GL=+tEjnP`;c$&@L2D!}< zU_M>Y>NFWE810Sklg~y|wByk3bxDb6g)Z4t;dVDLtDQDZ5z!0-2mllYL2HdxkR}0!J8 zrNAm(8`6~_M{CpxUnvxzpbk_ih1TkUasWpulme&FtoGMPrwiKaO|*7g-X2{hIsZJ4 zHU_dLD6L^oE;NHrj!mBL!f@b-}YcAw8f!`nlwwJ1&z1xSuYOm6;$CtC%m zi)fT0@H9cQgGv%83Zyb(t;O>^j4=#v4}U+Gb7Ksi=b@CG*-8`yag17&ZLi(cRkUef z{1$nhlBF3)iGawd(Gw&-Yv!k<>Sr3oB-3NUZl7jv3*BsB5P0*$PC1ztf4~d<6aQz( z^U6B7b@SFI1`q_n{miPKywIn4{vqCYzrkQIz`On`+V#A;2$MXoR>+y`zZgk{L4S=U zgTa7*y#6ZF*#rX+>|N!%TSv@~XNa{3x?cRn-Jd2S)>0hLkbnJ-Z}nrQ<0(2iJj5{p ze$XIDY^f}^>c%ezh7$zJKole?t{2d|{4hGtQbzk9kxrMiFJ7$kR$mSPr#Mz^=(Jau z9o!|IM@ST7R(39c2)4+X4fhZ$h<}u=^Q9DmoW8{hD9z3{pJcIr2OG!e>E11_Uehf5 z&!NzWNWE_-!{ZD2m+~RiFP}}gdQBr={Ta){2^x{Q3&M?VxuOu1R`={)NoksXs>28A zq-psLP)1{Ge<(00SibWLPp?~wc@ryV3+GZEQ+)08~VKht^8-|my=c|EuguvW0PLLh8l;sp|C z6j6jm6ss4m5Ug%j{>!~8tVIf`Gygn?QGdH%k7E&wwL+0wLAzl`!iV_F&I40?(Qz%@0AGH zDhLtb*H51#@HE=d9Nn3r9gT7n&2~T#dT66LI$E&0*1|CkcRn~cm4E#qw9zakOR_wp zA%Zb(U4%b+{1Q5!M>K|S@a^6n#`Un)B1H)oDAFjw_g(zJtt(S(fqz(A2bxAnHRk2P z@-(N&it>05TQr7m@Wkr-iU=u?YI`#ZMG2}G^tO%-}3+0}Q1#G#;Ug%c` zm^@HkhT5I3Eo#UhOr%;CE?ahndPlsws>NHU6QwY5@aRT&boh^-D7YfGoL z%v_YBum!e|`{a&iaDNM-NHVrAZS&thzfZHb!JS)U)V0@M7D>nC*%H@yctL|?X+Yrk z?hxa;glijQS%Tl)C|gNswARe_%5MYLGZ@z+&vL@e9_i5t@qLJ+YCCeQV_BqvZwtcC z+S$8deDUYJwf6{7l#@z}+3*g!*~ES7CH}H_1gF&^o*!{Iynn%R>skKvt^*>(@q%Kp z#OHt?qr3Y!g(VC^&<( diff --git a/tubelib_addons1/textures/tubelib_addons1_grinder.png b/tubelib_addons1/textures/tubelib_addons1_grinder.png index 88855b70d1f66558a42057f32c7d5aedec74e286..87e5c5825860c7cd6f5f85f7a1027149771d28c9 100644 GIT binary patch delta 1870 zcmV-U2eJ6x7t#)p8Gi!+002a!ipBr{00d`2O+f$vv5yPy}-P4Lb$uU#(+z$Trsz6JF8hQprfUhnVYg?HNwTmty(d)X*#M`F0f%U z!G27qsHsCH9LLJcv9h$meo4K*!K_{|v}ifg)z-0NG`?{_x_@px#DPt-W;nQQJkHP1 zNh1}(zrSKXGpJWBs8ub-f=$1{#J_e!s$4L>c}KczJjH`iuwOJn8VqMhJzO*-RW>ea zPDWceDYmz{JS84884!nvi8LM~^YQ-3VJbVI>Wd~`z|5L!q< zpP-`G+1f-zM3a=5sah_-eM!NAPPA)0ym3Iqg;Ke2K!1sQcZiFOR6I1Lnwc;X3u{?b zj(>ZeWkg;=IERIUIT;c@AQ*mdZNzp&hJb!G69{oyQBgTEoJS>NT3A~=FgX+oc4Awl zm5{;1#CTp+ZCqM7EGmqHerG{2nUWJQ zWPe{%eu9T}PCsp6T!Lj;sH?6;Ari8*w_jptAQ=^od2)_&Wl$*@8xj5+P{y5L@pZ^7Y$zTPwbbR_bsy$OFEm|BsI`a9p+ zeR6MXy8DFKMcE!OdO2+bk2LrW2q2R&0M(mOrw&9Z)3d&rI6LY-oE2UFxh>M*JG=yB zE2x6v_mnP&V|Ks);lWt({j2U{ZhxLd*$GL;JP;rNpqyajC`HcA-R|9ovYB@AJ>JuK zeM9sVfOQB!8Tfyc=__Jf`{b*kw1gwfh0&h#v&k;eezpj(03pEEu4^o}qOwn*wqFdAlH6BJlfPaDQl6c~F z`mHH{wWjR9<>e>EX_v>(=Eg>+8UKKnQ3`|czOFytE}HS6%&n+aO3$&_tFf*w1AZ(Z z@r^*MS5Bf=^7U)0fwEG+)kiBBv!urDbYkoNBvc9b3xiU|J)hsbXaD7SP|B8;mYq*F4XtZdajdZvZktmCwU|&&PRN z$EOzkic_$~j4zv3`@^M#ojVl0f#2 zY0t#o*I!Ws;KG351Q@03Qh$M4ZJWq-Y%=dcd)>f;^Bt9ORTL5l7YbA^>T3RA?txD~ zYbq3pP8Z&FE^NMet7Si(jsiG65V$A{nEE<7x$jE+BqPRkEJhq~^7}_`qeg%>!VHLn zXH-O}GS2vXQB&XYqknJzFAoPAyN=u9F~H%pTp)6()aQuM%*AyuuJ^cg7v{Ek=CjTr zm)0QPBm|;>MhlNbCX2o;wRSMm`-kk!es~I+Bdv{@DOV3PCjvnlE;SBL3e%Q;het}m z%K*g86+FH9D1voQ-P`@35bVLb(N=Kzi!{2!kwboiY+L+pK z1=|}SNK!755DB!%J$tB~ozz{9Tej@7cC>ah2n|AR$i9&O0evhgX#fBK literal 3038 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 diff --git a/tubelib_addons1/textures/tubelib_addons1_grinder_active.png b/tubelib_addons1/textures/tubelib_addons1_grinder_active.png index 704b17b203f105f8bee58c39b3e99056332a8873..1707d23951d7ee13e870f8bce2cb887c8a439c33 100644 GIT binary patch literal 3433 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 ADgXcg diff --git a/tubelib_addons1/textures/tubelib_addons1_harvester.png b/tubelib_addons1/textures/tubelib_addons1_harvester.png index 22f96f9eecbd975ab733cf679839b41be20217b2..412e6869c3779c52ade5b7b3cc6b627fe89525e7 100644 GIT binary patch delta 1803 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 Hu0mjfPcl(y diff --git a/tubelib_addons1/textures/tubelib_addons1_quarry_active.png b/tubelib_addons1/textures/tubelib_addons1_quarry_active.png index 8561d48bacbe9891642c7cc4122490442e850430..e7b5e81fcf434a6b0ae92121e3451a2658a8db33 100644 GIT binary patch literal 2231 zcmWlbdpr|t8^;%AMKwu}-cq9;Z=R%7isD&jh_@0wijqjfXqe4m*m4-p9GV<+T-(g~ zEIF3*X%0KsW|T`{a+vLm-fS7Um{* zz^(>?>=@rI3uwuJ(FL}hZpd3m2&D3b!sg>$Al^Z^bKMwH##5bvKx9&_ZrYf#*=$!= zS0a&^m6fHWqy%bgY;25-j0_M4nwpx?(a|X>DO@g>MxzbaL<`u2p*K`XRb*GX!~5FU zcDjeSATZHXRB9-w)#o=~;<1bdLT(OX?hZeE@cy>rh~zb;KNT~;_Ax?_N~$9IndtX* z&viUL@w5GgtD|^~rvn9eJ{vD82@sWs3JQG(atNY|Fn%^(@;ZE|nkvZgbAlj_8M_#oR2A9x3O8IEGgKYbNB8Pa^WYZ- z^ym5Vn0RqzD2I*XFtNhYXT4cooR=Q_T+gQPJEAgDUlyj3=FDOE3|2+y zZ;DGV-MufFs;%7bO7x;-PBHB_3 zH33#UhNm#kpU?6wAtHO?9C-{MQ87_e7Tig*6Xp;GvT?$)kX9P{ZH#MIymMQM_do$g zQsVXT4Y4l5p2KwSVR>@WUEakx*M*r?;jgzPJnGBzXiIYKj&~d^BJmh_es;h>E< z_pv6SCH!`CoP9IxaYOi{!BTuzmcM|F=fpqa=MbBt?t**Bh$it_Uc&NFPNGYH8m2u3 z-IwY6TY}YOoB?n-6i$ z2L4fdb{Iz;G&VMmI%uw*qarkjPzsvA^kXb|zOh}<4yRmZng_hyc($aYQ_Rq1>s1BJ zlcg8+@(nN;Mk8(z_7<8UouB`>(LLo7>|9wiD(i6Q*i+Y0|BV^9R|?bTpCM7+SH5U} z8+>kC8b|J3Ei+v!|LdsMZRbr@eM;5Ri{doS{g5XbZvQa$o%@W%e8cnP>}@Tl=g#P_ zHGCLDc`owoZW*pP4DmXbrpg$Sb&f+4)w^zK_>dM4A?NBC%%wfiWpsZEl=|7>mj6k8 zNjqZjLAs|}n-g*-Gtu1l$FQ}F0)qI(v+nC^>^Y@f^;r)WB;&!}ZHjIxG2z&IXa60a zBNsTmyQ_@8fJgqS^~5<%<@98?EKP=&X{U^gN3664S;t%U?egT8lv4jl9Xx*jL_)m6 z=kqPp&hRS3}u)Ong#}o3Z*U$comX=b71$p(^YU#-e6I8GFySbHDq){?M zca_Ea_>`u>gTKwnzjO!`UBwigZhlnTkz6DzZ6D1#CO$T~mp9dp?CPGetfDQh;T|mK z)RkFZEYg~FnvK(%Xt?K{R=v4rH7D1g?5KqD!f&YcIB%lCM~b@#{c`xltW46Dww!&R zo8;dULpF#?xuBq?QKrH-)QIC(YI*becNd2_+dntkVg(Cat@5Uofoa+1pI3e@jJ4k) zlNU1b1S>cQ5XsYUH=8ev=ImBzdQ)2H4 z>`d?GQ1E=(x^zsn=qGXd+@+0`&Wud^AT7zycZ=QgLnOPck6F+>`h_~3X1%Sy5GE&^ zUaTw9Ch-NZ0rShT0MQo!MoqIoYDV`fN;lD*39wKZ;Dr8m)rDwKRd@C)rATd@;t?GR zE28XOWnSe1Fxy44s=f+byB%4cXd)mBJ8u71tP*;drk59%SjaRBQRP( z_T;HG#r>s=k9U$G3*bGm)@XA1%^uIkV3w9lSg|oOKED zya1N{e(O!pb0PHnSuylHP7FN&uI|89unK}S+X26+DMkGf_R&|63yPElvL$GYMR1~>l z4*T13>+9_Y>RT}cVwrCZKVy(!1Tx@-T3;W70!gv}8Gi>c)j6z-I-zs~9s@00WDzp} z(1fd2*lOTb=pvN6OBY#(57S_s9CwoD-=Nn7!fIlp0G7Nxcgg6gZ2@DKOg#QoRs&3( ztVZ-sAYkZZHR34iMiyY^jG||=5z6v!5XvtF>sI>arLahmc-;z>4Fk|I+elumnrqnR%_?4C8uw|rhZZCx12~iTaIa4=lZu)x}Zy& zl)zuDhTA6pcE{@Jl3o;@0}sl<8EYb)k^iYWDM=+G)t=G$HA`x NVqt1&QfBNF{(mP*g7N?W literal 2978 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 diff --git a/tubelib_addons1/textures/tubelib_addons1_quarry_passive.png b/tubelib_addons1/textures/tubelib_addons1_quarry_passive.png index 86e86eb62b5dbbd70d6a6bf13965fd2925e62d06..a1be3f4ddaf5e8756560a1536d5a6c4e08c6e52b 100644 GIT binary patch delta 1370 zcmV-g1*Q6;3*rip8Gi!+002a!ipBr{00d`2O+f$vv5yPxoqbjq7<)vP75gwLgI z&!~0Nu6)d&ZqlrH$(wA?qjbxhXw$KS%9?1>rgqAmX}yhN%9Ul)t$WCrXw#;5%bRA_ zvVzK-ZqcG}&Y*M5oN3OVYRI2)x{6oGkzmT5Zpxi+)w6}ut$LM$c+sP9&YyC}kYClR ze9D+)&wre2(y4UMqjS};f!wrs&#ZmZu!O~lTg8Z5#*$dhpKa5uceZy>!k2T+o^RZ? zk)NOSkJ3_*td$yo^aBxf6t_N&Y^P2j$g!`XwRc|&Yy9^ooLdfbRqUdf?tvvNnj zh*is;anGW6*tdz#tbEU_e9o(U)va>6f?mIlTfdEA&!cz7oOaKlZqTE3*S3nxm}uF! zi+`Gle8ZJw$dYB(wu#lLe9M<<%$RD-m}}CofzYIN+sB>)0006NNklrsejQ^=GUxUAL=1hR~3nov<5knEJZkoR2c3U zL)6l$NOhqOVYRW607AQ3N+{kNdyMdK)=I(wlQvc%tOYe@=tlSV6GaFLk#NSeAt^a= zPgv-xQNgV`O=-OY{&sU;Z2YrHQ<0_cO4o>1qE}!R3N2nNvB?P8pjF)|Bid z4#f2ukq%~=cpwLQ%O)&<>4fb$Fn@?}1&l-TXAgz69Hz;GL>yQomnvabejgSrjo!Qi z9&0TuShmTcgeQb7*g~iTe(MpYxypKbNXgw^P-X>gn!eW-^oD!j)*4 z(O@rO5uH5Stm(coF$kFL>q{0Ww` zF=$OXJ0*PN8SWeiysa%Pzs4$0h%bGEcSn~%8K}C#Ygrh!L3ZW4e6V_gB3&U2G{fPL z{r!EM<^Xhs*=R5wJzV4Ya!wJ?F^jV`R+R+}%OM#b5q~eIYg|_a=_tSqgEdy$>Lav; zBWozfTjN4G7=QWokF_Cf3|&#KR-|c+DJ2F5W}}I+9E#DU1BS{Y~<`0Ie}i0lGpS{^LGfe}^zwpz1YV`NbdE zWW9XT!hdrW`NBZ?J!HGpz$|0xt^*Ey`2L6ZzE8j3XD}Gh>-F$`AK&-sbUJvRhi%)~ zwhh3oTekqXefu_PnzCB0n9XJcK|l}$OePafPEI&IJtYVNUVrh2l(C8Rn8_+g5lw#^ zDNVecKGJg7beW}~z1<;OgfzN!gfJENrdLUKzkh{knj073)|S8QY|8w>8{F_pFfJo83>?cqh!#3Y zH!c7JoFu_8Ov=>?soHIHkt3BNUY%@y0*f;hlfAhzC2r^|MWAy zvYoI97KnHLJ|^7!Zi1|Zn^@(se#300CH7Jo+%xpN?hwx7d5Y@EMX&bf0S&|iFkXfj8j z^{1<`=U><_7!HSEfW(04qc?fFTT!m+7h=Nbqc^$XonciCgt8n|o}rZDLdvZnlMtQc zlyQti8?^VXq0ywlWaIo&+Bn`8POnS&;1J<%`MiB!5e=TZkO35V%)QC>nos0O{C}w_ zE}*1TYd-I>E68FMQ#-!PSNmh6vNtZkay{hnU7l(`q*%6)+EFBNNR>)*ck?IN=%2@^ zY=O`fy4J+F`;!;7s+(YBn0Aj>e))%u3i#=(-{EiXeL%h6BP#{Q!CS9sodpzmgpwAP zQzMNewztLP?|()rh1=b&?9$hDn3o`AoJU$_>BGk>7_-%L{)ALAHGbYD}M1yDf z&BrEaO_GF^VT5WmNw0s8-~ZdD$}^^a{h0CbA^DTfpJzi$P~|aJvceF>|9{Vh@pw$@ z>XpxALybl{{7*KlxgKuEBR-ok91i)?Gv6i}k7!;R;L38{n=NC?#6TlHCmR|jh7csv z83>TgCL&FV!}Bw}vAsh)IbTw4w@bd5V>TM(iz!uEFg+b%mKCn!f-uolMXlQb4WeGB p$TPIo7>33)CFlyRHRy`}02C(htzz)?e1QM}002ovPDHLkV1g!}v3CFf diff --git a/tubelib_addons1/textures/tubelib_addons1_reformer2_bottom.png b/tubelib_addons1/textures/tubelib_addons1_reformer2_bottom.png index 245b784dc8d19363add66079017b3ad21adab0d8..994be75b06a158993276c762e29f98cbe9d782cc 100644 GIT binary patch delta 1713 zcmV;i22T0G4z>-D8Gi!+002a!ipBr{00d`2O+f$vv5yP~Duyu8HiHV67ez{#;U2bk}YHDieQW(!=JZ)`lSy@?SWo2t?Ymk(W zO-)TqOiazq&0bz!jg5_1SXg9aWM*b&!ATokUS3gAQCwbLTYp|%S65eDTwGjTT}4Jk zW@uOzj0G!Wn@=aSW;3_MMp+wX=!9= zXl7?;SXx?HS$|tuT3JgUp=ZjS zY0su_$(Uu&sB@F2yqU4cuf5B)d10knJ+!{a&Zl&is=v>ub=0qZhKP!zw#(D4drnSJ z)va>PqiWHpXxy}T)~s%IY-rZ9gQ2y@)vA1kmVc(wrgopV&X}ykji9lIn6by#=7pB1 z&YyC}kYAy-%g&*4slwY2-WhkTW?oy@vxUgi<)O67zlc??#@oo4WW$|myo*i*5ctENv1E2YH^3U66;ObP{Q32`QtOi9^%?99XW zuX`R^InC|X;5hAFv%CnyMAGpJ+E|Tb$&B=K_uhW_(d*U$rP3vb5wZvrQ4>T|V}D7O z@Xvks_1Ev8A8s>B5CH|H8-jBwr$~wi3?xDLdzC2ZRkDOvht5tduG7cLe4&AeQ_%6F zfj}Z5iUf=@3?Hcrj+NCzker^5tOIWGk3bWEm$S%fK?5vWPaCTs2TueOGIqZolC5(7k3>l-;XmPz2Fko0i%rUuX9GXL4k04a(3eaijSX)t9 zjnj-skdsr)P)g&YQCP;JvZQ_?bRP03mHVo3e-iqq$4RJad!PzXhZ zpACyL$hEDSv_o~v(poZ1ZsE#({-joizX2Z!@=P zt9F2)`}Uo?ckS83P( delta 1853 zcmV-D2g3Na4Z#kO8Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm0004y z0004y0U`J6egFUf2XskIMF-&u0uB{3bB-9L0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbTsYygZR9M4}mrZP3R~5&9=e{@N8Gpa=*pBUK>^e#&IJm7q zDq>N@qKcqofe@ks2}BosNi0|c%dU{vAhBS>f^8)bNaeFE8YTyA?zKobYTfp0n72h zAyV=|eIB-UsZ5kn1wjB!*AT#n5M!d%YGF?8jEVsf5PuL62ST7WHN}5!zRODUS(Y!q zz|`yv9^jYC%*>smTrM*V4{2?0Af8E839uKxR*}i>)i{~cMQN(fB=jbHFMwZ378IBKHl<6ZDL^A;SObYI|Zns-3ff19U zBuBPdHQ4J_+XzqH{atITMfQs+#Cy7iXbvHurR;C zetRE3sRin4B}Ux-n$<3U^-Cq*_^(pB{Tt@z=lNOpMSd9kn|8a+xOy354AFR;3kIx^ zWiu}6etX|#0HE1y7SI8R7O^KFo)A;EnYE5Xs(*;8BdQ3R1C#(sNto0ljTDH4GZP93 zKWZc!8^OeUu(7g|Yf8f8`AiFf$wjKUAB$j~Fr41NDxz`vb88t967riQdQdb@l|^~d zJ_-5{EklgL#)QNO#8Q;FJSq8;T43$k&k*QcUix{12_bBaq6 zTV%pLvoODq*{}sg5zjl5>Zi?u#vd*q_lF3^7(CCzcm|bBc_uLgGy=7*cB)ULw|)eQ zq}kY5O`=)!k+oQBvAJfHIU$0GDRi&A?0*s|dB*jxm4#`({I8$$Qs|}6wmj`~3F(?;^n4gA&(fMk#=Azw;v$c;mtsVrOGq(c3&fE(1js|>@3LBr(oK`=quMhpb~e&Y&iC6cAjwpf zmNq6~+6#gp0JRv&ku4`WV+^WF`EWPAw==iGgZV230w#b~s}a}Q?>i#KDJ>eA+o;)W zX3fX~}+tS=OK#gE8xx0h`+T@`C>aw-GB^9-JNU~IvN z{KODMJZz$ViQj7C6g;js+-bf{=hUhA*VR|}%Fgf7BbjKncJxkc>Ffm=jj0au%mtN!g{VRmwn4#7<+S$bf0j1CW zfWLRI;MHpMPY!7BY|=ab1>X9=16BI{E>X8fX}Zqf%GbF0U;;ZD(z*Kq`#YPAR=>{m zy(K6c>?ow%KS9ixVSn?hym#_(#)A`#pscN}arNp|D)sY(`}<5^ZqnJ?O7AO*Ujc7? zoZhq1n8|95>THeh_<*&wH9q~ytMvBws4tzT>PP9b!=sR>FDQmmrIy||r3!NE&DT}L zLyV!{IRFEGy^a|S2xGIDT6~tU-F9!ub90OiAK^_+F*@vEqc$;})*fDDsaC3BJk(ky r=Vn2{1OemGFt%a$dPnm9sh0l(kRGzf4t@AF00000NkvXXu0mjfb;^K< diff --git a/tubelib_addons1/textures/tubelib_addons1_reformer2_top.png b/tubelib_addons1/textures/tubelib_addons1_reformer2_top.png index 8f757e440db737d2efb2ae2d2c2f012de7121d5b..52ff340f44a46af34474923fdee921a5f2e1770e 100644 GIT binary patch delta 1735 zcmV;&1~~bz4$KXZ8Gi!+002a!ipBr{00d`2O+f$vv5yPW@lzaMMYIr zRashDUteESQ-4!FK0aPyU}9ooWn^TLk&)Q7h-+?bT3cFPUS3pJS3*NVLqtSRQBY%K zWJ*g*yS}RR#jSFURYXMS6EkEUtU8-MO<85T3TC7PEBTHWq(yzS7c{qR##S5SXfq7RYyoj zS65nidU>9no}jnOla!O3oSc)Xzlw{Cn5@CpvxSzbz>T1_%%Eg|fPmAdc*~w}*0O@m zpK8yhZpf2k#+hBwsB+Pzb8K&I(4lV6qH@otbJDGOTU}gDP)~GpbXHqgSyxwba&m%# zf>cyifq#R7Y-(w5ZEA3Ea8_7arKP5ajg^FtnTwgJu&}Vrooa`Nhk}EOhM20CsJ@)A z#-p*jr?td=etx31&4`ea(5iT#qM@d}(44Hmp|{XyX==!qVrq4Kdy17|aD9rDon~if z&!cjXqPEPOX^xhmsl3$8pKi#KVR(9a$CY1bbbp7Gq`A|kcX^AOji0cdvBz_Dc!83n z&!l*po140dSI(Vh)vzor#Q+pP{IBg_N70r^TOb!<}fzmtd!`xXz(*(xr94m}1qj zfLIXevH$=BYDq*vR5;6Hh)cTv;L@4a&Q~cZ$=)d+ldY_*Qd>Lw>w69!K6mxuvu=io zJX}}ej(PKNc_$_CaHamR>fzyf(g9>{ZGY-|#KZN1A(o5hLR)Jaq+~qpMT87)4_1>THCP$yAzYGZYNqL_W$`m@!!u0?XNGd?_07rcEZb~ZUzR1 zC^H3f7bYeSQ6EuuP8N0+PIgNvcL5VYc}e}}KxsBceOHJA-cP(x1s>7vMgk`CVSoD9 z*%(14xH_3jF^P*PDk?%1s9L&D6)|rj)!NF@S3O6CzH$%vbS<;Px4QNEEzmt@?xCl^z58MPxbxk7$kOH6q404zMY{Q{92GN^V>Woj#K)hFiC;XwJbztFE6qm2 zI22@pl5jE5gelWi)*O;)_EN5GmQkLoY^SB=Zzy5R0JcJST468;2ZxwJFU$?97FrsU ziY6-=gB-~iA}pj62~r>?2K5CKKcAY0W`QAd0N4aQpaN4A1+1(VlhSj9?U@5WvB{_; zEX2gh!NDzNZ4Fi6>1jGi+kdVIY66>{pb#r7HwU+hwE^4;Q)z8&BYWmRaAZjc3OVEh zO%N3|fLp;QEvsQ-m=_3+EG0n!Ij|LCFa`Wfd>Yzng7SHR;EBRJ72=?WDBeZe8N>(tE;pTE7idz?F%Pg+gQM4mYi99a@VLUOF!+}t8t_MNDE z-`H?^=Q0;QSy{DALmNj>qGgZ}a296*hNSblO?yt>xLDJ;e8FtfEI(OcdHX0(I5373 zYl6LLwyJXD{-Z~BR6y1&oWm#UCo5=X69tY734z>QAQOUCuUxx%`?iJ^b&EXs{L(d? dgMf}?002&e-Spt64)Fj0002ovPDHLkV1f)IAZq{s delta 1835 zcmV+`2h{k?4X+N68Gi-<0047(dh`GQ00v@9M??Vs0RI60puMM)00009a7bBm0004y z0004y0U`J6egFUf2XskIMF-&u0uB`yPmTO^0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbTmq|oHR9M4}mpzOeSrvu9`>Lw{yMJfeGhH_0HJ+ANHqM+N zw1^)|7(uWiAwWbxxEl}=6A=;-Be7%<5kR;g3qrtJp~XU$!Fbngue+ybJU`Xd-Bs^h zf>%}DGds(;q*0fiUcGzYx#ym9M;`wEXS$rdV)X1IuD$Vj8XKP@*_)6r7ue*8`o<;f zYz8Q`E0>9)I)5i0J;mCb_8ZrT>J3l@K*VtLVuVeOsc&ph?{ASE?vw8Cqk-c%nX}pJ z(%g~( z`Qij4DEIH*=kDFRGn3U-AO7yADq$T_hdnuAu}BHR5J3pKJ)&BJ{OA>VwxqEY zGoQXh6@OHf`sM~UU$Q^>gdnQXX?1Y(6v41uWHc^qLYiXptk~Zp%W_a92n?tr{6}^R zGI;NozoygaV2q*D>G%)o#{h(3NDu}nBLw9)n{V^O^nJFsoBTX^i=VVVU~g}a_nP;3 z``K?%RUFD<{*)qHmdhoJ`G2w2k<1d_{qZ{>V1L@}HskRa5kW-w%tyhYp#0xQ05!$C z_&-DtEfx%j2xVN8BnfdGUNlJ(PeSk; z)M<6=_2AX7Q!b={F<=BIQgEO^cI`W33}sxCB#B>j4sfU`smrP06%Q_eKvh9Zfq-CC z5d=MRW*N64Ap%B(z*FW_?bkZ-wH_%5tbfLH&dG{j>+L=sk9`T^I0lg_fFRYzFbs*J zXsxe>AI<+*1v~HEh%cewFBAY+t;$;JKpe+}B^08oo)<9{3U}_@A=*4qx+_*syhNSb9e?R#T>J;l-Rn;;^Rf56xz{4ei;6G5a23elt@|=T%1N!|wQ5118gdVm6zxySvMyM~}F9 z^CllZdxlrwf|$l&tp%Wr8&(9f7Jn58R8b?S^+cM@W|bkmIywY(H0w>0B%#@CG8&E8 z+S(#X5=4Xt4<4YZ{PpjD1E&}xsDeSUD45mlDiV&zV<=f~j5m(+IPVlx_*LT@)zaDb zQbVL5B87Nq(P6?$6XG~tnUS7jD(9)(1v*r*+#8tUL@cZa5qcan7v*p-^_UGoA!)$uw;xGF(GDFjnVv=n^c(`Mw^S*oF&?%P5g;q?z%TmB{O~%nG$V4hYCkQzO2PRL z@e`TDs3+i)Cr?&pRN8L<*y795ILg}2=S#Z1O};m*aWW5iHl2|^pMTPB)VMml#Sg|K zj;A%!#bR|yRSaOynFr!HCLC-JnCwkf>@B8Wr>7y!vJ5eXtHaya#s=HleQchQE*7*} zEna*wqTe($uUzNx<9`xHkxxRT&<4df!kKxXG=-|XvYOk<`A}6kJUn1{>kIVa>jXiK zTCIjL&}=ra4m#aFd4Jd?YPIRLTa|2@A_+h4d4VdmWH=nIl+YEb6`UDNOB5FKC0B>H z$)gr=f0IB%X2(Z-_`w4f`HZiB>pL7D9dno-5Cj6t@#^HnGc`d|{bqIWL|+#z?{!-?~S7cuW`s)LWYzCnRarVzwOd0#j&$*M(9C Z{s;Dwb7R|rJv#sZ002ovPDHLkV1hCuU6TL+ diff --git a/tubelib_addons1/textures/tubelib_addons1_reformer_inventory.png b/tubelib_addons1/textures/tubelib_addons1_reformer_inventory.png index fe9d3d6ce3448aa8ab4f064b0e232851a7c28807..171ece1ff023e341ff696c22d5d2b2f9a78f8de9 100644 GIT binary patch literal 5480 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 diff --git a/tubelib_addons3/chest.lua b/tubelib_addons3/chest.lua new file mode 100644 index 0000000..3a1159e --- /dev/null +++ b/tubelib_addons3/chest.lua @@ -0,0 +1,137 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + chest.lua + + A high performance chest + +]]-- + + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + minetest.log("action", player:get_player_name().." moves "..stack:get_name().. + " to chest at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + minetest.log("action", player:get_player_name().." takes "..stack:get_name().. + " from chest at "..minetest.pos_to_string(pos)) + 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.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;main;0,0;12,6;]".. + "list[current_player;main;2,6.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +minetest.register_node("tubelib_addons3:chest", { + description = "HighPerf Chest", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons3_chest_bottom.png', + 'tubelib_addons3_chest_bottom.png', + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_front.png", + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 72) + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec()) + meta:set_string("infotext", "HighPerf Chest") + end, + + can_dig = function(pos,player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + + on_dig = function(pos, node, puncher, pointed_thing) + minetest.node_dig(pos, node, puncher, pointed_thing) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + 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_craft({ + output = "tubelib_addons3:chest", + recipe = { + {"", "default:steel_ingot", ""}, + {"tubelib_addons1:chest", "default:gold_ingot", "tubelib_addons1:chest"}, + {"", "default:tin_ingot", ""}, + } +}) + +tubelib.register_node("tubelib_addons3:chest", {}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return get_stack(meta, "main") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + tubelib.put_item(meta, "main", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + + on_recv_message = function(pos, topic, payload) + return "unsupported" + end, +}) diff --git a/tubelib_addons3/depends.txt b/tubelib_addons3/depends.txt new file mode 100644 index 0000000..278e6ab --- /dev/null +++ b/tubelib_addons3/depends.txt @@ -0,0 +1,3 @@ +tubelib +tubelib_addons1 +default diff --git a/tubelib_addons3/description.txt b/tubelib_addons3/description.txt new file mode 100644 index 0000000..317b0eb --- /dev/null +++ b/tubelib_addons3/description.txt @@ -0,0 +1,2 @@ +Tubelib Extension with High Performance nodes + diff --git a/tubelib_addons3/distributor.lua b/tubelib_addons3/distributor.lua new file mode 100644 index 0000000..0357a20 --- /dev/null +++ b/tubelib_addons3/distributor.lua @@ -0,0 +1,491 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + distributor.lua: + + A high performance distributor +]]-- + +local NUM_FILTER_ELEM = 6 +local NUM_FILTER_SLOTS = 4 +local TICKS_TO_SLEEP = 5 +local CYCLE_TIME = 2 +local STOP_STATE = 0 +local STANDBY_STATE = -1 + +-- Get one item-stack from the given ItemList, specified by stack number (1..n). +-- Returns nil if ItemList is empty. +local function get_this_stack(meta, listname, number) + if meta == nil or meta.get_inventory == nil then return nil end + local inv = meta:get_inventory() + if inv:is_empty(listname) then + return nil + end + + local items = inv:get_stack(listname, number) + if items:get_count() > 0 then + return inv:remove_item(listname, items) + end + return nil +end + +-- Return a key/value table with all items and the corresponding stack numbers +local function invlist_content_as_kvlist(list) + local res = {} + for idx,items in ipairs(list) do + local name = items:get_name() + if name ~= "" then + res[name] = idx + end + end + return res +end + +-- Return the total number of list entries +local function invlist_num_entries(list) + local res = 0 + for _,items in ipairs(list) do + local name = items:get_name() + if name ~= "" then + res = res + items:get_count() + end + end + return res +end + +-- Return a flat table with all items +local function invlist_entries_as_list(list) + local res = {} + for _,items in ipairs(list) do + local name = items:get_name() + local count = items:get_count() + if name ~= "" then + for i = 1,count do + res[#res+1] = name + end + end + end + return res +end + + +local function AddToTbl(kvTbl, new_items) + for _, l in ipairs(new_items) do + kvTbl[l] = true + end + return kvTbl +end + + +local function distributor_formspec(state, filter) + return "size[10,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;0,0;2,4;]".. + "image[2,1.5;1,1;tubelib_gui_arrow.png]".. + "image_button[2,3;1,1;".. tubelib.state_button(state) ..";button;]".. + "checkbox[3,0;filter1;On;"..dump(filter[1]).."]".. + "checkbox[3,1;filter2;On;"..dump(filter[2]).."]".. + "checkbox[3,2;filter3;On;"..dump(filter[3]).."]".. + "checkbox[3,3;filter4;On;"..dump(filter[4]).."]".. + "image[3.6,0;0.3,1;tubelib_red.png]".. + "image[3.6,1;0.3,1;tubelib_green.png]".. + "image[3.6,2;0.3,1;tubelib_blue.png]".. + "image[3.6,3;0.3,1;tubelib_yellow.png]".. + "list[context;red;4,0;6,1;]".. + "list[context;green;4,1;6,1;]".. + "list[context;blue;4,2;6,1;]".. + "list[context;yellow;4,3;6,1;]".. + "list[current_player;main;1,4.5;8,4;]".. + "listring[context;src]".. + "listring[current_player;main]" +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local list = inv:get_list(listname) + + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + if listname == "src" then + return stack:get_count() + elseif invlist_num_entries(list) < NUM_FILTER_ELEM then + return 1 + end + return 0 +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local SlotColors = {"red", "green", "blue", "yellow"} +local Num2Ascii = {"B", "L", "F", "R"} -- color to side translation +local FilterCache = {} -- local cache for filter settings + +local function filter_settings(pos) + local hash = minetest.hash_node_position(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} + local kvFilterItemNames = {} -- { = true,...} + local kvSide2ItemNames = {} -- {"F" = {,...},...} + + -- collect all filter settings + for idx,slot in ipairs(SlotColors) do + local side = Num2Ascii[idx] + if filter[idx] == true then + local list = inv:get_list(slot) + local filter = invlist_entries_as_list(list) + AddToTbl(kvFilterItemNames, filter) + kvSide2ItemNames[side] = filter + end + end + + FilterCache[hash] = { + kvFilterItemNames = kvFilterItemNames, + kvSide2ItemNames = kvSide2ItemNames + } +end + +local function start_the_machine(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", TICKS_TO_SLEEP) + node.name = "tubelib_addons3:distributor_active" + minetest.swap_node(pos, node) + meta:set_string("infotext", "HighPerf Distributor "..number..": running") + local filter = minetest.deserialize(meta:get_string("filter")) + meta:set_string("formspec", distributor_formspec(tubelib.RUNNING, filter)) + minetest.get_node_timer(pos):start(CYCLE_TIME) + return false +end + +local function stop_the_machine(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", STOP_STATE) + node.name = "tubelib_addons3:distributor" + minetest.swap_node(pos, node) + meta:set_string("infotext", "HighPerf Distributor "..number..": stopped") + local filter = minetest.deserialize(meta:get_string("filter")) + meta:set_string("formspec", distributor_formspec(tubelib.STOPPED, filter)) + minetest.get_node_timer(pos):stop() + return false +end + +local function goto_sleep(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", STANDBY_STATE) + node.name = "tubelib_addons3:distributor" + minetest.swap_node(pos, node) + meta:set_string("infotext", "HighPerf Distributor "..number..": standby") + local filter = minetest.deserialize(meta:get_string("filter")) + meta:set_string("formspec", distributor_formspec(tubelib.STANDBY, filter)) + minetest.get_node_timer(pos):start(CYCLE_TIME * TICKS_TO_SLEEP) + return false +end + +-- move items to the output slots +local function keep_running(pos, elapsed) + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") - 1 + local player_name = meta:get_string("player_name") + --print("running", running) + local slot_idx = meta:get_int("slot_idx") or 1 + meta:set_int("slot_idx", (slot_idx + 1) % NUM_FILTER_SLOTS) + local side = Num2Ascii[slot_idx+1] + local listname = SlotColors[slot_idx+1] + local inv = meta:get_inventory() + local list = inv:get_list("src") + local kvSrc = invlist_content_as_kvlist(list) + local counter = minetest.deserialize(meta:get_string("item_counter")) or + {red=0, green=0, blue=0, yellow=0} + + -- calculate the filter settings only once + local hash = minetest.hash_node_position(pos) + if FilterCache[hash] == nil then + filter_settings(pos) + end + + -- read data from Cache + -- all filter items as key/value { = true,...} + local kvFilterItemNames = FilterCache[hash].kvFilterItemNames + -- filter items of one slot as list {,...} + local names = FilterCache[hash].kvSide2ItemNames[side] + + if names == nil then + -- this slot is empty + return true + end + + local busy = false + -- move items from configured filters to the output + if next(names) then + for _,name in ipairs(names) do + if kvSrc[name] then + local item = get_this_stack(meta, "src", kvSrc[name]) + if item then + if not tubelib.push_items(pos, side, item, player_name) then + tubelib.put_item(meta, "src", item) + else + counter[listname] = counter[listname] + 1 + busy = true + end + end + end + end + end + + -- move additional items from unconfigured filters to the output + if next(names) == nil then + for name,_ in pairs(kvSrc) do + if kvFilterItemNames[name] == nil then -- not in the filter so far? + local item = get_this_stack(meta, "src", kvSrc[name]) + if item then + if not tubelib.push_items(pos, side, item, player_name) then + tubelib.put_item(meta, "src", item) + else + counter[listname] = counter[listname] + 1 + busy = true + end + end + end + end + end + + if busy == true then + if running <= 0 then + return start_the_machine(pos) + else + running = TICKS_TO_SLEEP + end + else + if running <= 0 then + return goto_sleep(pos) + end + end + + meta:set_string("item_counter", minetest.serialize(counter)) + meta:set_int("running", running) + return true +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") + local filter = minetest.deserialize(meta:get_string("filter")) + if fields.filter1 ~= nil then + filter[1] = fields.filter1 == "true" + elseif fields.filter2 ~= nil then + filter[2] = fields.filter2 == "true" + elseif fields.filter3 ~= nil then + filter[3] = fields.filter3 == "true" + elseif fields.filter4 ~= nil then + filter[4] = fields.filter4 == "true" + end + meta:set_string("filter", minetest.serialize(filter)) + + filter_settings(pos) + + if fields.button ~= nil then + if running > STOP_STATE then + stop_the_machine(pos) + else + start_the_machine(pos) + end + else + meta:set_string("formspec", distributor_formspec(tubelib.state(running), filter)) + end +end + +-- tubelib command to turn on/off filter channels +local function change_filter_settings(pos, slot, val) + local slots = {["red"] = 1, ["green"] = 2, ["blue"] = 3, ["yellow"] = 4} + local meta = minetest.get_meta(pos) + local filter = minetest.deserialize(meta:get_string("filter")) + local num = slots[slot] or 1 + if num >= 1 and num <= 4 then + filter[num] = val == "on" + end + meta:set_string("filter", minetest.serialize(filter)) + + filter_settings(pos) + + local running = meta:get_int("running") + meta:set_string("formspec", distributor_formspec(tubelib.state(running), filter)) + return true +end + +minetest.register_node("tubelib_addons3:distributor", { + description = "HighPerf Distributor", + tiles = { + -- up, down, right, left, back, front + 'tubelib_distributor.png^tubelib_addons3_node_frame.png', + 'tubelib_distributor.png^tubelib_addons3_node_frame.png', + 'tubelib_distributor_yellow.png^tubelib_addons3_node_frame.png', + 'tubelib_distributor_green.png^tubelib_addons3_node_frame.png', + "tubelib_distributor_red.png^tubelib_addons3_node_frame.png", + "tubelib_distributor_blue.png^tubelib_addons3_node_frame.png", + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons3:distributor") + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + + local filter = {false,false,false,false} + meta:set_string("formspec", distributor_formspec(tubelib.STOPPED, filter)) + meta:set_string("filter", minetest.serialize(filter)) + meta:set_string("number", number) + meta:set_string("infotext", "HighPerf Distributor "..number..": stopped") + local inv = meta:get_inventory() + inv:set_size('src', 8) + inv:set_size('yellow', 6) + inv:set_size('green', 6) + inv:set_size('red', 6) + inv:set_size('blue', 6) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + end, + + on_receive_fields = on_receive_fields, + + on_dig = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + 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:distributor_active", { + description = "HighPerf Distributor", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_addons3_distributor_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_distributor.png^tubelib_addons3_node_frame.png', + 'tubelib_distributor_yellow.png^tubelib_addons3_node_frame.png', + 'tubelib_distributor_green.png^tubelib_addons3_node_frame.png', + "tubelib_distributor_red.png^tubelib_addons3_node_frame.png", + "tubelib_distributor_blue.png^tubelib_addons3_node_frame.png", + }, + + on_receive_fields = on_receive_fields, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + 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:distributor", + recipe = { + {"", "default:steel_ingot", ""}, + {"default:gold_ingot", "tubelib:distributor", "default:tin_ingot"}, + {"", "default:steel_ingot", ""}, + }, +}) + + +tubelib.register_node("tubelib_addons3:distributor", {"tubelib_addons3:distributor_active"}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "src") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "src", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "src", item) + end, + on_recv_message = function(pos, topic, payload) + if topic == "on" then + return start_the_machine(pos) + elseif topic == "off" then + return stop_the_machine(pos) + elseif topic == "state" then + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") + return tubelib.statestring(running) + elseif topic == "filter" then + return change_filter_settings(pos, payload.slot, payload.val) + elseif topic == "counter" then + local meta = minetest.get_meta(pos) + return minetest.deserialize(meta:get_string("item_counter")) or + {red=0, green=0, blue=0, yellow=0} + elseif topic == "clear_counter" then + local meta = minetest.get_meta(pos) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + else + return "unsupported" + end + end, +}) diff --git a/tubelib_addons3/init.lua b/tubelib_addons3/init.lua new file mode 100644 index 0000000..be003d1 --- /dev/null +++ b/tubelib_addons3/init.lua @@ -0,0 +1,15 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + +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 diff --git a/tubelib_addons3/mod.conf b/tubelib_addons3/mod.conf new file mode 100644 index 0000000..c545ead --- /dev/null +++ b/tubelib_addons3/mod.conf @@ -0,0 +1 @@ +name=tubelib_addons3 diff --git a/tubelib_addons3/pushing_chest.lua b/tubelib_addons3/pushing_chest.lua new file mode 100644 index 0000000..07dc1bd --- /dev/null +++ b/tubelib_addons3/pushing_chest.lua @@ -0,0 +1,203 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + pushing_chest.lua + + A high performance pushing chest + +]]-- + + +local Cache = {} + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + Cache[minetest.get_meta(pos):get_string("number")] = nil + minetest.log("action", player:get_player_name().." moves "..stack:get_name().. + " to chest at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + Cache[minetest.get_meta(pos):get_string("number")] = nil + minetest.log("action", player:get_player_name().." takes "..stack:get_name().. + " from chest at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + Cache[minetest.get_meta(pos):get_string("number")] = nil + return count +end + +local function configured(pos, item) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local number = meta:get_string("number") + if not Cache[number] then + Cache[number] = {} + for _,items in ipairs(inv:get_list("main")) do + Cache[number][items:get_name()] = true + end + end + return Cache[number][item:get_name()] == true +end + +local function shift_items(pos, elapsed) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("shift") then + local number = meta:get_string("number") + local player_name = meta:get_string("player_name") + local offs = meta:get_int("offs") + meta:set_int("offs", offs + 1) + for i = 0,7 do + local idx = ((i + offs) % 8) + 1 + local stack = inv:get_stack("shift", idx) + if stack:get_count() > 0 then + if tubelib.push_items(pos, "R", stack, player_name) then + inv:set_stack("shift", idx, nil) + return true + end + end + end + end + return true +end + +local function formspec() + return "size[9,9.2]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;shift;0.5,0;8,1;]".. + "list[context;main;0.5,1.2;8,4;]".. + "image[0.5,0;1,1;tubelib_gui_arrow.png]".. + "image[7.5,0;1,1;tubelib_gui_arrow.png]".. + "list[current_player;main;0.5,5.5;8,4;]".. + "image[0.5,1.2;1,1;tubelib_gui_arrow.png^[transformR270]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +minetest.register_node("tubelib_addons3:pushing_chest", { + description = "HighPerf Pushing Chest", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_addons3_pushing_chest.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_addons3_chest_bottom.png', + "tubelib_addons3_chest_out.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_front.png", + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 32) + inv:set_size('shift', 8) + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib_addons3:pushing_chest") + meta:set_string("player_name", placer:get_player_name()) + meta:set_string("number", number) + meta:set_string("formspec", formspec()) + meta:set_string("infotext", "HighPerf Pushing Chest "..number) + minetest.get_node_timer(pos):start(2) + end, + + can_dig = function(pos,player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and inv:is_empty("shift") + end, + + on_dig = function(pos, node, puncher, pointed_thing) + minetest.node_dig(pos, node, puncher, pointed_thing) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_timer = shift_items, + 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_craft({ + output = "tubelib_addons3:pushing_chest", + recipe = { + { "", "default:tin_ingot", ""}, + {"default:chest", "default:gold_ingot", "tubelib:distributor"}, + {"", "default:steel_ingot", ""}, + } +}) + +tubelib.register_node("tubelib_addons3:pushing_chest", {}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + local item = tubelib.get_item(meta, "main") + -- check if one remaining item is left + if meta:get_inventory():contains_item("main", item) then + return item + else + -- don't remove the last item (recipe) + tubelib.put_item(meta, "main", item) + return nil + end + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + if configured(pos, item) then + return tubelib.put_item(meta, "main", item) + else + return tubelib.put_item(meta, "shift", item) + end + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + + on_recv_message = function(pos, topic, payload) + return "unsupported" + end, +}) diff --git a/tubelib_addons3/textures/tubelib_addons3_chest_bottom.png b/tubelib_addons3/textures/tubelib_addons3_chest_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4369e368d41b853e698c8237767d9f914187c04b GIT binary patch literal 752 zcmVG&CIJjszylgzeaY4d&M8SJT$9qW2eoD=MM$Ldt$bwA9g-y(b zPs)o{pP!wsu&lYcx4yu=$;!vg&&<)&(AL=1;@sQb;N9ox-!cC`Hu0IW$NJ?0pvDixhOT4v?wzdK+bZ0|?>)#22y6*qDZiUR2YlGZ7NHW~pAfC}k$P>+K)Ye-j}4het`l)@uG0I7k)l^e^Wr|Cd| zd#C9Dy@Bb_>E!B7DO`8}?7_r$nwuQg1VZAsL;U9uL+XQ4OhCLR;FFkuza7qsQ;Z&0 z0GSz`_2Hy@7;Sa*FCIWXfYhrC7yXMe$Uy;k34^~F z)2#%cK5yV9l=BbZ0tdG&Tx+9ToGOGx z!IT2vwClp9HUt=lJD4gKs|`w@iWUx>8^;%}tmCknx>(~nO72?=0n%cfD`QcdQyH_? z9l5g4d1{S{Hz<4l^8irJw6Rpxv+4eCJv^-zYCT#+Z&LI2*}~&~(Ygg^EBE5vygT(N i^?keNnscF%^XD&vUp;k|QKfYN0000SW=yqUG_qqfbar#NXgR@eK)`iE$9qV|fJ)4N zOUr~#pr4(vu&uhfxW2)?$jQdd&&<)&(AL=1;@sQb;N9oxI6_oB#j<2T4Rh zR5;6ZlhJ~lAPhxO>W;>U$B(<>5HGambz*7L79sp7`smnq2 z{EIFeP&m|rPLD4Oat=MyzX07p2hcA)>Tt~8fXHnR6L)c;fCJ!U!5xSD3$%h=bhf)w zU|zNmWFS%jadCcG2oJYxKDhl*DS&Nq4!v6Ma9M9)c>~La%ertEg}S&{0X&@ixgWQb z+eCiez{7n5;Ris7Au-wK!#M%w&3hS$T%1QnQIUiJFeBvvtlNf^Q|a6j2}1;+DX?t{ zc=09DJ)YZ$)R&|k0l?~vg{PlkN+kfxNV&6+08oKa3tr{N$Mb1(D(2PNI1XkUQ8-dR zcLm7|D#>asx}T+oUJFU-i4wIb#mid4{eDrplE`!`@8XS8r&9Oz{+5(TT1u}!hNMPs Te_`5m00000NkvXXu0mjfG0{sL literal 0 HcmV?d00001 diff --git a/tubelib_addons3/textures/tubelib_addons3_chest_out.png b/tubelib_addons3/textures/tubelib_addons3_chest_out.png new file mode 100644 index 0000000000000000000000000000000000000000..e9077ba18b17308b79b802240606bba1c339996d GIT binary patch literal 585 zcmV-P0=E5$P)Px#IZ#YgMa|C4#Cb)@eo5`_>$7AwIJCZw8b7uD!il#p0CTK~|HTUBtRs$L6QcIYp#($q=gerGisc^W?(CRpZHJ z3H~RIcCzJ`TWgsRs_^8}TdVcDuKTEQsrS*^f^)B5XDP=~&XQ8X-g0~$6_GKP8*t(Q zFkC_w0N_Pj<^L9%B0t?0p!x))Dgc;h#OJ)4xIsE@5u`%XB3&dmb*h=FF-T)SWmg!;x>^BQ-A`8Tj%0Djb$HmfI(~cpcmmdoW z7FY+hir#+K!3zNyy_k{-7$23CC=}WOfc^%sLVzeb1Hv3kldVRJKr%P;4hki-dj?_1 zwj-VAImRGiLV{zJaX)}D2p}iZmgg~$g#>B&M$+=(yaCjJ_86Qw2`CTXvGDy(7k$cV z?Yf@9x$ePvj)w7!q5FIEu#CeBnnJlyYS6RA2yPx#Cs0gOMah3k(bCVbT{E?1H+D)Z-rwBn?C8L9LA}4c zX*wUVv9F<^o|IWTZq9&h00048Nkl^TGewbLoUq?0)r z5@3~%wGRN$4xJ*$u?2IKVD{t;(RA0=(`r_6oho`$Ql25$7#f0=TFmB+*7v@b?~5Q_ b0CS!{*sl%lU>@?h00000NkvXXu0mjf(q+WJ literal 0 HcmV?d00001 diff --git a/tubelib_addons3/textures/tubelib_addons3_distributor_active.png b/tubelib_addons3/textures/tubelib_addons3_distributor_active.png new file mode 100644 index 0000000000000000000000000000000000000000..3be1eddd228993b2db325226801be6ec51661e5b GIT binary patch literal 16104 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 literal 0 HcmV?d00001 diff --git a/tubelib_addons3/textures/tubelib_addons3_node_frame.png b/tubelib_addons3/textures/tubelib_addons3_node_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..2aae6d5421609e4bb79f0b0b1e9d99275fc43f5c GIT binary patch literal 962 zcmV;z13mnSP)1ktg#bG7A@HevbDo7c-NeEXfOLWhXK28Sg}8$J1*D`9Tu!f zmpCY5%amm&cG4!XNbTTSb%tJcVV;XbN_hE@e7_#&hwr~Dzj^kQ*=$O?-NEx*4i0`t z$_Rk<^)&{Alq87(7>!04V@Q%V09qHULMcTUHmh+_eE1%2)j8_*XhtFJc86Z?6zAZN z-^wV8@LZQX9|Lf6b4x3hWLZWM$JKlkMU^qvbx|rq%BXs#X-XId)juy^{z>=iE&#(+ zAzX*mwR*iXoaev%T<-1dad~-x)`ldBnN6=q!jQRe?w!nXhwXL;r4&+1lu~%Qq;MTN zVZ^(#px;mN{cQ@ZN&9JKYdW0*RBPSd+~74HH3%9$LBr>>$B!K>pm%ao8e@3z>kGuz zcAa;3x4b(1i?S@gv_T+KLvD*XpMUWLQLA}eTuyk>{R+o%j%*O{Ws~V_N~2LnD3y`4 z6E0MSE!0d&E0!pgA(r8`BO_}B26#MY1vTf^N5qF`Bbs-x`5N z6fhj7OD8m>X-W`;)(G_bDNz)mwOJ%0*L9iC@2n9hin}Trgi;DW2pCw*1KZ;e3OPbA21h=H3DG_Z4{{H?waaym}$;UbW6|GCh z$+8R~+^VE5#i`aBV>DToRpGY$KMcZ;+We?Eee>qLGQK*$T27Os&2Xq_HiLWfQcAQo kRmok3`6`w+PhS7Szk7bhyEC}WF#rGn07*qoM6N<$g0S$sM*si- literal 0 HcmV?d00001 diff --git a/tubelib_addons3/textures/tubelib_addons3_pushing_chest.png b/tubelib_addons3/textures/tubelib_addons3_pushing_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..b6342a7c56a352f69bdeacefd35c6b8331fbffe3 GIT binary patch literal 1743 zcmb7F`&Uy}77hUnE2uY65T=9NsE8P?;tU;&LShJrj3SW*B8*5tmpmi|@lmwbK)4{Z zh`dt5J47qULl~ar5kevgL?8qa0!Ts-46jlG88Lxk=GLzH17@9b_P4+FeQWJ~_W9xb zKt1ce4f`b)g+gufIOXb%ARdL%6By|u*?-viDg+Ed$)02ssy5yD_h3VW>)r5ncR^K) zt>zIjOFiS`hSEblc$ivKTRp!xH!K|zOZwS)Ia_vawRHN6S)i3-dU9|`(%4i#qkK0o z*xw;+fBk0g&iAoP%ZvF1c@y%t%DMMEe%sW<_|WiBulUu9TJ=^oUe{3jQx0o%Tq+$K zZfLvaC?L1ypP30p_5hI?_*wj!|RM^+k zRa;+M_Oy&sT+}Ci^;$Ae`K(;SVAB_`X1 ziCA`-IeQQE-dXBr-w;pfbj5ot?YG5HW1HEP$1b#u2ee$1gvAG?;eX_}74Ef=hF6^b zXL~-FUa_8M;g(rCKfLI_x}RPL{q0WAKZeyYEoVlCFK5kaL;crE;y(QSF~(z*kkqe4<*WF4RlkpDC4mB_jaaNfP{f937XYiPZobIJBcfD(-->Q_6)y0W+WEB zVk$~apZfE|37%xJ2GA<$iH&ZwD%vncxJvy*| zx3h4EPuZP?!BkR9& z+svh7+k?HOAuo>>G?-r8dC~D_KmWb4Z|N=GqYa0v=h;U)z>Bs(P@MKYgLe-syMC9N z9&yBXpnG8#ZdDVyJJ``SMSBHN;ZgRgDbV#^8 zeHscgJXeEObIn=KKp)24P)P}`n`LSxo;Rr6X?TyF67IB73xl(?3Zoyj3hXNtS1sWr zO;P-~M-9|mwS5obx@@HU?A#NfgfG|T0uQZ_(?}yWH{DZEIKX=FqX^xDOyF6`u0#_Q z*oys-P#>?AVDr-k&`Qd_lq#$s`7AZSIv$8IRKQ2V@1Tge;cEm-Vh>plypk=zjM=Ej z+p(HII-og?*3*c&*b$rnGtFhgQ?Qf4XA$qd4a%@E*5GGRP=*w(QH-uJ0r(Rc^O$qf zXGwREXvwrqG@&_fLW(xDL~mf$XzvA^@HYm3sww9#>+pwmAY}U} zDdie-6Xq@HgLff&mBYC-I~E* z9KeGI$zyj<5L3)EfF{w1{;IIJv|Iq;U>9PFZ6@%@V+OV~Tm57HwD0Gx>OucL&_KZ> zXbw*tnHt z%?ZBRW3|XDYZ=OdX0vCGb8IHHHd^sM(RW0T|6kf)=yiYKXyPx#Do{*RMaX_iv0yaN($Cu4*LF%PM?^&8j1sH-|23QP*-$R=hYX##C#Askq^S@LMMDR?iHenL4^gAi`v$Qz)&AIGs& zuSH+VbhcFQZQHhXs#XimqqUC1CaDCB3otGKRM!-Q$nPH1;KB5t5CEwB_mQFiFkLlP z!W6Ssx~z`zq)m7Hyr#TH&h*-x6CMKo9+X#zGGVA`0otaH;=VqzOnhXBKLHQdR~^bE z06K$dM(z^(Q_3t42@eF|>h6Ft3BYwDt18s~UZ{OkB}1D(0sBoZ01FlR9RRMiX}1t# zg&3Cy*1T_3@b(820uhNC@Zrz^0000Px#El^BUMaX_i($vwhUo&<}E8gGSM?^&G?C85}JZU-~ zzQ4W7%gML6wy&?QpPrqntEh#+8^8bn0aZyvK~y-)eN+LqgdhlnoG`KW{>S|T+WvN5 zt)&@GGlGyDP_wS8jdufdOrxQxxj0PK;T(-k^WrCf$I>o4zat=cxB>%^lQ40q3t3Cq zwrvh2CuI)6A+Ej1vMe$N$qApeiWJu-qz^zn0d)exQs62b{>%V$QD6e)yTb^4)t6FuY>JNZX!fXOQBnE)~QX&D%Edzr@20Q~o;`L@&hA)yn{Yx+ww+zehf&jN?FRqb1 zCF)f|xra6r=2jvyY9`E=L|r2o#V4Q!pnggaP?>U?NgHeHR|{0;t