98 lines
2.3 KiB
Lua
98 lines
2.3 KiB
Lua
local set_fs = i3.files.api()
|
|
local S, fmt, msg, spawn_item = i3.get("S", "fmt", "msg", "spawn_item")
|
|
|
|
local function init_backpack(player)
|
|
local name = player:get_player_name()
|
|
local data = i3.data[name]
|
|
local inv = player:get_inventory()
|
|
|
|
inv:set_size("main", data.bag_size and i3.BAG_SIZES[data.bag_size] or i3.INV_SIZE)
|
|
|
|
data.bag = core.create_detached_inventory(fmt("%s_backpack", name), {
|
|
allow_put = function(_inv, listname, _, stack)
|
|
local empty = _inv:get_stack(listname, 1):is_empty()
|
|
local item_group = minetest.get_item_group(stack:get_name(), "bag")
|
|
|
|
if empty and item_group > 0 and item_group <= #i3.BAG_SIZES then
|
|
return 1
|
|
end
|
|
|
|
msg(name, S"This is not a backpack")
|
|
|
|
return 0
|
|
end,
|
|
|
|
on_put = function(_, _, _, stack)
|
|
local stackname = stack:get_name()
|
|
data.bag_item = stackname
|
|
data.bag_size = minetest.get_item_group(stackname, "bag")
|
|
|
|
inv:set_size("main", i3.BAG_SIZES[data.bag_size])
|
|
set_fs(player)
|
|
end,
|
|
|
|
on_take = function()
|
|
for i = i3.INV_SIZE + 1, i3.BAG_SIZES[data.bag_size] do
|
|
local stack = inv:get_stack("main", i)
|
|
|
|
if not stack:is_empty() then
|
|
spawn_item(player, stack)
|
|
end
|
|
end
|
|
|
|
data.bag_item = nil
|
|
data.bag_size = nil
|
|
|
|
inv:set_size("main", i3.INV_SIZE)
|
|
set_fs(player)
|
|
end,
|
|
})
|
|
|
|
data.bag:set_size("main", 1)
|
|
|
|
if data.bag_item then
|
|
data.bag:set_stack("main", 1, data.bag_item)
|
|
end
|
|
end
|
|
|
|
local bag_recipes = {
|
|
small = {
|
|
rcp = {
|
|
{"", "farming:string", ""},
|
|
{"group:wool", "group:wool", "group:wool"},
|
|
{"group:wool", "group:wool", "group:wool"},
|
|
},
|
|
size = 1,
|
|
},
|
|
medium = {
|
|
rcp = {
|
|
{"farming:string", "i3:bag_small", "farming:string"},
|
|
{"farming:string", "i3:bag_small", "farming:string"},
|
|
},
|
|
size = 2,
|
|
},
|
|
large = {
|
|
rcp = {
|
|
{"farming:string", "i3:bag_medium", "farming:string"},
|
|
{"farming:string", "i3:bag_medium", "farming:string"},
|
|
},
|
|
size = 3,
|
|
},
|
|
}
|
|
|
|
for size, item in pairs(bag_recipes) do
|
|
local bagname = fmt("i3:bag_%s", size)
|
|
|
|
core.register_craftitem(bagname, {
|
|
description = fmt("%s Backpack", size:gsub("^%l", string.upper)),
|
|
inventory_image = fmt("i3_bag_%s.png", size),
|
|
stack_max = 1,
|
|
groups = {bag = item.size}
|
|
})
|
|
|
|
core.register_craft {output = bagname, recipe = item.rcp}
|
|
core.register_craft {type = "fuel", recipe = bagname, burntime = 3}
|
|
end
|
|
|
|
return init_backpack
|