From f458147700fb68c20e37195ce354ba8740dc7742 Mon Sep 17 00:00:00 2001 From: Zenon Seth Date: Mon, 20 Nov 2023 22:43:01 +0000 Subject: [PATCH] Add Cobble Gen Supplier and Upgrade for it --- api/api.lua | 1 + api/cobble_supplier.lua | 222 +++++++++++++++++++++++ item/craft_item.lua | 5 + registration/item_recipes.lua | 12 ++ registration/machines_api_reg.lua | 13 ++ registration/node_recipes.lua | 13 ++ textures/logistica_cobblegen_back.png | Bin 0 -> 2372 bytes textures/logistica_cobblegen_bottom.png | Bin 0 -> 2371 bytes textures/logistica_cobblegen_front.png | Bin 0 -> 2368 bytes textures/logistica_cobblegen_side.png | Bin 0 -> 2374 bytes textures/logistica_cobblegen_top.png | Bin 0 -> 2365 bytes textures/logistica_cobblegen_upgrade.png | Bin 0 -> 2124 bytes 12 files changed, 266 insertions(+) create mode 100644 api/cobble_supplier.lua create mode 100644 textures/logistica_cobblegen_back.png create mode 100644 textures/logistica_cobblegen_bottom.png create mode 100644 textures/logistica_cobblegen_front.png create mode 100644 textures/logistica_cobblegen_side.png create mode 100644 textures/logistica_cobblegen_top.png create mode 100644 textures/logistica_cobblegen_upgrade.png diff --git a/api/api.lua b/api/api.lua index 1fd8064..f696b72 100644 --- a/api/api.lua +++ b/api/api.lua @@ -15,3 +15,4 @@ dofile(path.."/trashcan.lua") dofile(path.."/vaccuum_chest.lua") dofile(path.."/crafter_auto.lua") dofile(path.."/crafting_supplier.lua") +dofile(path.."/cobble_supplier.lua") diff --git a/api/cobble_supplier.lua b/api/cobble_supplier.lua new file mode 100644 index 0000000..c59ed07 --- /dev/null +++ b/api/cobble_supplier.lua @@ -0,0 +1,222 @@ + +local S = logistica.TRANSLATOR + +local FORMSPEC_NAME = "logistica_cobblegen" +local ON_OFF_BUTTON = "on_off_btn" +local INV_DST = "main" +local INV_UPG = "upgr" + +local META_UPGRADE_COUNT = "logupg" +local ITEM_UPGRADE = "logistica:cobblegen_upgrade" +local DEFAULT_GEN_RATE = 1 +local DEFAULT_MULT_PER_UPGRADE = 2 +local COBBLESTONE = "default:cobble" + +local TIMER_SHORT = 2 +local TIMER_LONG = 4 + +local forms = {} + +local function update_upgrade_count(pos, optMeta) + local meta = optMeta or minetest.get_meta(pos) + local inv = meta:get_inventory() + local upgCount = 0 + for _, st in ipairs(inv:get_list(INV_UPG) or {}) do + if not st:is_empty() then upgCount = upgCount + 1 end + end + meta:set_int(META_UPGRADE_COUNT, upgCount) +end + +local function get_upgrade_count(pos, optMeta) + local meta = optMeta or minetest.get_meta(pos) + return meta:get_int(META_UPGRADE_COUNT) +end + +local function get_cobblegen_formspec(pos) + local posForm = "nodemeta:"..pos.x..","..pos.y..","..pos.z + local isOn = logistica.is_machine_on(pos) + + return "formspec_version[4]" .. + "size[10.5,8]" .. + logistica.ui.background.. + logistica.ui.on_off_btn(isOn, 0.4, 1.3, ON_OFF_BUTTON, S("Enable")).. + "list[current_player;main;0.4,2.9;8,4;0]".. + "list["..posForm..";"..INV_UPG..";7.8,1.1;2,1;0]".. + "listring["..posForm..";"..INV_DST.."]".. + "listring[current_player;main]".. + "list["..posForm..";"..INV_DST..";2.9,1.1;2,1;0]".. + "label[0.4,0.5;"..S("Generates Cobblestone and passively supplies it to Network").."]".. + "image[6.6,1.1;1,1;logistica_icon_upgrade.png]" +end + +local function show_cobblegen_formspec(playerName, pos) + forms[playerName] = {position = pos} + minetest.show_formspec(playerName, FORMSPEC_NAME, get_cobblegen_formspec(pos)) +end + +local function on_player_receive_fields(player, formname, fields) + if not player or not player:is_player() then return false end + if formname ~= FORMSPEC_NAME then return false end + local playerName = player:get_player_name() + if not forms[playerName] then return false end + local pos = forms[playerName].position + if minetest.is_protected(pos, playerName) then return true end + + if fields.quit then + forms[playerName] = nil + elseif fields[ON_OFF_BUTTON] then + logistica.toggle_machine_on_off(pos) + show_cobblegen_formspec(player:get_player_name(), pos) + end + return true +end + +local function on_cobblegen_rightclick(pos, node, clicker, itemstack, pointed_thing) + if not clicker or not clicker:is_player() then return end + if minetest.is_protected(pos, clicker:get_player_name()) then return end + show_cobblegen_formspec(clicker:get_player_name(), pos) +end + +local function after_place_cobblegen(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size(INV_DST, 2) + inv:set_size(INV_UPG, 2) + logistica.set_node_tooltip_from_state(pos) + logistica.on_supplier_change(pos) +end + +local function allow_cobblegen_storage_inv_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then return 0 end + if listname == INV_UPG and stack:get_name() == ITEM_UPGRADE then + local inv = minetest.get_meta(pos):get_inventory() + if inv:get_stack(listname, index):is_empty() then return 1 + else return 0 end + end + return 0 +end + +local function allow_cobblegen_inv_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_cobblegen_inv_move(pos, from_list, from_index, to_list, to_index, count, player) + return 0 +end + +local function on_cobblegen_inventory_put(pos, listname, index, stack, player) + if listname == INV_DST then + logistica.update_cache_at_pos(pos, LOG_CACHE_SUPPLIER) + elseif listname == INV_UPG then + update_upgrade_count(pos) + end +end + +local function on_cobblegen_inventory_take(pos, listname, index, stack, player) + if listname == INV_DST then + logistica.update_cache_at_pos(pos, LOG_CACHE_SUPPLIER) + elseif listname == INV_UPG then + update_upgrade_count(pos) + end +end + +local function can_dig_cobblegen(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty(INV_DST) and inv:is_empty(INV_UPG) +end + +local function on_cobblegen_power(pos, power) + logistica.set_node_tooltip_from_state(pos, nil, power) + if power then + logistica.start_node_timer(pos, TIMER_SHORT) + end +end + +local function on_cobblegen_timer(pos, elapsed) + local meta = minetest.get_meta(pos) + local upgCount = get_upgrade_count(pos, meta) + local inv = meta:get_inventory() + local count = DEFAULT_GEN_RATE * DEFAULT_MULT_PER_UPGRADE ^ upgCount + local stack = ItemStack(COBBLESTONE) ; stack:set_count(count) + local needToUpdate = inv:is_empty(INV_DST) + local leftover = inv:add_item(INV_DST, stack) + if leftover:is_empty() then + logistica.start_node_timer(pos, TIMER_SHORT) + else + logistica.start_node_timer(pos, TIMER_LONG) + end + if needToUpdate then + logistica.update_cache_at_pos(pos, LOG_CACHE_SUPPLIER) + end + return false +end + +---------------------------------------------------------------- +-- Minetest registration +---------------------------------------------------------------- + +minetest.register_on_player_receive_fields(on_player_receive_fields) + +minetest.register_on_leaveplayer(function(objRef, timed_out) + if objRef:is_player() then + forms[objRef:get_player_name()] = nil + end +end) + +---------------------------------------------------------------- +-- Public Registration API +---------------------------------------------------------------- +-- `simpleName` is used for the description and for the name (can contain spaces) +-- `inventorySize` should be 16 at max +function logistica.register_cobble_generator_supplier(desc, name, tiles) + local lname = string.lower(name:gsub(" ", "_")) + local supplier_name = "logistica:"..lname + logistica.suppliers[supplier_name] = true + local grps = {oddly_breakable_by_hand = 3, cracky = 3 } + grps[logistica.TIER_ALL] = 1 + local def = { + description = desc, + drawtype = "normal", + tiles = tiles, + paramtype = "none", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = false, + groups = grps, + drop = supplier_name, + sounds = logistica.node_sound_metallic(), + light_source = 8, + after_place_node = after_place_cobblegen, + after_dig_node = logistica.on_supplier_change, + on_rightclick = on_cobblegen_rightclick, + allow_metadata_inventory_put = allow_cobblegen_storage_inv_put, + allow_metadata_inventory_take = allow_cobblegen_inv_take, + allow_metadata_inventory_move = allow_cobblegen_inv_move, + on_metadata_inventory_put = on_cobblegen_inventory_put, + on_metadata_inventory_take = on_cobblegen_inventory_take, + on_timer = logistica.on_timer_powered(on_cobblegen_timer), + can_dig = can_dig_cobblegen, + logistica = { + on_power = on_cobblegen_power + } + } + + minetest.register_node(supplier_name, def) + + local def_disabled = table.copy(def) + local tiles_disabled = {} + for k, v in pairs(def.tiles) do tiles_disabled[k] = v.."^logistica_disabled.png" end + + def_disabled.tiles = tiles_disabled + def_disabled.groups = { oddly_breakable_by_hand = 3, cracky = 3, choppy = 3, not_in_creative_inventory = 1 } + def_disabled.on_construct = nil + def_disabled.after_dig_node = nil + def_disabled.on_punch = nil + def_disabled.on_rightclick = nil + def_disabled.on_timer = nil + def_disabled.logistica = nil + + minetest.register_node(supplier_name.."_disabled", def_disabled) + +end diff --git a/item/craft_item.lua b/item/craft_item.lua index 1b5a6a1..80c8056 100644 --- a/item/craft_item.lua +++ b/item/craft_item.lua @@ -46,6 +46,11 @@ items[L("standing_wave_box")] = { stack_max = 99, } +items[L("cobblegen_upgrade")] = { + description = S("Cobble Generator Upgrade\nIncreases Cobble Generator Output"), + inventory_image = "logistica_cobblegen_upgrade.png", + stack_max = 4, +} for name, info in pairs(items) do minetest.register_craftitem(name, { diff --git a/registration/item_recipes.lua b/registration/item_recipes.lua index 8b85cc6..730f3d6 100644 --- a/registration/item_recipes.lua +++ b/registration/item_recipes.lua @@ -96,3 +96,15 @@ minetest.register_craft({ type = "shapeless", recipe = { L("lava_unit"), "bucket:bucket_empty" } }) + +minetest.register_craft({ + output = L("cobblegen_upgrade"), + recipe = { + {L("silverin_plate"), "bucket:bucket_lava", L("silverin_plate")}, + {"", "bucket:bucket_water", ""}, + }, + replacements = { + {"bucket:bucket_water", "bucket:bucket_empty"}, + {"bucket:bucket_lava", "bucket:bucket_empty"}, + } +}) diff --git a/registration/machines_api_reg.lua b/registration/machines_api_reg.lua index 2e631f9..53e14c6 100644 --- a/registration/machines_api_reg.lua +++ b/registration/machines_api_reg.lua @@ -38,6 +38,19 @@ logistica.register_cable_toggleable("Toggleable Cable", "optic_cable_toggleable" {"logistica_cable_toggleable_off.png"} ) +-------------------------------- +-- Cobble Generator +-------------------------------- + +logistica.register_cobble_generator_supplier("Cobble Generator", "cobblegen_supplier", { + "logistica_cobblegen_top.png", + "logistica_cobblegen_bottom.png", + "logistica_cobblegen_side.png^[transformFX", + "logistica_cobblegen_side.png", + "logistica_cobblegen_back.png", + "logistica_cobblegen_front.png", +}) + -------------------------------- -- Controller -------------------------------- diff --git a/registration/node_recipes.lua b/registration/node_recipes.lua index dd6511c..4f5b54e 100644 --- a/registration/node_recipes.lua +++ b/registration/node_recipes.lua @@ -125,3 +125,16 @@ minetest.register_craft({ {L("silverin_plate"), L("optic_cable"), L("silverin_plate")}, } }) + +minetest.register_craft({ + output = L("cobblegen_supplier"), + recipe = { + {L("silverin_plate"), "bucket:bucket_lava", L("silverin_plate")}, + {L("optic_cable"), L("photonizer"), L("silverin_circuit")}, + {L("silverin_plate"), "bucket:bucket_water", L("silverin_plate")}, + }, + replacements = { + {"bucket:bucket_water", "bucket:bucket_empty"}, + {"bucket:bucket_lava", "bucket:bucket_empty"}, + } +}) diff --git a/textures/logistica_cobblegen_back.png b/textures/logistica_cobblegen_back.png new file mode 100644 index 0000000000000000000000000000000000000000..e3b1c154145a2a7ef86c3bde5af029e29343eecf GIT binary patch literal 2372 zcmaJ@dsGu=79Xf6(50j;EsyrdbVLz%^W-II1`H(CDB&Fgk%vPv2~(1pn3+Jrs%sUM zrRp&*+6r2+4N##+#no*U6%LkC53N0?imY`pm9nKPRTPnG72Gcg@~F0dOp^Qk?)}~S z-Ph#rX(>znd_#O82=bFHlVpHzmhSTfe8(YD5K>(xiJYZB9@hz@XWH5EOlA2I!=Qm#QTaY zLO@`^84R`<^dv2`pooiC2!1<{xd`l1VTw^CTb>3dQ6?OY=0tONNW3pBGHJBJ49Qy) z#y~=mB8D*vx!lsyQch_khcfB7{J6L{E>FM}2-rY_Ot#C%KJglitOwQFC!UZoo-~=JGjw?sR?JLQF+N(i7{_+r)wypQS99|FOEkFyk6DBP{`m zn<&DJn4UPGv#ds(n}O4m*`&s$B_MnAT#0k$MVLldaDBFf07<1mHBf{f^BXYdcfce{ zPnj}76XL+gW#i18P-eh%xRTH?MUz}p=gBy!`z_#%OmB9!f`TN#T?A8H*;5#b#0t36 z+~hnHnyiD+6`h>YfZ!rsgj0|#DJjiFX$d{R=!~U_uuPg1!;g!JVGB5J51?p5U`uGN z5{v;_0-hj}&F8ZPyeuAH7`a#&8LM)Ux)j0KXfOu*1660=!y=7Z$PkPkcS-I!5bGJY zxk zAV|4fxC}5*ChIiknfRKS&Rx?7!>*nZVrpkeP{e4WG-frfaorbO!;R9EmMO(dxL60; z2}Q(OEdh#Wh0~mK0)yG)aol}0X;E5)1GZ;ok~{qtPoffWpNiXk>1n$I*tyTZP6Eq~ zJGtF}Fu5Ob5-dd%*nUL!tV{^f2!^fw9sa@wXR4^59myIJHwv7GfBLuJUXXJ zeCgZTDzEO^**WZAhnLolT2g%oKh@@qAJ-Kmjd`7z{k1qPKz#gi?xl=jA@{lY!@0Lk z9(Z_W;PqQ*;3u|iySiVS4cBxPAFOqtp?SvG_#fIfZ%+A{FIDQ=Uw-k%cb)qsmAxZ- zPu%DnE8g+n^1~bIWR~Rg6Q^(6Z;z<*qphp{U1wK!wKufq%Q*|z7T>tz+xq^##@p|m zSA_*Y#WhFYRGhmLvhrKi%Iy3d;WZHpTYupf^d*vI92`hoD4+?MNZQ52D zTJIk^cI=~+@wU|QzclS?s!&FJ*qm4yWj+1jtM;u{ybZ(C4`1;8;j?;GfZl=)nEC$l$O-d9-EDnU@@=M*Qafs_V%Au4xFo#(a#+ za%c#8{$=Om0afn{f*{WTnM9nm(1z}8CSOysq(fiTbbh*Gd7*d5_Qzq{uLe~NhZ1=q zESA0bT|58#1)JXtymhhPf0$k6osJyJJKGyeX9kTvcxMycfA5H99qSya7a6Pd!N|xZ^L~%d#_k__A6IyJdoTI^`pNO5i)6gNM)8oh?+*?wMytr1>v*$m(hBNsMVNq{f`SOaa4Xu9_%KCg)m?ElrMMTHS zrdM7t_?n;h^?7t}^y@puk57!>@9Vhv&|fb`RF|5&RX4}S&qfrGdt|#;vj)~Y8tQR) zJR12Xw70Qh$s2Q1x z@sHN^_l8;y50y6jBYg4ow$~-LbJthr_3RE?P_2L)x3nhwZ7&Libq}4rn6o|iNKc7y z|Bbs=u|;7!66*!Y6!T@+hHHI9(29u5<~+Zg_w)-8qzV@A{1aB_$@*u@rVn;>eq>u) zpUSSVFZYl}MFdoz?e4iN+HxRBsZ_2k-fg{x&XrdAde%Z4Ho%Yvt8bf?d^na*u0I*v z$*;3Fu5(bIUL719#DbPbtaCVedkrx)9fi$TZ|>=;YkBP7&?76TUK4i4`R7L_O_3Z< HT)pxCp7L~_ literal 0 HcmV?d00001 diff --git a/textures/logistica_cobblegen_bottom.png b/textures/logistica_cobblegen_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..bf2aaa356cb277098366d88152fdf9f53b55a158 GIT binary patch literal 2371 zcmaJ@YgiL!79K(sK~cG^f_5Pe+k)C;l2}m21Plq4C_#uIfqLmMnIuCllO_|Au%3E>>fcdkkZ06QT8gGDTFNvW)EF1T@H2)W-Oo3%W2WaR%jJKpZZM3whJ}vL0f`$b z!kCzzIB~kq7s3?wr>-GSOh5}ns?T}(L z&=T+j^EiAyN5D(v@zF>g$`@q1NL`9xY*ZMH{edde_iUjGM`@DQ6E4X;2Vy<#mfWJA zWSSqY zXaZoM%#KmcmlJP}b?%xzHrv%xD26j75y2)irLy9L%5`6G4L53`)U*vV6JiZ$ClM@G zt4UBi2RoUW6E>Jl9@pJR!xlCz0ob0KNo4dbo<=1^o{8Ii=~24_*tyTZP6Epf8QyL{ z7~YSB5iCVB*nT1R7i@zdk3168|Czc&P(+cns9|YbO5my3Y(+)N`x5c`{K$+FaohQ_ zl5rQy#%FMT>04aZZ(rt3`etr;d*7Zll7Vsc<6FeZf#QRgR<%|_?^nVv^EWS8%JbOp8uDq;E6uQbZKjwPlh7C#G{P=WDQ-I%{Z%>s<3$HxQ`e z0o|sX`Jb-aBeN%_)F17w=zW;EI@0m_fA>`2%}sloR?E2&Yjt-X_%v+$sH%7C>CC?b zLb@F_3)7B2n6ct~<_hKNP2oFcM>PDzU-Mn!jqjW4a+*+jlA_63qvcX zgbvj0PI}U~?8z(6VrN16>|M2Sg|9k}?wVGS8+WPVws&xFp?YwzKW*9MM{_Qg{=FtP z_~h$TUNwpjse*RC^N*Am*5$C3H>w^vy?A}x+)t_;{pD8Ab6jWUTCa2S%dd;yBWpuX zzkFePV$)skgVOSW8QZ7N6+IT+`Z)x?+n1JJbHwYIf7juMz9GM8POSdcc^|ySyiExi z76_Ucz&sw%_K$)fh!r4{ic>*3HrHkcVu2gJJ~mi7pvjR$E%j&R6mR{{$xG{M57gJy zzPBQ7kv_2PwOViO)~2QW=p(ruj-6lI5}_S?HiYEtd1)lX}Z69HcI^?c)Gp20`ZboZ9dU8 z!?|tC!rmt*TC)!&&c4^(6VmYL>ajz|bC+6oDvH0+UpmmWeUj&a<1MXiKUTkkcytUr zm=hWg^AcJrTXJz+BF*18?Vr{UyaW7N>unzpf4i`-tjAED)$!T>f`ZMgDKDvmuU6hZ z+|&7WyCdbSbBSkL`6A7xgyx%yKH=uP`~^6RKQSq(AtxJR{SaB5t?W2;y*4%NU)&ve zl7Ik@O>^hkG-{j8yk195zl)xXaC{uT`^~e`f`YG3cU&{s!lr~k%Dq)4U+2Xo9Rug< z@3r`CE4?axF=*1{!Op#vPWjx=TUz9@*(vQU&42P+c-&)w2lVANXu`Up!`4*|%2#gp zeu=GWpY?*8TbPBG8Y!x}{caGR5~$H=wwzY+g3jLh;hJe*)mt80L}6booiytU=D&|D MK1up%+#7HIAEb4C%m4rY literal 0 HcmV?d00001 diff --git a/textures/logistica_cobblegen_front.png b/textures/logistica_cobblegen_front.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4d1a2484300cd3d2b48432280b99b8acab2c15 GIT binary patch literal 2368 zcmaJ@dsGu=79T)c8;c8yf{1n)yFMz(BtfEN6D%YY0z`oX3|I@pWReV-WMXClfu6Oe zLakO=#kN31If$}FtF>C|X+?@6wTrbBrO3ASp+dz%>*KHxEsFakK_1oik4bXB-@U(k zzx$eOPF@-3%L(Q{5ag?fm#2bnKi4zG8+>jrHHaW+vVv4=SdB7CjMF9_rloTTp50^t zI0Q*n*ew`tBv?3y(355f&d&IA=l!g+!mXaax-gjl%NO`VP+Xrz!RY3^$9yU7LA!1Nf$^Q>Oz1z ze}Xzo>i$ICg*>KiG0-f{7--9AP!n8?!jBn(bU)d|j#-|htW^HBy2&)*8Vnno2NE|@ zgb6V{a=@qyECiZLFtp8z6R~+9d-L6ibLB;xOxg)bBPT&p8Bh%=A`txn%=i;fMpLv^ z1)7imMs6Ed=EMpUrYBaDTGlYiHFlmvnDu`IT#->WS1Y8MNpKh87?)-YlOoH6=r}hS zPlQJ6Aa+Nmq_rTpa5v!?q>#yyt+bA$0LG-o#lVVKnMe>R5^;q*j|WgRF|Z|d1#*l9 zT0*`soGTD;g?u$%AQmhYFXd;tN!^NIY_u4Q{e`Nl?_r4+7qcWw5pKyd2hkMkkvt+r zx|&~1VP?G)v2(SA4zp1#5=GH^l3__4%Q9iOfix401a*xKMUHT}rAK5Ebb==d2vVsO z#{&l1S}@MJidZ+%xqJFx*xgfN40n}8idd|))`k;W_kF=NJSao!*nG@NMC(C2Ns(xs zjs(RkfRkNw0)yG)^E`btYLRas0NWEYiH^U;qo^e4V{v;fJ#KdZJI@)|Nnp95quUJ# zqx+FCgQaK%+mAPQS`Y+zy-tGqKUQ}LT2yK){d$Q!CE$w{;j-pUIeRooO}U2T99%F% zh6(!L$*OcLYy9TqokDtn^7y&Dx2Df&oOORP_3p>1@`U3DH~Y3TRgU16U6()YVH%xP z?F~H}REqa^W_0;*-;RihZq%>GE~uPI^9PQ#MX!-Z3^;BV$D|E?at8aNGO9j(fO(jS zhnWvtsSBK^vdv#2SuANN>oEN|%dAqBR@~nIVdwU#oS(icJl2eg7AD>&KH5|4eTDKL zeEzj{{|kJ7v1~?JdHbPSCih;{VB+_8&cCe5DYq|N5W3;+9scLby*AFyR$s?{589WN zu5NKY=>GcX3!ff1FD`gCJ$?tWW%W0^)Y}r1Hq9$9T|he@(pg_Mw`K1?arti_uPPh3 z zUoic4p|^5sTcNLSVr|vC&dAT6Cf0t|%gJ+AuWnt2zUGr~R{yQwlra#z#-6dnXD|>n zb%yKlf_Cl#74r5|$fMPu9H|Yt0Vx5)Hye6xp8w#)Km3c{xDu|p?z^?6reu@<>9fci zC7kqOwJ0~V2A;IVZ_W|_Es~l*cHZV7j{5Rse?!H#%nR{33e*W^y z^C5V^W^Re-bg*GEl;RhZ=JVWzK4R~MMM{D+L&{qD6AL4y z7eP?(a}~qQ-F{SCuI&ESjXAX^2Y*ym^&FRRjgzMM57pPj)p>i%<~9xbA(P@)rQj8g z{hfWY_ZA0C?S1MndPw723%xigw8nhOduhzU9nYs2mvs&f4qpG~%vPQ@E_PkW4P8c5 znEZNCEtybs`pUifZGmW5&>?zlLz92#wV;sD4TsRnAziJ}!^15;2r{$7qRC8L?$v&A zXyfACTMfO32m2)}E*%Y9^47I|)1g}O_uT&WU-C|@@5(GA!rLGID?``S-+44|)vX_D zTeR2yZR@+0`O_>~R(VjiH*?>eHr+4TGhWOn+j}%&hx|RVx8~yJ-3yOJcRSVuJLy+1 zHR&YtjQ$SJkZ%3X&%;HE%p>y>y8`~6P&qs6rKe4?5PTrJb$tYf|VZ!^rNHZ#o`A&9BaxwswDdvFneIB6g+xgP80M F{|5yub)o$9%$Q6_V6~f4 zp_Zx@^qiv63Ks1ab~*U!IbtoA9%NY*j!;nKAY0!`6+wlnJoZb1JgV&F=6#WpCvvJ1TB=tN#x+$&-pCy1fM%fvLhjAo)k|`rBh|`d^Krgsx)L4#m<}gUWZ+~y0^=GKNr{lLWt14p#^dr$*xLMrWOcq?&C?*lXdi)% z4+xAHt%7Yv17YUdP{hT{2fv-iEChC`(0UX}l_kPr(uBbg%m^kMiS~g7CXJRam#msJ z1`>*7(=^3rv8+}r(;CJkO*$5b$K$csTo#wh02&N)9zm;Y48k1Zq;PXcFtgf(Q#4Kz zu#;1jMOtVSK>!XuC^ z&Yq=C*J2xHJ9kYV47+-YuTncpf+CcO)L7J*#&utC4L52gwX{`b!bCdI zPADSMYH?7!JUG!gCoq^zHq+flQx?{246wa0ldPGycovm_^<3QUOV8LHz|MUJb`n@_ ztf}n=gsJ_A5nw5r!1nVve`P5Id3=b2`af592nsE+l+^z%CMlpvm?N)D+94Kwv^gSe zm*~g#@?G;f%e~SVPli^P58Kvw;|rCA1^+ylDIS}5-0PeuF+g;zYyFS%AwFx)vZ3|& zPV9er>gJ#Cp|AX_WNT^Xt6s39MPE_ghX$upQPEdV7ZxV`%!y6WH7x$)ol8yoB*ncC zcOSpgG^XEveRGZdpwt$hbo|@ViGa~ZdyLhlt-O}(?LxzkQx>0{;(5Jp^Z`J+J zo0V?_Kzc{*O2rR@OV+h3*QI7`U*UK&w0?w>c_seZjfNw+EkDPskoXCSLxC$!vp?Ee z9DK+(cLZ%>##Hio^51J@9g6eoR;8E$^V9V(rAluwu=k$8UA+ z`=C}Bbml$Za6)uK6S)85qNHfgo{;s|svcL*XAd#+zply~uCUB$WmYRU&ToyXxGLI) z9}aF_-mxdXq2K$Mq+)Ezo>$&RpQ1N^c@60wQl!+LoPWx{ukPW(*PiGaGcHvRfY+Ee z6_;j)pg$~jJ|57Xy@3$q`La|ZN)9bi>_E2%qy!YUof!D8<_-~dRU6-s5O>kzHq2X2 z**C*SuLbiqWPQAzK%; zZ_e>XHu*w-ZB1+ciK46Z<6Qu=-}hw8`{94fqT6@^wROqGSk!l)G^kH?DqEg$@Z7gv0EvSZ}jN! z(A~fLdv$I32eU3kSWj7X)Y04K+z{#I|C(B_r_N2r-|76}%m&(ef!p2S*y|D77%uY_ zj$dxQ+24Dwd*{GJ&(XetQ^ua<=ke|Zdw3c3o1!|Q9cPJ=+@`OEi|PfNuAJ;8E(Ysj zmTny#TJ90Y4U-=5tXfv{RNN7M`J20b0^^aDQu#~X1(oHc{`Rt*e<#X%?shG^t7!6% z;Vyo?z4ZI{Z|k2>dlw~Hi+Ao^99;Ba$FcEa%Vb_2ejawexpt^P!I5D{yYG*V4%YWu z-fcd6VdMw7wBp$Jv_?T3T8%O+K1ySfk1ml78?~gP# LK~fX*e!>3%_>YJo literal 0 HcmV?d00001 diff --git a/textures/logistica_cobblegen_top.png b/textures/logistica_cobblegen_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1a704170240dee4edb1007ead406adc9d736cfc3 GIT binary patch literal 2365 zcmaJ@YgiL!79OM^ut38~OJo(&!76P{CJ6*fOyCKGLUsv4Oa!8WF_|P&l1$7@NIQrp(JfBs=*9=_}<5DFbz}j;Z%;8DK^HUS}Y;ggf7obk}7kvl#wbpI?9V@ zzt$f(Q%LTvf#|TVwsE}EFI8B^Pi^WYSjls>mCvps=!b&#~A$AHUhY%%{Cd^1; zxPfNpRIJ6#Bp-$WPMaWCDJQv&W|PjrtWqMV4%MRul0aAt7BXEQwPI7z7>J2t|epAmg$@ z;wFkPBc^8#2x*QHMIu}R@(1a*3a@g22#}(-n8Z;GCk=jYFsq;kCp!qdmk4$H_w}Q-ofxED$xYDLDKD>mD zOmma|LTIuMTt{?bTm^y)a}Z8JqS)AE6RyT|03#&vF*H$JYy>MZB7)9lI6Z)(ae*zS z&Jij|pv7jg!{{s)oz0XoS={g?TvnLeLF!NhW1~`#ir-PS_dSiLQgTU*)S(W^IR^qA z>6DzJ4zo8uSEn#&_^_3(Le&bhj)bFhxCSFgOsUA!E0kKyfD$~!J~ldRg3BR2BjX`6 zJn=w~Vlg)XFyN+~Y0j6U>t;H4OdpNr=qav3X)g&MHkxpiS&6C~_XXE*q6DrcEeaDV z(13R0!veJ$1I5dsCEMqO24<7VaQ4xpg++@3wijj+nSP6BQSp%H;&xto+U@{$&NHx+ zz;Z(-w;K>9_akZmOVI?jU%E$lGz7V9#z6g_t2+dRmYPf3{t}boe++%9Zrz96)9Fu!;}1QwF7w2E)?Sw~jIp&R_*)y5@JH_vR@l5~d^m#S%><2P{qLbsn z?7)r%UtD;_me@Y%c|uq*7HA82i$BWme-s1{4$D%HemwisA8-8YfltsA&AE*0b@#w) z%+r{VPC(Ef=GY$>$aa7VL9={BLV+~2bmOiD{1t)!xi89F{+Ipj>C=B**hLxl^WNiL z;+C@QNW+5g*Qk^=wlx$Fj|I(zh0^b#&Go{NgtC#A-i^nXj${Zcyxx9t;1|<-CpHo* zg;LIWYRr+rKq!xrzn>$%a&P48lk=sa0QJ&yK`S?fv{=h!&r}R)-Bc&(puZrl48%Ue|x`_ zw@W74D!+P?zO3d-vI%*l`fTT{(F7gjEu`g#NSYsWQ3P(kdB0~pdtq3Ix_qAtd|mDK z-PWGJS$wah9SQXc@^(+VwW9oJ;C`1cg75ruPsi@de{X0gs43dh?QP?5BCF5V)YM$N z*4=q|sfNj^FS|8Z9uGBcvd)|B<~J`vx~Xw+#||I0T4L)Qp!E3peOX;giOJBoo~`d} zAGm%JRiE5!c|G7Y=x~1HpkZEg@z{8}thk8!((SI~|Cn0(sLJn)FS^Ck`l-l`AafQb*D}Q<9 zKL3ZlUi{N0(dxaL<8$wR^DSmOzdlpey(#KJ?y085aeV<41;hVg>*pWY|MiICl7x*h HYx4gOw`y+| literal 0 HcmV?d00001 diff --git a/textures/logistica_cobblegen_upgrade.png b/textures/logistica_cobblegen_upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..72645a1cd21119053840b502c52078f506925daa GIT binary patch literal 2124 zcmaJ@2~ZPP7~Vit zAQ+5mHRz2rY8Ar{UKD(1j}e&b5Mc_$uu87rN+>hIjo?S{!{AtVuE?y`py|@Lhn2xj z4C@%igd#{$Q4zl=oKKmxh#)2=1_=`)LLm=G@aSSAgIRe-I)J5ca!3gpHNma z6U(P8j2MOi&K)LK<0ITAi&^hrR^tevCk%v8Sx)S!^PZbb_WVW}HYU1knp{1dfdhsvxa|UL_?#P-&12F&r*@2F!jAD53O}IRg|S zA%+DG9X4{P%z$Z$EK<$rMz}`LQwXE>S%CFSZ(&Pexse2SaoTt2s75g{93@1?n8}_L z8p#9d@J>#tfpg&w=SCr!M4~WL8d481I(=z8SC$}&6vRYE@`QY+1&}lp=#rXZDaHUP zVVE$SClK%iF-oBjjfg@cB61w04nfd1YK*~NAj;M~SER;KhGg`FW9RIHI6dRsIk$R} zEq+vw8MR{A%2N{>%%W%DSloJd^hK!6guo)SQgb_?b zGZ=e|231!eh_j9aiJy>g2zs-^QgJCnn)XWT;&4ezX?~q5<(t(yMLsU@mSBQ^cIMVr zM>SnO-EX6U+vL?r@2#GDVNX|MFWqF{+j*vUeTJ-| zCi}K4@56}rxF+pd?1v0{O2EL;j<^-lh=J<94e`qdPn^SAYhzDk4$wn6c&M?y`=HFmu~&62Z8Uex$oDo zP~u%#)p_^;z4~G7gXCZOFRoPOS6PFD7OelbKkVCR&c-=;%HOg7{P*W(Dlga{-?{YF zTaEP>(PGcc#2s*1*5y6Q^5m4#`BfD`lzoWGZExwwJ9M&Z#<69U16N!vD-@xsE4_7u zPkHlzn_qR(le?TPr_0_ssQY!W<1|NG<-M=?T4&ho!e(>^1wRLe~Y)$Gizsa`}vTvm)x>nc5SQlb}cnS zheNe_`y{Y*ThfkK`v&b){i2P5(-a;v|8`4jEUC6!>+v+Y)7i|5Vel zcd_YSxu)BzeP&qUzy@tgd;8X&PZo5A&z%CL-N}6~C+A@g`zJt_kShH=K5za1D5UMP literal 0 HcmV?d00001