From 8dde8ec90bda478b7674c560d2b356f82c68452d Mon Sep 17 00:00:00 2001 From: OgelGames Date: Sat, 12 Aug 2023 22:42:06 +1000 Subject: [PATCH] working version --- init.lua | 33 +++++++ mod.conf | 4 + quickstack.lua | 123 +++++++++++++++++++++++++++ sounds/quickstack_pop.ogg | Bin 0 -> 5421 bytes textures/quicksatck_locked.png | Bin 0 -> 8736 bytes textures/quicksatck_unlocked.png | Bin 0 -> 8971 bytes textures/quickstack_button.png | Bin 0 -> 1043 bytes textures/quickstack_lock_icon.png | Bin 0 -> 415 bytes textures/quickstack_lock_overlay.png | Bin 0 -> 372 bytes textures/quickstack_settings.png | Bin 0 -> 2717 bytes ui.lua | 115 +++++++++++++++++++++++++ 11 files changed, 275 insertions(+) create mode 100644 init.lua create mode 100644 mod.conf create mode 100644 quickstack.lua create mode 100644 sounds/quickstack_pop.ogg create mode 100644 textures/quicksatck_locked.png create mode 100644 textures/quicksatck_unlocked.png create mode 100644 textures/quickstack_button.png create mode 100644 textures/quickstack_lock_icon.png create mode 100644 textures/quickstack_lock_overlay.png create mode 100644 textures/quickstack_settings.png create mode 100644 ui.lua diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..a140226 --- /dev/null +++ b/init.lua @@ -0,0 +1,33 @@ + +local S = minetest.get_translator("quickstack") +local MP = minetest.get_modpath("quickstack") + +local function get_settings(player) + local str = player:get_meta():get("quickstack_settings") + if not str then + return {} + end + str = minetest.parse_json(str) + return str or {} +end + +local function save_settings(player, settings) + local str = minetest.write_json(settings) + player:get_meta():set_string("quickstack_settings", str) +end + +local quickstack = loadfile(MP.."/quickstack.lua")(get_settings) + +loadfile(MP.."/ui.lua")(quickstack, get_settings, save_settings) + +minetest.register_chatcommand("qs", { + description = S("Quick stack to nearby chests"), + func = function(name) + local player = minetest.get_player_by_name(name) + if not player then + return false + end + quickstack(player) + return true + end +}) diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..95ca8e6 --- /dev/null +++ b/mod.conf @@ -0,0 +1,4 @@ +name = quickstack +description = Adds Terraria's quick stack feature to Unified Inventory +depends = unified_inventory +min_minetest_version = 5.5.0 diff --git a/quickstack.lua b/quickstack.lua new file mode 100644 index 0000000..9be5a23 --- /dev/null +++ b/quickstack.lua @@ -0,0 +1,123 @@ + +local get_settings = ... +local chest_nodenames, cooldowns = {}, {} + +local function can_quickstack(settings, index, stack) + if stack:is_empty() or settings["qs_locked_"..index] or + settings.qs_lock_tools and minetest.registered_tools[stack:get_name()] then + return false + end + return true +end + +local function find_nearby_chests(player) + local pos = vector.round(player:get_pos()) + local pos1 = vector.subtract(pos, vector.new(4, 3, 4)) + local pos2 = vector.add(pos, vector.new(4, 3, 4)) + return minetest.find_nodes_in_area(pos1, pos2, chest_nodenames, true) +end + +local function stack_to_chest(settings, pos, player, items, allow_put) + local inv = minetest.get_meta(pos):get_inventory() + if inv:get_size("main") == 0 or inv:is_empty("main") then + return + end + local items_added = false + for _,stack in pairs(items) do + if inv:contains_item("main", stack:peek_item(1), settings.qs_exact_match) then + local count = stack:get_count() + if allow_put then + count = allow_put(pos, "main", nil, stack, player) + end + if count and count > 0 then + local to_add = stack:take_item(count) + local leftover = inv:add_item("main", to_add) + if leftover:get_count() < count then + items_added = true + end + stack:add_item(leftover) + end + end + end + return items_added +end + +local function quickstack(player) + if not player then + return + end + local inv = player:get_inventory() + if inv:is_empty("main") then + return + end + local player_name = player:get_player_name() + local now = os.time() + if cooldowns[player_name] and now < cooldowns[player_name] then + return + end + cooldowns[player_name] = now + 3 + local settings = get_settings(player) + local items = {} + for i, stack in pairs(inv:get_list("main")) do + if can_quickstack(settings, i, stack) then + items[i] = stack + end + end + if next(items) == nil then + return + end + local chests = find_nearby_chests(player) + if next(chests) == nil then + return + end + local items_added = false + for name, positions in pairs(chests) do + local def = minetest.registered_nodes[name] + if def then + local allow_put = def.allow_metadata_inventory_put + for _,pos in pairs(positions) do + if stack_to_chest(settings, pos, player, items, allow_put) then + items_added = true + end + end + end + end + if items_added then + for i, stack in pairs(items) do + inv:set_stack("main", i, stack) + end + minetest.sound_play("quickstack_pop", {to_player = player_name, gain = 0.1}) + end +end + +local function setting_to_table(setting) + local t = {} + local str = minetest.settings:get(setting) + if not str then + return t + end + for _,name in pairs(str:split(",")) do + name = name:trim() + if minetest.registered_nodes[name] then + t[name] = true + end + end + return t +end + +minetest.register_on_mods_loaded(function() + local exclude_nodes = setting_to_table("quickstack_exclude_nodes") + local include_nodes = setting_to_table("quickstack_include_nodes") + for name, def in pairs(minetest.registered_nodes) do + if not exclude_nodes[name] then + if name:find("chest") or def.description and def.description:find("[Cc]hest") then + include_nodes[name] = true + end + end + end + for name in pairs(include_nodes) do + table.insert(chest_nodenames, name) + end +end) + +return quickstack diff --git a/sounds/quickstack_pop.ogg b/sounds/quickstack_pop.ogg new file mode 100644 index 0000000000000000000000000000000000000000..74b6265a639ae4b39e9beb60149dd874ddbcd11a GIT binary patch literal 5421 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 BdMy9| literal 0 HcmV?d00001 diff --git a/textures/quicksatck_locked.png b/textures/quicksatck_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae9f090bed44417d96e0ddfa5c85408c7cbdcc8 GIT binary patch literal 8736 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 Sh0tliYf=F+nhu%c#O%N3j5a})SB1Kes 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 literal 0 HcmV?d00001 diff --git a/textures/quickstack_button.png b/textures/quickstack_button.png new file mode 100644 index 0000000000000000000000000000000000000000..3372f7ba92a91c4301f1db53442430c85812e646 GIT binary patch literal 1043 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV7}$);uunK>+Rh0-Xe(-$M2V4 zk2Uo*zpTXZX+fZiivWu#%j=%osxO`>a&Rei*p&4AYx0Y=l62`VeR(Z3eWSceqKM!^ ziINr0P63IBw5A$gKI+V3_juQC#XU+3&q*Tm$A(7SsAh_ zZSzgRr6F4z+t&hF6N6TU_%<_6isPSPaWtvWjOTD$ZS-LS8C|jN&1!#g*RXeNls8!V zE|_W3YxbTMzf~M$eSCdoKh@T|XtA1e;ZDg?qA08pz`0cUyO@i+o>)%_~-kc12Zb? zcqTa5PiWiqUw;jIhQi^)ho5eVHRepP1cpw-*(LkfEozt8KQUW(eslSJ6Ha(&G%zwS z9|)Vt-tp+uO~=6ZuU`v(jo%;cdiTHb>(-_}$9{bKmb*yqN8^h7dmc|@04auqG%zd; z_&2zPZ@1w)|NPUUe}9kr2j1Vj+y9EV`1Du1{wZ*H07Du{d5|^#gUWjq0xaQ=f4#qX zoBzJaPoB>z4!toaQjFHyp0_^p{ro+l0tZdg;FTfk3b^0AWxNFp!_PMPHAzW}nxhl* zg*`kIL>xR5B!IMB!z2OwiSIe5)O}uda!tnC_11mG;kPti{bhLG{;f+rGA>T=>*D8m z9lvfL-|q7F!OYi-{{8$pW5sX5*Nk$ukpf>$_RBX+O336~ppwAg#wo#&q^R5N^n7ZN za^K@U&!^p-&cNTKVDW61p1J)(mWUv)(wSB~Eo#ySO7FgNn^(~MnTxmkkE|_g;QKrG zG+)KX-4p)WxG;OszptT@S8m^ma;^RUz#;ZCL#7U+%f6+)3KR1;GQRkvE5|DEbDA0h zh}TgQ?cH!~m(P>vIShsWr`=mO_fs`PcG3!#ZRT&Jp zkkW3#RU3ypXKH_Fyt?{o(~9j|Po01L`DaY*b@8q5_HWgTe~DWM4fiXF?$ literal 0 HcmV?d00001 diff --git a/textures/quickstack_lock_icon.png b/textures/quickstack_lock_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e11a930e1f186becf8c7c6288da858d3cbc2efa8 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^DImr^i^mOW6F_U4?Hz*(|DHGt`-_Xg&-4%QdAOg=CjZ)upl`|j@d-ZKm%-_?~Brb~7J z4FiE`*``+y%&e3b+}&~GTm37wed5dieY92LTRLUBE6d3dA0`t--lpRtE)BiKU)T?AMJSsYm$1snx{Oc0gA z$7bEU;;Budmh;@_GZd%kpet|@VB4Pgv@@>i-i1?@y^=~CO&m=MO$r^g9=8A9E1!Go z9rbt43}j*J-$KR^JKBn)KGfP=lStWrL1Mmh-0uX(U-Qd%^mbflJ!*0E{q+g^BXbzR c0n>2$FN031)z^~}rA{CLPgg&ebxsLQ07)OFaR2}S literal 0 HcmV?d00001 diff --git a/textures/quickstack_lock_overlay.png b/textures/quickstack_lock_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb3fa638d9661b39f666e8dd1499863468182f8 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^DImAAW?>4@ssV&~`KG_I(EiBl(r@ZmPBo?54Ac$ChwkO%1=XhR4 zz5VB%7QE}9tIYS@cU|a--pS8QOn;uvcw&2U>5~P!4^6(KR_S{wyx{ALw#TcVD(Fu= zvZHU)&RugvBR4MnA{w)-?sG)Z!#r;PHDUg1-%W`6s>^mWOlC=T-U4ZvG`afyEt3O2 zugaaI(4^3zz@fy^#L)y~f+^h@pYk1kPo00dS@zMSR+uPEox%yFQqkJ$8~2;Pc`Lvo z$l}Q2DBxHiZ}iFT(TDTrZ!5ygdSI9G>bHSLvip5ck(Udb`b=KP-0f5DDl qd#V4=^i$`bPI;0$!y4lG10MEk;>BOFNX$MA67Y2Ob6Mw<&;$U8JDKtT literal 0 HcmV?d00001 diff --git a/textures/quickstack_settings.png b/textures/quickstack_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..feba0855d1e98c1baace65a42c0b41ba8e9ce68f GIT binary patch literal 2717 zcmV;O3S#w%P){Fb!g=X;5pld{K>&@lVE#Q;n9$ z6r>;;W!BId0WDE3DuES9$biZX5D1Vr_t77F(_HUx_wSthJHN;IvA#3+pWohR-*wjd zp0!_VuMGx+!C){L3av9DoK41AK#iC04pnVqgTQ2rKM44> zcik2K=Oe)Lz|A7^e#CY<0{;N|WvIFn7%n15BDUKJSPV=6I{Kea1Fr(Nh{(Uq17wG# z!1yM{$1D1?z*WJ81+eSh)n3x zj6^M=!q?4Y{L6tSGLWUx2#`JMGL-iR7OU#u4E5ds_D1-Bdwt!I@dtai-#<&)jQ|mF zI6|FEfQ1?Aya$|&(AG&`H-v@2z=UKs0wkowA*wnoP=4C~WkRr?styH)BrLlTAcISe zg6@P@@}|WY1WpT-Kj{BglCs-0F!04q1pWxLi%@+x@C6b1tE!d*R|3<4OTEj!Fyg@!FJuJ*>NN%G&ei!vk|Tbuyc}35A}0dR_W=F^j4pB=Z2%^T$iBe4v;(fi#U=K_ zZ6uu!l>6!96z}m$g8+VS{6*l37OI@aZNt6<%xS*G>y5t>_-IN#l-Gf4o0GtA9Y5^X zC;HLy=G0o?Y7wa~l`dd5FeXr50aOFG0IQlV>88;5cv)9^+0VSkFkrQR$7;emlViNj z((eI$h}1e@Y>dZt0e|ve((IHOzqu#)rI-KHz(p~hT@Q>Ck;YULz?0w=U|bQ%Uk~g7 z4*4<285i5e_rYC!pIi*#TS{k5vmpuWP z3=H$Gx~c#&AM!dYsae1iz!%Bie!?MOqgUj!BGM33-t%x_XWs@!f^83K2P8QUvgd90@#wi{Qxx4g${svqa=% zk`4R0`$FI|e!P$iyan7SBAZHXA*hKWM*&X(gA$f)FEC$3ews@KsOnv~jh9!X^PXZ|_RTo~nkaKL@O#dFYB$q>?@1AvUI=Am zF|(-!ZV-{zNEvdn8z>?hfYuzLdIOkQKz+<4!x@4WuqBPg&lv&yW>MTO;1KYGq(}QP ziF+IuiTr-dM=wh2;n7^h16$M%w1Gh!}uBz_B#Zk-?kprpn06rDlgSg0+0SU{n z8yGDjyIb?{HKY1BVrUUBY}`?nl?PDO`+%W3v|`R}$TI=j z=U9eQW`@$61{z9;07r8yLt8ULaT8!M?vO{W(8JUSQUce`T-{j&2zj}Q*Qmtpt zZo%@Cr^1=x>Q9HuyL1W1msC}S$Jh<^;o#?cAJ*Ixpa~HU1NZv%fhu4qF1&g(ut!81 zRP{#OW=h`}Ug-K<5x|fj0h*EFIA=NDEh5jT>YSKs2g6jg+^3H*l)yAFZdA=B#M^i= z6gdHw;Bp1TnF@Z>%uzZ7SdZHtjf0V@I?YT{0tE2q_G(+P9&nGUwl}k+oB%%c`jA#U zIvjVIgrV4H0WBDQC@!jY9MSUlHb)sSNmcI`k$FkTbbjaXJiM|ZdjB)Qs!ywG2QyWX5x^VeF_MoFY~CGA23}Fso6TIsH3nFO zOSO_~l=<1g&sFssz|U}DFC=Z~jGjN$P^LgJuN8HtI3xSQQx?EMiVkXS92k?0U zZ=-O59F@3T$f3S_FyxZ}BGRa;aVMv5}f$ZheP|} zGIdtq&cB^W*Sa6K9lSa;QdiZkNqB;Jcg{8|29W7!SXm*3Q`K8>OUOom0ui9l2Sdi1 ziPAX+NaE|S2Cg#`oPz{V)sDDC3Li2Pq;ndWEf(a<{ogb(oT%j3v2YIO(Vx3JSiWJ! z{9yT|pSmMhzVpRLg5~uY;sKVfu1yyKRJ8)QD#jzVxYd>mafeYl+IO4oF5nZm3zni9 zf3k>7#N{ELh`Xd|4e^6c4MoxgOe6Y<;B_KW1OE>+t?_@T>Qvm0qy>?t%mYNt$h{AL z4DDta8`Oj|I!C zCx(wS?x|T6EN|B?JRTlAs5+q2T1|xvM2w*S*7>oc0 zBY?pOV6b(7h{!f>zVN6u4`46?7>oc0BY?pOU@!t0i~t6M!C){L3