From 92914ba66b0296d3d6915c7236edd49e2b90b8ba Mon Sep 17 00:00:00 2001 From: Zenon Seth Date: Sat, 11 Nov 2023 11:55:33 +0000 Subject: [PATCH] Increase mass storage cap; add mass storage upgrades --- ROADMAP.md | 2 -- api/mass_storage.lua | 21 ++++++++++++- init.lua | 1 + item/item.lua | 4 +++ item/storage_upgrade.lua | 30 ++++++++++++++++++ logic/mass_storage.lua | 37 ++++++++++++++++++++--- textures/logistica_storage_upgrade_1.png | Bin 0 -> 2171 bytes textures/logistica_storage_upgrade_2.png | Bin 0 -> 2196 bytes 8 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 item/item.lua create mode 100644 item/storage_upgrade.lua create mode 100644 textures/logistica_storage_upgrade_1.png create mode 100644 textures/logistica_storage_upgrade_2.png diff --git a/ROADMAP.md b/ROADMAP.md index 1e400fd..782be47 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,6 +1,4 @@ Missing Features: -- Network Importer need to be able to target Passive Suppliers Chests -- Passive Supplier Chests need to have configuration to accept from network - Storage Access Point - Crafting recipes diff --git a/api/mass_storage.lua b/api/mass_storage.lua index adfb9f0..7005cc8 100644 --- a/api/mass_storage.lua +++ b/api/mass_storage.lua @@ -232,6 +232,13 @@ local function allow_mass_storage_inv_take(pos, listname, index, stack, player) logistica.update_cache_at_pos(pos, LOG_CACHE_MASS_STORAGE) return 0 end + if listname == "upgrade" then + if logistica.can_remove_mass_storage_upgrade(pos, stack:get_name()) then + return 1 + else + return 0 + end + end return stack:get_count() end @@ -254,6 +261,12 @@ local function allow_mass_storage_inv_put(pos, listname, index, stack, player) logistica.update_cache_at_pos(pos, LOG_CACHE_MASS_STORAGE) return 0 end + if listname == "upgrade" then + local inv = minetest.get_meta(pos):get_inventory() + if not logistica.is_valid_storage_upgrade(stack:get_name()) then return 0 end + if inv:get_stack(listname, index):is_empty() then return 1 end + return 0 + end return stack:get_count() end @@ -278,11 +291,17 @@ local function on_mass_storage_inv_put(pos, listname, index, stack, player) end inv:set_stack(listname, index, fullstack) end + elseif listname == "upgrade" then + local inv = minetest.get_meta(pos):get_inventory() + logistica.on_mass_storage_upgrade_change(pos, inv:get_stack(listname, index):get_name(), true) end end local function on_mass_storage_inv_take(pos, listname, index, stack, player) if minetest.is_protected(pos, player) then return 0 end + if listname == "upgrade" then + logistica.on_mass_storage_upgrade_change(pos, stack:get_name(), false) + end end local function on_mass_storage_punch(pos, node, puncher, pointed_thing) @@ -372,4 +391,4 @@ function logistica.register_mass_storage(simpleName, numSlots, numItemsPerSlot, end -logistica.register_mass_storage("Basic", 8, 512, 2) +logistica.register_mass_storage("Basic", 8, 1024, 4) diff --git a/init.lua b/init.lua index 3f3a6e1..9f73f00 100644 --- a/init.lua +++ b/init.lua @@ -7,6 +7,7 @@ logistica.MODPATH = minetest.get_modpath(logistica.MODNAME) dofile(logistica.MODPATH.."/util/util.lua") dofile(logistica.MODPATH.."/entity/entity.lua") dofile(logistica.MODPATH.."/logic/logic.lua") +dofile(logistica.MODPATH.."/item/item.lua") dofile(logistica.MODPATH.."/tools/tools.lua") -- api should be below the other files except the registrations diff --git a/item/item.lua b/item/item.lua new file mode 100644 index 0000000..72242cb --- /dev/null +++ b/item/item.lua @@ -0,0 +1,4 @@ +local path = logistica.MODPATH .. "/item" +logistica.craftitem = {} + +dofile(path .. "/storage_upgrade.lua") diff --git a/item/storage_upgrade.lua b/item/storage_upgrade.lua new file mode 100644 index 0000000..0fd6b08 --- /dev/null +++ b/item/storage_upgrade.lua @@ -0,0 +1,30 @@ +local S = logistica.TRANSLATOR + +logistica.craftitem.storage_upgrade = {} + +local items = logistica.craftitem.storage_upgrade +items["logistica:storage_upgrade_1"] = { + description = S("Silverin Storage Upgrade\nAdds 512 Mass Storage Slot Capacity"), + storage_upgrade = 512, + inventory_image = "logistica_storage_upgrade_1.png", + stack_max = 99, +} + +items["logistica:storage_upgrade_2"]= { + description = S("Diamond Storage Upgrade\nAdds 1024 Mass Storage Slot Capacity"), + storage_upgrade = 1024, + inventory_image = "logistica_storage_upgrade_2.png", + stack_max = 99, +} + +-------------------------------- +-- registration +-------------------------------- + +for name, info in pairs(items) do + minetest.register_craftitem(name, { + description = info.description, + inventory_image = info.inventory_image, + stack_max = info.stack_max, + }) +end diff --git a/logic/mass_storage.lua b/logic/mass_storage.lua index e934e23..fd346d0 100644 --- a/logic/mass_storage.lua +++ b/logic/mass_storage.lua @@ -1,12 +1,12 @@ local META_IMG_PIC = "logimgpick" local META_RES_VAL = "logresval" +local META_UPGRADE_ADD = "logstorupgr" local VALID_RESERVE_VALUES = {} -for i = 0,4096,128 do table.insert(VALID_RESERVE_VALUES, i) end +for i = 0,5120,128 do VALID_RESERVE_VALUES[i/128 + 1] = i end local BASE_TRANSFER_RATE = 10 local function mass_storage_room_for_item(pos, meta, stack) local stackName = stack:get_name() - local targetStackSize = stack:get_count() local maxNum = logistica.get_mass_storage_max_size(pos) local filterList = meta:get_inventory():get_list("filter") local storageList = meta:get_inventory():get_list("storage") @@ -32,8 +32,9 @@ function logistica.get_mass_storage_max_size(pos) if not node then return 0 end local def = minetest.registered_nodes[node.name] if def and def.logistica and def.logistica.maxItems then - -- TODO: account for upgrades - return def.logistica.maxItems + local meta = minetest.get_meta(pos) + local storageUpgrade = meta:get_int(META_UPGRADE_ADD) + return def.logistica.maxItems + storageUpgrade end return 0 end @@ -233,4 +234,30 @@ function logistica.get_mass_storage_imgname_or_first_item(meta) if not v:is_empty() then return "\n(Has: "..v:get_description()..")" end end return "\n(Empty)" -end \ No newline at end of file +end + +function logistica.is_valid_storage_upgrade(stackName) + return logistica.craftitem.storage_upgrade[stackName] ~= nil +end + +function logistica.on_mass_storage_upgrade_change(pos, upgradeName, wasAdded) + local upgradeDef = logistica.craftitem.storage_upgrade[upgradeName] + if not upgradeDef or not upgradeDef.storage_upgrade then return true end + local meta = minetest.get_meta(pos) + local storageUpgrade = meta:get_int(META_UPGRADE_ADD) + if wasAdded then storageUpgrade = storageUpgrade + upgradeDef.storage_upgrade + else storageUpgrade = storageUpgrade - upgradeDef.storage_upgrade end + meta:set_int(META_UPGRADE_ADD, storageUpgrade) +end + +function logistica.can_remove_mass_storage_upgrade(pos, upgradeName) + local upgradeDef = logistica.craftitem.storage_upgrade[upgradeName] + if not upgradeDef or not upgradeDef.storage_upgrade then return true end + local inv = minetest.get_meta(pos):get_inventory() + local maxStored = 0 + for _, st in ipairs(inv:get_list("storage") or {}) do + if st:get_count() > maxStored then maxStored = st:get_count() end + end + local currMax = logistica.get_mass_storage_max_size(pos) + return (currMax - upgradeDef.storage_upgrade) >= maxStored +end diff --git a/textures/logistica_storage_upgrade_1.png b/textures/logistica_storage_upgrade_1.png new file mode 100644 index 0000000000000000000000000000000000000000..956456bf586526191cf28c8c8999b61837891ee5 GIT binary patch literal 2171 zcmaJ@2~ZPf6yD%yDT-AQ#e2Ibp2;SmLD)%fAVCfZjU+(8A}q-!S>0qqb|V32v?^n@ zKq;b7)T*>%J!)GOtp^CLRK=svqBu&uMk|V)Dx;XT9`xS?ITW4ACVBt&-uK@Bu4Jt$ zF4Eg;tQQ19-qBHtcYO-@E@!bWM32k~^^!U;Kwu_V z9Cnx~3xhdih>I5k-??KHfn6%>Vi}@Us$e;7BVdU@A`l{>Ua-`rH(>FKxn0IUk|8FR zwPGlmm6avP3KY;bBPt3B2|#V_~||1rmpH2v8UHQD;fR z8`L@EHFc|rW@*MmTf2km$e7m~Y+~*n$8?gi=uB!-rVtVO- z(PUc*G@f8+yG=(#ECJc`cO{O?3#K9+1f^AwAgK(fh71t}y#gk`0hH4eZBv6LB!H32 zhRYllZN`m65~*iR-CRBAv4q9=D!@fX*|}Cou#n&`;vOz-4<wvkU zQ_^}6T%e1v2a1-q{`5VeB`+3(fYJaWwUE8RJG^O z0m?&XmV7#5T+OIw1E~!M;}tQ7zFq6x#B3=WTfe#GNGnt0+|pFtx>6mzXJhiM0sLY~ zcvy{b8UCBv8SCFs*%-D!A?YZ4m>Zt(^zaG%)TYp5i5*O5if)!=_l=#SC#voKGo{m| z)g>3r*G5^?>Y^_m?)u@<=YzejU&*PgLxZNydqx~6&-J)L4SzCudFJEMd#1~MN=lpd zRxpeH4Sh22kM?sPX){V4Qv=>#`A@s>mtfxNG3lB+_5J9$;Ufnx$=SEhl^nYdbtg zm&Lqj}ioDv@<7#=qP~=VMua8$f_DoGm2ufA(_g%&3Piw4% zbN%Y~pB&rZlobx?9A11cHlV3&{FynQT#+5FI=p@dDLk3Jx5B(2+_U9b`@QzF6RKO% zL$@-W4`bKmPSy@yL#_YYLSsYsr{2G|wDRoqrJwD$X*TGB*&&7F?WqUye$N~hp6-iy zY_Hr=aKB((eEz9h4<>Bh`sEDWkh7(=ZBvlU0^e!S)W$>nR^vBq>8tA5faa9AK~qj8 z{Io4il`ydS_}6!jna>v%9;Q5EstfL>(hr6?;rzM&;^HE)DMDMJI0OGVNpc;j^SgIs zd|Jw&ikmwh_>C;V8@@XDVhk^RpGmdIe=?#^UVVDm>Y?GDyaig@p8E5KwTZV=)R*k< zl;5iLJJE4*APBy>&hN)#&Sl@{#XY+d_&j7GkBQvadS&Ki1NWaHIwDT-U3mJ+{{aCx B6ng*w literal 0 HcmV?d00001 diff --git a/textures/logistica_storage_upgrade_2.png b/textures/logistica_storage_upgrade_2.png new file mode 100644 index 0000000000000000000000000000000000000000..890505a1c10080c062490ef942d8d95e2df10504 GIT binary patch literal 2196 zcmaJ@2~ZPf6b_&*#Zpi}JQ!UU#WUFi3d&A`g#;x+BpfPe6*ikcVa+BRvl~cat3_=G zsthU$B8XzuDpp&ISZ}`02|(p6|f-!OhPJfuLs$m72z-sSwAzFHKav@&#BxJs-t%Rv?u=dgej$K+JfVIU*5==dlvsSSq&M!*q> z%}ASA+$KYvyg2;MA7d!uRN)LVG)<*O)8mq!z6XPgYE5H-?f7&EhyS zj$t`DIij2}5o6I~lE}zNOdN`Zh6&S*?*d%9raFdl*G;%@33rF(-q zkG!I8&SE%*&0@?QL3MM{0l#7h)BSoA8)1H(vP$)Kb)&J{HCQe-8z!#32;E|O;ebuG zn*o*#SjK80L2Ne6Ua&K9d|q%hWdn4Yf`Un9VKro^B;qA7{SBa;p&3gGY(fByoHl&s zaHWyZgK3nO%j)3jJWl{7{mTF!8ExfTVTy@@cM0v}O6$aA=-5!Ki<|VZh%#0lA&HEL5Qd6e9$?XMXiMqr3W9@Lq2kamp+o{- zsbUEp9*KWAcDj?)sR+kLOK`+nRQbL~q*@Z^D2@hB$u$SjH0P3BB2DqlkJE%nFGFoY zEzl8GnnR;V3!&pOC=M7|DaOwWO|_Far57wxteXodj83J(<0zJ6EcPy5Q^1_=UY%oy zAkJpO36igc3^iLAt(62?=S5-sE|g_-Tn=FY(R$cNGBjGJqhQtSh?*Y|1P-NGZ*XFg8Tl-P!c3|a8#zWB#+ZeR4zOua=s>9-+cYU;_>|8Ac9e$<|-Gr0Zz zsd3BE#nT$fQw!r0@&=VG3t?KHGZ|-()n#tkd)cQZvAE^DhjoT}OxpRzN)S+ZsKqm| zbkeiiZcFwrp0zpakG8t~Zu*h{;a-o%vbtyMCNBA@@MfQ!kUsYu?y6pO4sY-HjTI|f zBM-g{W*)rlmEF2-+RtOL`5u#w>n}yBf zly&FAMx5$=^P1ViSrLro=M?oio*3MGL<@&3=@~$M}PyW3a?>qIY8HS{m0henh z>~sWYw*_BX*xPWfX{a(LVAuw`N89d4+FrE70K(Z1)3`TkeG_bF&7MXo(BDT_t~cUHhI&Dr8Qt-@@=BWXH88F z&D(F;*xnJ>=KEG_A3eJ}%rnmuAPqx@D*N~xo|`}25cTPu%x$qFV=EeqW^Y?lcBGz+ ds-NG4?f!bxh`x#WN&KG)W$a|d_L$5C{{us&A^-pY literal 0 HcmV?d00001