Merge pull request 'basic backpacks implementation.' (#1) from backpack into main
Reviewed-on: #1
This commit is contained in:
commit
bb45067a81
|
@ -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
|
|
@ -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)
|
|
@ -0,0 +1,6 @@
|
|||
# textdomain: backpack
|
||||
|
||||
Leather backpack=Шкіряний наплічник
|
||||
Iron backpack=Залізний наплічник
|
||||
Gold backpack=Золотий наплічник
|
||||
Diamond backpack=Діамантовий наплічник
|
|
@ -0,0 +1,3 @@
|
|||
name = backpack
|
||||
author = Morik666
|
||||
description = Mode to add backpacks
|
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1,2 @@
|
|||
name = AGE0
|
||||
description = Mode-pack for age 0
|
|
@ -100,6 +100,7 @@ minetest.register_on_joinplayer(function(player)
|
|||
inv:set_width("main", 9)
|
||||
inv:set_size("main", 36)
|
||||
inv:set_size("offhand", 1)
|
||||
inv:set_size("backpack", 1)
|
||||
|
||||
--set hotbar size
|
||||
player:hud_set_hotbar_itemcount(9)
|
||||
|
|
|
@ -101,6 +101,10 @@ local main_page_static = table.concat({
|
|||
--Player model background
|
||||
"image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]",
|
||||
|
||||
--Backpack
|
||||
mcl_formspec.get_itemslot_bg_v4(5.375, 2.875, 1, 1),
|
||||
"list[current_player;backpack;5.375,2.875;1,1]",
|
||||
|
||||
--Offhand
|
||||
mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1),
|
||||
"list[current_player;offhand;5.375,4.125;1,1]",
|
||||
|
@ -158,9 +162,14 @@ mcl_inventory.register_survival_inventory_tab({
|
|||
end
|
||||
end
|
||||
|
||||
if inv:get_stack("backpack", 1):is_empty() then
|
||||
armor_slot_imgs = armor_slot_imgs .. "image[5.375,2.875;1,1;ta_inventory_empty_armor_slot_backpack.png]"
|
||||
end
|
||||
|
||||
if inv:get_stack("offhand", 1):is_empty() then
|
||||
armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]"
|
||||
end
|
||||
|
||||
return main_page_static .. armor_slot_imgs .. mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, "")
|
||||
end,
|
||||
handle = function() end,
|
||||
|
|
|
@ -60,7 +60,7 @@ end
|
|||
minetest.register_chatcommand("gamemode", {
|
||||
params = S("[<gamemode>] [<player>]"),
|
||||
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)
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 204 B |
Loading…
Reference in New Issue