From 03568560a748ccf96b96648eca8b8fe2f9147755 Mon Sep 17 00:00:00 2001 From: Kostinatyn Tsiupa Date: Wed, 4 Oct 2023 18:55:51 +0300 Subject: [PATCH] backpacks implementation. TODO hotkey to open equipped backpack, upgrades for backpack --- mods/AGE0/backpack/README.txt | 2 + mods/AGE0/backpack/init.lua | 202 ++++++++++++++++++ mods/AGE0/backpack/locale/backpack.ua.tr | 6 + mods/AGE0/backpack/mod.conf | 3 + .../backpack/textures/backpack_diamond.png | Bin 0 -> 1298 bytes mods/AGE0/backpack/textures/backpack_gold.png | Bin 0 -> 1310 bytes mods/AGE0/backpack/textures/backpack_iron.png | Bin 0 -> 1274 bytes .../backpack/textures/backpack_leather.png | Bin 0 -> 1312 bytes mods/AGE0/modpack.conf | 2 + mods/HUD/mcl_inventory/init.lua | 1 + mods/HUD/mcl_inventory/survival.lua | 9 + mods/PLAYER/mcl_gamemode/init.lua | 2 +- ...ta_inventory_empty_armor_slot_backpack.png | Bin 0 -> 204 bytes 13 files changed, 226 insertions(+), 1 deletion(-) create mode 100644 mods/AGE0/backpack/README.txt create mode 100644 mods/AGE0/backpack/init.lua create mode 100644 mods/AGE0/backpack/locale/backpack.ua.tr create mode 100644 mods/AGE0/backpack/mod.conf create mode 100644 mods/AGE0/backpack/textures/backpack_diamond.png create mode 100644 mods/AGE0/backpack/textures/backpack_gold.png create mode 100644 mods/AGE0/backpack/textures/backpack_iron.png create mode 100644 mods/AGE0/backpack/textures/backpack_leather.png create mode 100644 mods/AGE0/modpack.conf create mode 100644 textures/ta_inventory_empty_armor_slot_backpack.png diff --git a/mods/AGE0/backpack/README.txt b/mods/AGE0/backpack/README.txt new file mode 100644 index 000000000..59e63faca --- /dev/null +++ b/mods/AGE0/backpack/README.txt @@ -0,0 +1,2 @@ +Copy of Iron Backpacks https://github.com/gr8pefish/IronBackpacks +Art is used from there under GNU General Public License v3.0 \ No newline at end of file diff --git a/mods/AGE0/backpack/init.lua b/mods/AGE0/backpack/init.lua new file mode 100644 index 000000000..7a3b95a24 --- /dev/null +++ b/mods/AGE0/backpack/init.lua @@ -0,0 +1,202 @@ +local S = minetest.get_translator("backpack") + +local function getBackpackSize(stack) + if not stack:get_definition().groups.backpack_size then + return 0 + end + + return stack:get_definition().groups.backpack_size +end + +local function openBackpack(player, player_name, backapack_stack, context--[[opened equipped or inhand]]) + --minetest.chat_send_all("Enter") + local inv_name = player_name .. "_backpack_tmp" + --Chaeck if something is broken. To prevent item voiding + local inv = minetest.get_inventory({type="detached", name=inv_name}) + if inv ~= nil then + return false, "Backpack is already open!" + end + + minetest.create_detached_inventory(player_name .. "_backpack_tmp", { + --Forbids puting backpacks into backpacks + allow_put = function(inv, listname, index, stack, player) + if minetest.get_item_group(stack:get_name(), "backpack_size") > 0 then + return 0 + else + return stack:get_stack_max() + end + end, + }, player_name) + inv = minetest.get_inventory({type = "detached", name=inv_name}) + inv:set_size("main", getBackpackSize(backapack_stack) * 9) + + local meta = backapack_stack:get_meta() + --minetest.chat_send_all(dump(meta:to_table())) + local content = meta:get_string("backpack:content") + local list = content and minetest.deserialize(content) or {} + + for i,stack in ipairs(list) do + inv:set_stack("main", i, stack) + --[[if stack ~= nil then + minetest.chat_send_all(dump(stack:to_string())) + end]] + end + + local form = "size[9," .. (getBackpackSize(backapack_stack) + 6) .. "]" + .. mcl_formspec.get_itemslot_bg(0, 0, 9, getBackpackSize(backapack_stack)) + .. "list[detached:".. inv_name .. ";main;0,0;9," .. getBackpackSize(backapack_stack) .. ";]" + .. mcl_formspec.get_itemslot_bg(0, getBackpackSize(backapack_stack) + 1.5, 9, 3) + .. "list[current_player;main;0," .. (getBackpackSize(backapack_stack) + 1.5) .. ";9,3;9]" + .. mcl_formspec.get_itemslot_bg(0, getBackpackSize(backapack_stack) + 5, 9, 1) + .. "list[current_player;main;0," .. (getBackpackSize(backapack_stack) + 5) .. ";9,1;]" + .. "listring[current_player;main]" + .. "listring[detached:".. inv_name .. ";main]" + .. "listring[current_player;main]" + minetest.show_formspec(player_name, "backpack:" .. context, form) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "backpack:equipped" and fields.quit then + --minetest.chat_send_all("Exit") + local player_inv = player:get_inventory() + local backapack_stack = player_inv:get_stack("backpack", 1) + + local inv_name = player:get_player_name() .. "_backpack_tmp" + local inv = minetest.get_inventory({type="detached", name=inv_name}) + local stacks = {} + for i = 0, inv:get_size("main"), 1 do + stacks[i] = inv:get_stack("main", i):to_string() + end + + backapack_stack:get_meta():set_string("backpack:content", minetest.serialize(stacks)) + player_inv:set_stack("backpack", 1, backapack_stack) + --minetest.chat_send_all(dump(meta:to_table())) + minetest.remove_detached_inventory(inv_name) + elseif formname == "backpack:inhand" and fields.quit then + local backapack_stack = player:get_wielded_item() + + local inv_name = player:get_player_name() .. "_backpack_tmp" + local inv = minetest.get_inventory({type="detached", name=inv_name}) + local stacks = {} + for i = 0, inv:get_size("main"), 1 do + stacks[i] = inv:get_stack("main", i):to_string() + end + + backapack_stack:get_meta():set_string("backpack:content", minetest.serialize(stacks)) + player:set_wielded_item(backapack_stack) + minetest.remove_detached_inventory(inv_name) + else + return + end + +end) + +--A chat command for now. Wonna change to hot-key later. +minetest.register_chatcommand("bag", { + func = function(player_name) + local player = minetest.get_player_by_name(player_name) + local player_inv = player:get_inventory() + local backapack_stack = player_inv:get_stack("backpack", 1) + if backapack_stack:is_empty() then + return false, "No backpack equiped!" + end + + openBackpack(player, player_name, backapack_stack, "equipped") + return true, "" + end, +}) + +local function on_backpack_place(itemstack, user, pointed_thing) + openBackpack(user, user:get_player_name(), itemstack, "inhand") + return nil +end + +minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + if action == "move" and inventory_info.to_list == "backpack" then + local itemstack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + if not (minetest.get_item_group(itemstack:get_name(), "backpack_size") > 0) then + return 0 + else + return itemstack:get_stack_max() + end + end +end) + +-- register backapack's +minetest.register_tool("backpack:leather", { + description = S("Leather backpack"), + inventory_image = "backpack_leather.png", + groups = {backpack_size = 1}, + on_place = on_backpack_place, + on_secondary_use = on_backpack_place, +}) + +minetest.register_craftitem("backpack:iron", { + description = S("Iron backpack"), + inventory_image = "backpack_iron.png", + groups = {backpack_size = 2}, + on_place = on_backpack_place, + on_secondary_use = on_backpack_place, +}) + +minetest.register_craftitem("backpack:gold", { + description = S("Gold backpack"), + inventory_image = "backpack_gold.png", + groups = {backpack_size = 3}, + on_place = on_backpack_place, + on_secondary_use = on_backpack_place, +}) + +minetest.register_craftitem("backpack:diamond", { + description = S("Diamond backpack"), + inventory_image = "backpack_diamond.png", + groups = {backpack_size = 4}, + on_place = on_backpack_place, + on_secondary_use = on_backpack_place, +}) + +-- register bag crafts +minetest.register_craft({ + output = "backpack:leather", + recipe = { + {"mcl_mobitems:leather", "mcl_mobitems:leather", "mcl_mobitems:leather"}, + {"mcl_mobitems:leather", "mcl_chests:chest", "mcl_mobitems:leather"}, + {"mcl_mobitems:leather", "mcl_mobitems:leather", "mcl_mobitems:leather"} + } +}) + +minetest.register_craft({ + output = "backpack:iron", + recipe = { + {"mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot"}, + {"mcl_core:iron_ingot", "backpack:leather", "mcl_core:iron_ingot"}, + {"mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot"} + } +}) + +minetest.register_craft({ + output = "backpack:gold", + recipe = { + {"mcl_core:gold_ingot", "mcl_core:gold_ingot", "mcl_core:gold_ingot"}, + {"mcl_core:gold_ingot", "backpack:iron", "mcl_core:gold_ingot"}, + {"mcl_core:gold_ingot", "mcl_core:gold_ingot", "mcl_core:gold_ingot"} + } +}) + +minetest.register_craft({ + output = "backpack:diamond", + recipe = { + {"mcl_core:diamond", "mcl_core:diamond", "mcl_core:diamond"}, + {"mcl_core:diamond", "backpack:gold", "mcl_core:diamond"}, + {"mcl_core:diamond", "mcl_core:diamond", "mcl_core:diamond"} + } +}) + +--transfer content of backpack on craft +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if minetest.get_item_group(itemstack:get_name(), "backpack_size") > 0 then + content = old_craft_grid[5]:get_meta():get_string("backpack:content") + itemstack:get_meta():set_string("backpack:content", content) + return itemstack + end +end) \ No newline at end of file diff --git a/mods/AGE0/backpack/locale/backpack.ua.tr b/mods/AGE0/backpack/locale/backpack.ua.tr new file mode 100644 index 000000000..887fa32f1 --- /dev/null +++ b/mods/AGE0/backpack/locale/backpack.ua.tr @@ -0,0 +1,6 @@ +# textdomain: backpack + +Leather backpack=Шкіряний наплічник +Iron backpack=Залізний наплічник +Gold backpack=Золотий наплічник +Diamond backpack=Діамантовий наплічник \ No newline at end of file diff --git a/mods/AGE0/backpack/mod.conf b/mods/AGE0/backpack/mod.conf new file mode 100644 index 000000000..a74f3d819 --- /dev/null +++ b/mods/AGE0/backpack/mod.conf @@ -0,0 +1,3 @@ +name = backpack +author = Morik666 +description = Mode to add backpacks diff --git a/mods/AGE0/backpack/textures/backpack_diamond.png b/mods/AGE0/backpack/textures/backpack_diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..e0acbb61937cf178ca22c0f32db739dc8fbc11e6 GIT binary patch literal 1298 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m^Cs(B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk*hs;Rw<*Tq`*pFzr4I$ zuiRKKzbGB3*V0noz)0W7NEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPCaRL@jFBRn%N zCBM8_6RgYE*UB@mxFj(zIn~p}Rtad1US?*Bm5Ym+g@K8Yo1>A7qoJXznT4yHqot{V ztC5+pv892zAxy7JesXDUYF-IUZwg$mu>nrKpahXy0JPa9wJ5VJHN~wcKUV?lajQ(+ zZgIhB9#n4%PPZ7j;?%1Tbc{YIdXb_VCIn1FASOKV0y*&HpPC0u^F_eK%~2uvje&u& z!PCVtq~g|^$@{$zJBS?LKfR~l0lLrqJ z{P>!>I{KD!EG-jk_c|z_Ir-V8dv}d@UYc=)r^(jB>+Ls&N z&=4#6SR$+Q`@3M%nVV~QJv1Ne>T5HJiDH?3ra7jM;Y&XAlO3~8x~$jQplid=y@`3o z!C5jaw_+PUA1p1iT_S$*K2O5c_l+$rkM1$>tcem^p}!zc&S6OslRe)Qr~UtU!e+4j zNmyn6V7{~Uf@|t8zKVTXC!}l9ZMk3@^TTp6+p7*!wLbh?crc-3wflspEqA4Jmu09M zZP~5TcfOPSC-r=|S{VQRUeIy(#=R5qkGC^0Gq6TJuiD4gxe-)K NdAjc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk*hs;Rw<*Tq`*pFzr4I$ zuiRKKzbGB3*V0noz)0W7NEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPCaRL@jFBRn%N zCBM8_6RgYE*UB@mxFj(zIn~p}Rtad1US?*Bm8*%Hv#W`#fuoU&qoJXznUkxlp`)vb zxrLK~i<7ab8BDKBesXDUYF-IUZwf-MAx^!Z1d&?+wAm%KD6=dz#jPkmR{`vCt4y43 zadE|I9#n4%PPe$Y;nb@Sbc{YIdXb_VCIn1FASOKV0y*&HpPC0u^F_eK&2hmpn1O+@ z$J50zq~g|+U|a9Q0V1~gzS$GBrbKm3p1gYTgiH1hA1&%``X^YP?(WDUc*NDUP+*CM z2n#Fw!qyeduG)Vq)N&_HfA(|Iq**2hm+~{czgvBN=kvOjf^&u^CmKAQ*nIlwxtJSr z6HN=+#yl6mgX$l6~RC0 zz@5^=cy=@s9BKc7vR^rmnAS8MmY=h4%TZ>H`|*2%rcEV-a+-J`WL z31r|~#*RhcZk(2#TfWb{oCvnG z8`JWOTWW4iPmnfy5_wtQ-F)d2*H0Wa2I50}RkFyS2*>bwMcXF*bccCWZ;jchW^EoaeTX;Fu#mzF_%HG$PHz?6-aK0ZI>Udp3 zRrO&im$-|S8y9=Hq|9B77k?OZFHU;udbvC-o9ozi1G83z15Y0)?i7qaWAXC+AMFDS Y!9Ca6A3o5W2P&~VUHx3vIVCg!09Vz{W&i*H literal 0 HcmV?d00001 diff --git a/mods/AGE0/backpack/textures/backpack_iron.png b/mods/AGE0/backpack/textures/backpack_iron.png new file mode 100644 index 0000000000000000000000000000000000000000..73519fde86066da266ae4cdf2c7903b802e5e9e3 GIT binary patch literal 1274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m^Cs(B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk*hs;Rw<*Tq`*pFzr4I$ zuiRKKzbGB3*V0noz)0W7NEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPCaRL@jFBRn%N zCBM8_6RgYE*UB@mxFj(zIn~p}Rtad1US?*Bm5Tu|sNEc09F1HY4Gmq*ES*hVT`WvY z&CCs*oq&9pUYGpj(%jU%5}4i;gkD#idO-;yw*Y9fOKMSOS!#+~QGTuh*yC22xZUD} z(>$o&6x?oc#;I2y=oo!a^ddz!ObD2UKumbz1#;lYKQ#}S=8J%ddzE*oF#`i*hNp{T zNX4xsLDs7d1qj%N$EjxstoPGAj_l&+3TN4!VU znc`=XXMGQ8&tn#UR(EcW@$izfK7cX3J^Utvgn`sBOM)jUmmhU^BypJ{MZHX2CH4euI z#vKQCty>(m*6tjWz=hJ-7(MZy(l1x9Xn6lSLTAqXd2-HWR&xvX#s%t4-zj^F+jogK z)BQa2bB7I{96#dW+L2&3ThV&wq^7rJ+^&HZ@$0Ya%v@46?|Av;mnOM8CWy%JvG=$s z>rD5y=sUcIWyuU5H4mR^ruf4uLY{4j3EOWUJ>s`8Q)=_&I=lJH53b*kYi)k&QD)qn jNzokVG=Jp(;V@v>eD>=P|7~~YfJ!4zS3j3^P6c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk*hs;Rw<*Tq`*pFzr4I$ zuiRKKzbGB3*V0noz)0W7NEfI=x41H|B(Xv_uUHvof=g;~a#3bMNoIbY0?5R~r2Ntn zTP2`NAzsKWfE$}v3=Jk=fazBx7U&!58GyV5Q|Rl9UukYGTy=3tP%6T`SPd=?sVqp< z4@xc0FD*(2MqHXQ$f^P>=c3falKi5O{QMkPCaRL@jFBRn%N zCBM8_6RgYE*UB@mxFj(zIn~p}Rtad1US?*Bm65BXtE;7}tD}*NlcAxjnUlGZiL0BX zvx$?rfs>P~BTTPLesXDUYF-IUZwf-M8&18T1d&?+wAm%KD6=dz#jPkmR{`vCt4!Q( zamHyLRBsAyx47Wcs}FRHJ}7#Tq8lazOhX_hJn;fK@Z_JG2Tb!tz{D-eZeKjD5fb@IZ_ z?U$CGxT%vKWyX_rcoAp7@q-r@eXKt4{LH~AK|8iFX9Y7p5jDNc] []"), description = S("Change gamemode (survival/creative) for yourself or player"), - privs = { server = true }, + --privs = { server = true }, func = function(n, param) -- Full input validation ( just for @erlehmann <3 ) local p = minetest.get_player_by_name(n) diff --git a/textures/ta_inventory_empty_armor_slot_backpack.png b/textures/ta_inventory_empty_armor_slot_backpack.png new file mode 100644 index 0000000000000000000000000000000000000000..e043e5260b670108d40c3af5096804bf18f97b00 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}E0G|+7APodd(|4W+QcNX5e!>44o^Chr0`fQuJR*x382Ao@Fyrz36)8YL zM^6{W5RKs0zGyxM2Nvd?|Cg5EPLl7;STTz~@!v{DH_fd5dxFm7WU7ZS-l>$h#@6C? n;C_IoMdGhre3uoM6+0Bg=RRRLy-6(;