From 095821a9e78dd69cf15b6adee92a313ff216fc87 Mon Sep 17 00:00:00 2001 From: Michal Cieslakiewicz Date: Fri, 22 Feb 2019 18:24:38 +0100 Subject: [PATCH] biogasmachines: add Biogas Tank. Biogas Tank is a dedicated storage for Biogas units. It comes in 3 sizes: Small (2 slots), Medium (32 slots) and Large (72 slots). It supports Tubelib stack pulling and status query (like HighPerf Chest). In addition, storage tank provides both visual indication and infotext information about current capacity usage. Signed-off-by: Michal Cieslakiewicz --- README.md | 28 +- TODO | 2 - biogasmachines/init.lua | 1 + biogasmachines/tank.lua | 327 ++++++++++++++++++ .../textures/biogasmachines_tank_fill_1.png | Bin 0 -> 145 bytes .../textures/biogasmachines_tank_fill_2.png | Bin 0 -> 162 bytes .../textures/biogasmachines_tank_fill_3.png | Bin 0 -> 170 bytes .../biogasmachines_tank_large_bottom.png | Bin 0 -> 1209 bytes .../biogasmachines_tank_large_side.png | Bin 0 -> 1618 bytes .../biogasmachines_tank_large_top.png | Bin 0 -> 1450 bytes .../biogasmachines_tank_medium_bottom.png | Bin 0 -> 1148 bytes .../biogasmachines_tank_medium_side.png | Bin 0 -> 1610 bytes .../biogasmachines_tank_medium_top.png | Bin 0 -> 1387 bytes .../biogasmachines_tank_small_bottom.png | Bin 0 -> 1085 bytes .../biogasmachines_tank_small_side.png | Bin 0 -> 1563 bytes .../biogasmachines_tank_small_top.png | Bin 0 -> 1318 bytes 16 files changed, 355 insertions(+), 3 deletions(-) create mode 100644 biogasmachines/tank.lua create mode 100644 biogasmachines/textures/biogasmachines_tank_fill_1.png create mode 100644 biogasmachines/textures/biogasmachines_tank_fill_2.png create mode 100644 biogasmachines/textures/biogasmachines_tank_fill_3.png create mode 100644 biogasmachines/textures/biogasmachines_tank_large_bottom.png create mode 100644 biogasmachines/textures/biogasmachines_tank_large_side.png create mode 100644 biogasmachines/textures/biogasmachines_tank_large_top.png create mode 100644 biogasmachines/textures/biogasmachines_tank_medium_bottom.png create mode 100644 biogasmachines/textures/biogasmachines_tank_medium_side.png create mode 100644 biogasmachines/textures/biogasmachines_tank_medium_top.png create mode 100644 biogasmachines/textures/biogasmachines_tank_small_bottom.png create mode 100644 biogasmachines/textures/biogasmachines_tank_small_side.png create mode 100644 biogasmachines/textures/biogasmachines_tank_small_top.png diff --git a/README.md b/README.md index e3b9f70..31e5a2e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MicuPack v2.4 +# MicuPack v2.5 **Minetest modpack by (real)micu, tested with Minetest 0.4.17.1 running Minetest Game** @@ -201,5 +201,31 @@ git clone https://github.com/realmicu/minetest-micupack.git micupack Code and models are imported from Minetest Game default torch (torch.lua) - see source file for details. + - **Biogas Tank** + + Dedicated storage for Biogas units. A convenient replacement for standard and Techpack + chests when it comes to stockpiling Biogas. + + Gas tank comes in 3 sizes: + - Small - 2 stacks + - Medium - 32 stacks (standard Chest equivalent) + - Large - 72 stacks (Tubelib HighPerf Chest equivalent) + + Features: + - Biogas-only inventory + - Tubelib I/O compatibility + - real-time 3-level color visual fill indicator on device box + - up-to-date capacity information in infotext (displayed when looking at the tank) + - support for Tubelib stack pulling (can be paired with HighPerf Pusher) + - not a machine, so no aging and no defects + - support for standard SaferLua storage status query ("empty"/"loaded"/"full") + - no node timer (capacity information and visual status updated only when node inventory + is modified) + + Supported SaferLua functions: + + - $get_status(...) + + Future plans - see TODO file. diff --git a/TODO b/TODO index 3e754a7..9dabf52 100644 --- a/TODO +++ b/TODO @@ -8,8 +8,6 @@ Future plans: + usage: ticks running, ticks standby, ticks blocked, total ticks etc and evaluate possible expansion of SaferLua controller '$commands' with functions to read and reset above fields - * Tubelib Chest Indicator - small attachable plate that indicates fill level - of connected Tubelib Chest * Metal Recycler - decomposing device to retrieve metal ingots, Mese shards and Diamonds from all items and nodes that were crafted from these resources; device will return random number of ingots and shards - between 1 and craft diff --git a/biogasmachines/init.lua b/biogasmachines/init.lua index 0dbcab1..56ea666 100644 --- a/biogasmachines/init.lua +++ b/biogasmachines/init.lua @@ -24,3 +24,4 @@ dofile(minetest.get_modpath("biogasmachines").."/gasfurnace.lua") dofile(minetest.get_modpath("biogasmachines").."/jetfurnace.lua") dofile(minetest.get_modpath("biogasmachines").."/compactor.lua") dofile(minetest.get_modpath("biogasmachines").."/torch.lua") +dofile(minetest.get_modpath("biogasmachines").."/tank.lua") diff --git a/biogasmachines/tank.lua b/biogasmachines/tank.lua new file mode 100644 index 0000000..7a11ef2 --- /dev/null +++ b/biogasmachines/tank.lua @@ -0,0 +1,327 @@ +--[[ + + ======================================================================== + Tubelib Biogas Machines Mod + by Micu (c) 2018, 2019 + + Copyright (C) 2018, 2019 Michal Cieslakiewicz + + This is source file for Biogas Tank - a dedicated storage for Biogas + units. + + Gas tank comes in 3 sizes: + - Small - 2 stacks + - Medium - 32 stacks (standard Chest equivalent) + - Large - 72 stacks (Tubelib HighPerf Chest equivalent) + + Features: + * Biogas-only inventory + * Tubelib I/O compatibility + * real-time 3-level color visual fill indicator on device box + * current capacity information in infotext + * support for Tubelib stack pulling (can be paired with HighPerf Pusher) + * no defects (not a machine) + * support for standard SaferLua storage status (empty/loaded/full) + * no node timer + + License: LGPLv2.1+ + ======================================================================== + +]]-- + +--[[ + --------- + Variables + --------- +]]-- + +-- tanks definitions +local TANK_SMALL = 1 +local TANK_MEDIUM = 2 +local TANK_LARGE = 3 + +local tanks = { + [TANK_SMALL] = { label = "Small", invsize = 2, invmax = 2 * 99, invform = { x = 2, y = 1} }, + [TANK_MEDIUM] = { label = "Medium", invsize = 32, invmax = 32 * 99, invform = { x = 8, y = 4 } }, + [TANK_LARGE] = { label = "Large", invsize = 72, invmax = 72 * 99, invform = { x = 12, y = 6 } }, +} + +--[[ + -------- + Formspec + -------- +]]-- + +-- formspec +-- Parameters: tank_size (number) - size type of tank +local function formspec(tank_size) + local tank = tanks[tank_size] + local sizex = math.max(tank.invform.x, 8) + local invby = math.max(tank.invform.y, 2) + local plrx = tostring((sizex - 8) / 2) + return "size[" .. tostring(sizex) .. "," .. + tostring(invby + 4.75) .. "]" .. + default.gui_bg .. + default.gui_bg_img .. + default.gui_slots .. + "list[context;main;" .. tostring((sizex - tank.invform.x) / 2).. "," .. + tostring((invby - tank.invform.y) / 2) .. ";" .. + tostring(tank.invform.x) .. "," .. + tostring(tank.invform.y) .. ";]" .. + "list[current_player;main;" .. plrx .. "," .. + tostring(invby + 0.5) .. "4;8,1;]" .. + "list[current_player;main;" .. plrx .. "," .. + tostring(invby + 1.75) .. ";8,3;8]" .. + "listring[context;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(plrx, invby + 0.5) +end + +--[[ + ------- + Helpers + ------- +]]-- + +-- get total number of Biogas units in inventory +local function get_biogas_count(inv) + if inv:is_empty("main") then + return 0 + end + local c = 0 + for i = 1, inv:get_size("main") do + local item = inv:get_stack("main", i) + if item:get_name() == "tubelib_addons1:biogas" then + c = c + item:get_count() + end + end + return c +end + +-- swap tank node at pos to reflect current fill state +local function update_tank_node(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local number = meta:get_string("number") + local tank = tanks[def._tank_size] + local count = get_biogas_count(inv) + local pct = 100 * count / tank.invmax + meta:set_string("infotext", tank.label .. " Biogas Tank " .. number .. + string.format(" (%.2f %% full, %d / %d)", pct, count, tank.invmax)) + local newname = "biogasmachines:tank_" .. string.lower(tank.label) + if pct > 0 and pct <= 33 then + newname = newname .. "_1" + elseif pct > 33 and pct <= 66 then + newname = newname .. "_2" + elseif pct > 66 then + newname = newname .. "_3" + end + if newname ~= node.name then + node.name = newname + minetest.swap_node(pos, node) + end +end + +--[[ + --------- + Callbacks + --------- +]]-- + +-- do not allow to dig protected or non-empty tank +local function can_dig(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 + +-- cleanup after digging +local function after_dig_node(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) +end + +-- init tank after placement +local function after_place_node(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local tank = tanks[def._tank_size] + inv:set_size("main", tank.invsize) + meta:set_string("owner", placer:get_player_name()) + local number = tubelib.add_node(pos, "biogasmachines:tank_" .. string.lower(tank.label)) + meta:set_string("number", number) + meta:set_string("formspec", formspec(def._tank_size)) + update_tank_node(pos) +end + +-- validate incoming items +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if not minetest.is_protected(pos, player:get_player_name()) and + stack:get_name() == "tubelib_addons1:biogas" then + return stack:get_count() + end + return 0 +end + +--[[ + ----------------- + Registration loop + ----------------- +]]-- + +for s, tank in ipairs(tanks) do + local sz = string.lower(tank.label) + local basename = "biogasmachines:tank_" .. sz + local topimg = "biogasmachines_tank_" .. sz .. "_top.png" + local bottomimg = "biogasmachines_tank_" .. sz .. "_bottom.png" + local sideimg = "biogasmachines_tank_" .. sz .. "_side.png" + local desc = "Tubelib " .. tank.label .. " Biogas Tank" + local biogastanknodes = { basename } + + --[[ + ----------------- + Node registration + ----------------- + ]]-- + + minetest.register_node(basename, { + description = desc, + tiles = { + -- up, down, right, left, back, front + topimg, bottomimg, + sideimg, sideimg, sideimg, sideimg, + }, + drawtype = "nodebox", + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = { choppy = 2, cracky = 2, crumbly = 2 }, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + + after_place_node = after_place_node, + can_dig = can_dig, + after_dig_node = after_dig_node, + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + on_metadata_inventory_move = update_tank_node, + on_metadata_inventory_put = update_tank_node, + on_metadata_inventory_take = update_tank_node, + _tank_size = s, + }) + + for i = 1, 3 do + local n = tostring(i) + local fillname = basename .. "_" .. n + local fillimg = sideimg .. "^biogasmachines_tank_fill_" .. n .. ".png" + biogastanknodes[i + 1] = fillname + minetest.register_node(fillname, { + description = desc, + tiles = { + -- up, down, right, left, back, front + topimg, bottomimg, + fillimg, fillimg, fillimg, fillimg, + }, + drawtype = "nodebox", + + drop = basename, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = { choppy = 2, cracky = 2, crumbly = 2, not_in_creative_inventory = 1 }, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + + can_dig = can_dig, + after_dig_node = after_dig_node, + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + on_metadata_inventory_move = update_tank_node, + on_metadata_inventory_put = update_tank_node, + on_metadata_inventory_take = update_tank_node, + _tank_size = s, + }) + end + + tubelib.register_node(basename, biogastanknodes, { + + on_push_item = function(pos, side, item) + if item:get_name() == "tubelib_addons1:biogas" then + local meta = minetest.get_meta(pos) + local ret = tubelib.put_item(meta, "main", item) + update_tank_node(pos) + return ret + end + return false + end, + + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + local ret = tubelib.get_item(meta, "main") + update_tank_node(pos) + return ret + end, + + on_pull_stack = function(pos, side) + local meta = minetest.get_meta(pos) + local ret = tubelib.get_stack(meta, "main") + update_tank_node(pos) + return ret + end, + + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + local ret = tubelib.put_item(meta, "main", item) + update_tank_node(pos) + return ret + end, + + on_recv_message = function(pos, topic, payload) + if topic == "state" then + local meta = minetest.get_meta(pos) + return tubelib.get_inv_state(meta, "main") + else + return "unsupported" + end + end, + + }) +end + +--[[ + -------- + Crafting + -------- +]]-- + +minetest.register_craft({ + output = "biogasmachines:tank_small", + recipe = { + { "dye:green", "default:bronze_ingot", "default:steel_ingot" }, + { "dye:yellow", "default:steelblock", "tubelib:tubeS" }, + { "dye:red", "group:wood", "default:steel_ingot" }, + }, +}) + +minetest.register_craft({ + output = "biogasmachines:tank_medium", + recipe = { + { "default:bronze_ingot", "default:steelblock" }, + { "default:steelblock", "biogasmachines:tank_small" }, + }, +}) + +minetest.register_craft({ + output = "biogasmachines:tank_large", + recipe = { + { "default:bronze_ingot", "default:steelblock" }, + { "default:steelblock", "biogasmachines:tank_medium" }, + }, +}) diff --git a/biogasmachines/textures/biogasmachines_tank_fill_1.png b/biogasmachines/textures/biogasmachines_tank_fill_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cae3582f7c96f2477538ed1347f96f9f01cc573c GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4S0HU{Y|Ow={~w4M820Zm zwgCz;mIV0)GdMiEkp|=#c)B=-Xq-<@kWg_Dn7dk|;Y_+nQh<|afRqMfatLEGn|KJL lxKfD3A})^Ps`?2G3@2u?E@M4*Z4*#0gQu&X%Q~loCIFu%BSruK literal 0 HcmV?d00001 diff --git a/biogasmachines/textures/biogasmachines_tank_fill_2.png b/biogasmachines/textures/biogasmachines_tank_fill_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2004983edf1a26d774144627ba73c10694675e95 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iS0HU{Y|Ow=|NlQjQ$53f zAd7*4?^w(=paf${kY6x^!?PP{K#sMii(`n!`Q!u%6$gR2t2G+Vq>Cg4IEe-*xgU@S zJuu@SYv_Si4$*}xm=^M6u3*Y^S;65VDsc46KLtjHK2P=~UGmRcfW|O*y85}Sb4q9e E0C1Hpr~m)} literal 0 HcmV?d00001 diff --git a/biogasmachines/textures/biogasmachines_tank_fill_3.png b/biogasmachines/textures/biogasmachines_tank_fill_3.png new file mode 100644 index 0000000000000000000000000000000000000000..37fa8eee7e29d760a7a8cbd5025e790716ed52cb GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*Tez_V`F26dIpC74FCT# zG}QxX5HBj|-#MTf#*!evUrw#gC5cmktfx8yCU$5kw7vZ6$i(pJ3n%BHGcQ*G&0_F$ L^>bP0l+XkKQxq~u literal 0 HcmV?d00001 diff --git a/biogasmachines/textures/biogasmachines_tank_large_bottom.png b/biogasmachines/textures/biogasmachines_tank_large_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..6912192e41fdebd300cb2a9f2037920040d5f086 GIT binary patch literal 1209 zcmV;q1V;ObP) zyS%%=z`(x0zss|jzrViP+S}RM+Pu5E!NI}8!o$72y}rJ^yScd0x}UwXsMpxn#l^*k zhlzuOhJ=KMxVX8)wXe3dw1b0%hlz=VhK9Voy|J>fzrDM>xwwaiiinDez`?!0y}i7; zzP-D;g@%T`y}Y}*x4gW&!^Fh1v$MCjx5voGv$V9jy1K=|!N0)3z`?-0y}P)$xUsRZ zxw*Q#ySur%xw^W$u&}Vj#>In$g}uAGx3#r`f`q!ey1u))#>U6HyS%%)yS%x%y}rJ_ zyu7`=ySKQw!o$ME#l*kAz`3}#yu7@*xwyKzxxBi$vaqg#f`!1py~dVfy0E6ky|l}p zZ^EUCzPh=suB?HBgSWS~xVE-}goL%SvCp`j#gt;mxTT|{qrIt?%cFSKwvf@fpvJ|+ z!NS48z`nz|vC6NN(65HA?BetQ00O~DL_t(I%S}`XR}(Q1j*?wPtri<^*iCjf%C51f zC|!lN+9HB>i@^#aMM3by0}oWZZ^ip3JCn6M=jFZ3%$w%R_kGzCvSw`?p_WZ8ixA5u z7*G*v+x9xTzMVk2VdJLE<}I0Qwqt9KWwzxo+rFb?=dRt9>>-_2m*cuzc)sug>F~7J ziv{OhRwp6*-0m>i?<#p9jPl&=c6k`}a98S2RH|oL4X7nT z1%Z?jE~NxQK;*F&brz4pz&R;YNsBR8C?yaAZhszY&4Qpo0K(&3dRpWG#X$%dlozzn zo+rj@Ffbuh7>!(&oHl#r$bLj5U<7A-u@up3OnKsEtFmkkP>n($VJ zY;_G!&{vQb7qMn_p=B$ZnJr#T8o(mw@G%#c=M5>ipOPid3*rD)Jy9SOGyWKh&>wCv zz!S73X;5Ni&>xOVNr{vZ0|Z0O$}m83sdyMl2pNkxzyQHevv}Sj7US2#$VdG^$vIIT z18^t=xPHCtgPR%jxnT4gbYiaRj3E?u`&kVJCIm80^%M1fdV^rl9Y(WgQ{Lz+`rJ?T zGkOD*fAdzMsDo*snVn4ixt;ohdTX&@P=W<~56zZ8Q$|Ugit{OoitpgSsz06)F9DW5 zq6l~ocfsy#axaYT!!H-Z=mA3H!{{NLG!jOS&@B2`oA+z{oka-Pm%P|?lP8oseJ1h! zf?CUqpBq_gLdRLDbdta%JCm$&JNI!vg%~zjs zu{tZ4|0}-07v1)C<=gW2hWyd+Jzv#o^Yhb~$wmL?uit-G+VN|ra8($^4gUx*=xY20 X7JRlgtfi#|00000NkvXXu0mjfGs~0` literal 0 HcmV?d00001 diff --git a/biogasmachines/textures/biogasmachines_tank_large_side.png b/biogasmachines/textures/biogasmachines_tank_large_side.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac8765f5195dc3e8baa810c9e4322bbbb244c23 GIT binary patch literal 1618 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 O0000 zyS%%=z`(x0zss|jzrViP+S}RM+Pu5E!NI}9!^6M7z`ne@yScd0x}UwXsMpxn#l^*k zhl#kjxx=-uwzaf_gN28QiLtV=zrDM>xwwaiiinDezP`P{!M(h?y1cx-yScZ#yt~81 z#Iv)ry}iA+xVNLEqcbxzyuH1;y1K=|!LqiyrK+@@qphs4w!gr@004iPp{z}8lmSzV z99xe7Qi@D#l$)Zjz`()0y}P-&y1To(y}iC~ft{15zA0Rfae|(`zQ4J;xpak}&eh(r zz0G}zqMM?uSa+WJ`uq6#`$TG%o}{j2dYT4Pi_q8M|NsAPiK%6JnZdumz`?;CSB#UR zy5;Kcnwp$KZ<`iXi?g)1LTQ%p^7hct(6zwMJ8708TaO1*inqGGud=xTQi{gT*`lz- zc#f=`tG~3iyS=`^Az6)QfTR5V{?ydf($mu&SdGET*0{mXy}iJ=wzg`1oS3J*fRwO| zown!e@Hb?WZ-=P(`ulN%pS-%hrmM7OfTR5V{rCC$G-Z^du)~t0x^0H1^Y!<+!_op% zilL^je2b#C!O#Bw{&$V5S$Lm!kFMV1>bbwNJ zwYRXau(`Oly}i7=y1BBjuE4*&#+GBcu%^bnw9B7w!ljA6y1A{cthKYVxVX5sx3{&j zvCp`j#gt;mxTU?Rmdm4f*0zw*x}e6z!@$A7!NS4D#>d6R#k{<{!N9)5xv|QxmC&z- z+`*OR0009iNklqsXb2%T_Z2~yOMqN)g~AtV=ANC|~Py_DXi2QU@Y5SRWFNovm|r4ri<)8atN|ode8h>^yRQ zDGFUcDu?P962ckbv`7m}QhQhksl!QS3Y|n`__VaCgKbwso~Kcs@#$Dyepxf_vhfgqg0y{X zxt@ozp2rC@e46GJmtS$^RYF{S&9&@0pZbPDJui#0Sx;kx)?Ux*ZV*D;coS?l-(saF zVkhl-*`fea@Jwwzyb_acmHT9f4+sR1g0Ly_&26_&y+b~y83v^2i9jeP)4_k|j9l(6 zDY)CA*r9>o9w_j=Gr>RWK6iHg93XS=Pe)_rfk0NZ2HX$Kb7w~y9(-uNXna`udIV6_ zM}%0gFz4z+8x}2oR5U&&eSrW9Y%XaMOPA%ETbf%Qf8t5e^wiVwgdYepjAYm|;@MoT z^||FMo`0cLtR$3>o1tUL)KfJP<&$0I!QT-h6Ar#<$;j zSG-3V1q6aN=#S~wz5hY`hnqIHeoD7(r$qrYD=+*1iBGp|-S(;2zT-2We$Jq{ z+>*`mJoorKeBonf=a*l7Z5VbMMgvlC8``aPvg7mM8fNCf@PyqcV8vE8y!nOI%FU&8*2S^Gj00nPqw}STUWwNRU#0M0n8d78oL(uE0@2Dj)JkAeR!XW6IbShV#L3?*IS*07*qo IM6N<$f?qavHUIzs literal 0 HcmV?d00001 diff --git a/biogasmachines/textures/biogasmachines_tank_medium_top.png b/biogasmachines/textures/biogasmachines_tank_medium_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a7391d648bbb448ebd6a7f82fe71be7bcdfe385d GIT binary patch literal 1387 zcmV-x1(f=UP) zyS%%=z`(x0zss|jzrViP+S}RM+Pu5E!NI}9!^6M7z`ne@yScd0x}UwXsMpxn#l^*k zhl#kjxx=-uwzaf_gN28QiLtV=zrDM>xwwaiiinDezP`P{!M(h?y1cx-yScZ#yt~81 z#Iv)ry}iA+xVOj1$FsDwyuH1;y1K=|!N0)3z`?-0zPYZju%e=)oSdARnwp-Qp{%T| zyuG`)xVW*gvAMarySuy0%*>gYnU$B7o12@ty1BQwxUjIWo}Qe4e}A^Nwxp(}m6esZ zv$Ms<#hRL%s;a8Dx3`m%l%b)bqokyil$5->zMY<(y}rJU63t*@!6sj#uFr>Cc{u&=kdw2+dLySu!-y}PESrl6Xd zrlzF2y1T-|!o=ASot+^r z$y&Cu+Pdxvtg;|J5R{h+ih}Zf`5(PE96ZeV&dGNtH}}h(?Lsnz%lX0vAzY2{@`YE##y*zWBsRb5z9xiLLc=4PE~3Gf z470b2&Ccs@2(1A@6iXvC(c+sKW@YtTrSdkd-gXf0l*-#7%~kJ~$~$-kTMI$^zEa93 z30F8&zDhCFc(4-_-cz9K5e&NYq$7el*55^O#C^ZPP(q@njG(I3?ma_$oA2*K_CW-Z zlrUVugcjiY!-peE^~c7T=IH4De&ts`;(Uadc&3ADpX@LTS zCbO(@Rh>qEya)~+X@76bs7XSY^QO_$AN)ydGdDsKTAhmE(2x6@r_Y=miC|1Ak{F|T z7=JtuKSg+Wsf$4sM+?XDFV*t z3m3>N>tdA7FV;s8MF~W@8~$RkUw>0HzY^;s(y2y?x|Br2OP3k@z4u3{9C3by@Moz! z90dHYfb*+J!)q4%+xn-*`S_LV1YYCC;uFCQ{Gu1#ymkB1orb#G@T8|JmHGKeV(OlE t|G~q5Z}rjFZsDt9DqZMDK+F1n{RbCI*u^b)lHC9R002ovPDHLkV1izY1X=(9 literal 0 HcmV?d00001 diff --git a/biogasmachines/textures/biogasmachines_tank_small_bottom.png b/biogasmachines/textures/biogasmachines_tank_small_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..9379183422caf03c469c3d78ed311ae8d00aed00 GIT binary patch literal 1085 zcmV-D1j74?P) zyS%%=z`(x0zss|jzrViP+S}RM+Pu5E!NI}9!^69|xY4?wy|bv-*w@9y#fOK9xVX8) zwXe3dw1b0%hlz>2y}hxrvA?~$yt%lChl+@bioU+Rz`?z|y1u))x4gW&!^Fh1v$MUu zy|=ix$H>RCw6waqy2Zi4zreu2!N9z|ySTWxv9Ynaxw^Z%ySci#x45{lu&~9(#lE|_ z#>U6JzP`J=yuH18-rA&XbYOf;+;A zEOUqfG?WY?90hhYd^AIZZQ%}9DlS0UvP`(b%|MCi!Y#@H?}Vr*YAQINlC>yGbOOqZ z0;8DA$3=wsaL0g5Fc#CL#4G0cU_?^lm5~94p=T*Hkn%VmC4|&s6&PR`dZvdS@t89Y z{R1agMcM&46av&tV@R{;%ya%N1e&XiF+?d)!dlRJIaVbQ*9ufdja z?w|7;Q1KdMdM_EkHA^dbKKJu{&~Gbxj*|57edv$!dElJHF5S*4Nk-6VGLI|OC-~$Tft06}>N5 zyS%%=z`(x0zss|jy}i8J+S}RM+Pb*5!NI}9!^6M7zPh)z(Yl|#v#8hD*Tu!fh=_`~ zxVgi%uePMi;BFxy|J>fzrDMOiHnMhi@v_Sz`?z|y1u==y~D)Bv$M0exVNLE zqcbxzy1Kf>!NIb&yQQkMoujR+u(rRzzyJV$zrVnlp{z}8lmSzV99xe7Qi@D#l$)Zj zz`()0y}P-&y1To(y}iC~ft{15zA0Rfae|(`zQ4J;xpak}&eh(rz0G}zqMM?uSa+WJ z`uq6#`$TG%o}{j2dYT4Pi_q8M|NsAPiK%6JnZUup9aoH#qq^to@F-l5LT{TERg1H< zw?b)_@bdQi{QPo@s%C(rwZP6hX_g{ej|WqVx4ONrvbh0LipI{_vAxVUW0K|S@1n58 zc#f=`tG~3iyS=`^Az6)QfTR5V{^92ACR~ru*WlIL;~iLy!OGUS!Oy+Dz-oS+n5Vsf zl(3AQwl`#xZ-=P(`ulN%pQfv{{Qdp+`T8_vl%uf2lB2q9hNtuO_qoH;0#k~irmuX9 zqPD@${{H@VjjLIBpLdV0-s9@I#L^2?i-M1&y}rJDiJ}Emi=VB*&)4BAU5^D-j001P zevG5OyScr+yPTq}S#p*jT8=Mbk`7dhT6318sIs@XxVpN#xVgNer?982w6wLiu&}VX zx3#;tx3aLVz`wo5mSeiGrihA)#=W%5pKrpYiLI`zwzs#pw6lqdi_f^7#gt;mxTU?R zmdm4f*0zw*x}e6z!@$A7!NS4D#>d6R#k{<{!N9)5xv|QxmC&z-cQgZZ00099Nkle?56%ctHEOz%s}`>2sa*#%MgSgc_@Fg_iE3H-g(S>`4o7B1q8mpDt8Enl&6)oQ+IjRCSm z2%wLTuI1|-CuRM}4I4M5@XeTDoViKRCys34$y>K=-?4Mo?mc_?KFl=CA_Nc%u%90| zcENjbFcU z(|5>R4evm_tkMn`@6 z{N?%AZ}j^&ujXa(@jrh26f646`}@z|f1jhpZI@uHKou|XM<7Cq#DB=#3lWm4i536= N002ovPDHLkV1hllS?T}) literal 0 HcmV?d00001 diff --git a/biogasmachines/textures/biogasmachines_tank_small_top.png b/biogasmachines/textures/biogasmachines_tank_small_top.png new file mode 100644 index 0000000000000000000000000000000000000000..59d6f316c68a30dc36c33a89b31747fa54217c82 GIT binary patch literal 1318 zcmV+>1=;$EP) zyS%%=z`(x0zss|jzrViP+S}RM+Pu5E!NI}9!^69|xY4?wy|bv-*w@9y#fOK9xVX8) zwXe3dw1b0%hlz>2y}hxrvA?~$yt%lChl+@bioU+Rz`?z|y1u))x4gW&!^Fh1v$MUu zy|=ix$H>RCw6waqy2Zi4zreu2!N9z}xvsFVqN1amoSd4Pnx31XtgNiOy}P)$xUsRZ zxw*Q#ySvQH%$b>)m6w&9o13}1xwp8uu&}V6o}7Pwf3~)^q^72om6f-%v&F{6nwp!c zs;alQx092Up`oIqq@cI#uc@i2u(7SDr>C#5 zueZ6hy}rJXl9Ic-yuH1CSQ ztOBkF8jn^%t4*uHDpsYE1u4Nw6|I2cecvbEC*J;1XXC|u@B6Z|nVpxJHyc8xOsyk^ z88b|i5Hm)!p+}5ZEH=%UUQcj2W9F>*>^bp7Vs1ktjn8Y;tN9D&E?l(OAWO(nb6L`| z7;qc7Ba-a5vs^ojEi;!AvchU=Zdqwbu}TWTtR{;wOCs#%mep)cJ&CPlt?R7yj7h;H zSS-o@nBH|a#E7|(wI(-hW>Nwo$=npCMo7Jz-V!55TyAY^-zLTOBm$FUAc_?`+S+&0 zESBbhbQ~dsGl?RneaKUH7Y6JWAX7ecSd%FBXy2!fQy@sek(2w7lVb0_&i%y$2XS@C z2cL83%3?qX@cZF#w-611QmWX~)7v1N+!313^|`wYLdp>Zq7?Lp14?xrt*B#|KcX1K zfP|+hm>39D$azp@;&`Qaf^$vbXLSZ&NCuJ}913Y30)@`W%Beh{<9G$EqA|%jEJSCm zl##Niq)3%&r(MT!oxCTpQ8d!WvW8VH2&&pttukyiX<592LCpAXeb{h+QK=ff4ns9G zf~T-&X$&BZfAs0Bx)MMQ!KgS>JIh?%Gk44+CXJex66dPtC5)=D!*K(3jsatkN!zGq zJklovx&7)w(yfMhiuDdK$(eL$76VF=ScnGIbMaD9T@I>Y2?QXd7RxA$+!fTv_Tkt_ z<*HIWD)eB~zJi)wa|W@@M0Yd-;<^tfZuAy!-n!WBL!S_uqEF95`R_d3_OW@9if#@^ zBcixt{uN8>&!gsfBE@Zi1p$h67v)ZP_nKSo>yyz4U?BJic+lMPP>W?e@}v31{QoHs z(XRK{AWxnOJ-;0DPohY1u6MohXM{Y@yl89pDSfF?_Pn&~(pN5}uiM(Yyf+4UYrM-- zT7LOngXU>EJ<0iiH@fcQ#HaDk1@Wa|b6aM!V`GDQCBE9