mirror of
https://github.com/minetest-mods/i3.git
synced 2024-11-15 23:30:22 +01:00
174 lines
3.8 KiB
Lua
174 lines
3.8 KiB
Lua
local set_fs = i3.set_fs
|
|
|
|
IMPORT("get_bag_description", "ItemStack")
|
|
IMPORT("S", "ES", "fmt", "msg", "slz", "dslz")
|
|
IMPORT("get_group", "play_sound", "get_detached_inv", "create_inventory")
|
|
|
|
local function get_content(content)
|
|
local t = {}
|
|
|
|
for i, v in pairs(content) do
|
|
t[i] = ItemStack(v)
|
|
end
|
|
|
|
return t
|
|
end
|
|
|
|
local function init_bags(player)
|
|
local name = player:get_player_name()
|
|
local data = i3.data[name]
|
|
|
|
local bag = create_inventory(fmt("i3_bag_%s", name), {
|
|
allow_put = function(inv, _, _, stack)
|
|
local empty = inv:is_empty"main"
|
|
local item_group = get_group(stack:get_name(), "bag")
|
|
|
|
if empty and item_group > 0 and item_group <= 4 then
|
|
return 1
|
|
end
|
|
|
|
if not empty then
|
|
msg(name, S"There is already a bag")
|
|
else
|
|
msg(name, S"This is not a bag")
|
|
end
|
|
|
|
return 0, play_sound(name, "i3_cannot", 0.8)
|
|
end,
|
|
|
|
on_put = function(_, _, _, stack)
|
|
data.bag = stack:to_string()
|
|
|
|
local meta = stack:get_meta()
|
|
local content = dslz(meta:get_string"content")
|
|
|
|
if content then
|
|
local inv = get_detached_inv("bag_content", name)
|
|
inv:set_list("main", get_content(content))
|
|
end
|
|
|
|
set_fs(player)
|
|
end,
|
|
|
|
on_take = function()
|
|
data.bag = nil
|
|
data.bag_rename = nil
|
|
|
|
local content = get_detached_inv("bag_content", name)
|
|
content:set_list("main", {})
|
|
|
|
set_fs(player)
|
|
end,
|
|
}, name)
|
|
|
|
bag:set_size("main", 1)
|
|
|
|
if data.bag then
|
|
bag:set_list("main", get_content{data.bag})
|
|
end
|
|
|
|
local function save_content(inv)
|
|
local bagstack = bag:get_stack("main", 1)
|
|
local meta = bagstack:get_meta()
|
|
local desc = get_bag_description(data, bagstack)
|
|
|
|
if inv:is_empty"main" then
|
|
meta:set_string("description", desc)
|
|
meta:set_string("content", "")
|
|
else
|
|
local list = inv:get_list"main"
|
|
local t, c = {}, 0
|
|
|
|
for i = 1, #list do
|
|
local stack = list[i]
|
|
|
|
if not stack:is_empty() then
|
|
c++
|
|
t[i] = stack:to_string()
|
|
end
|
|
end
|
|
|
|
local bag_size = get_group(bagstack:get_name(), "bag")
|
|
local percent = fmt("%d", (c * 100) / (bag_size * 4))
|
|
|
|
meta:set_string("description", ES("@1 (@2% full)", desc, percent))
|
|
meta:set_string("content", slz(t))
|
|
end
|
|
|
|
bag:set_stack("main", 1, bagstack)
|
|
data.bag = bagstack:to_string()
|
|
|
|
set_fs(player)
|
|
end
|
|
|
|
local bag_content = create_inventory(fmt("i3_bag_content_%s", name), {
|
|
on_move = save_content,
|
|
on_put = save_content,
|
|
on_take = save_content,
|
|
|
|
allow_put = function(_, _, _, stack)
|
|
local meta = stack:get_meta()
|
|
local content = dslz(meta:get_string"content")
|
|
|
|
if content then
|
|
msg(name, "You cannot put a bag in another bag")
|
|
return 0, play_sound(name, "i3_cannot", 0.8)
|
|
end
|
|
|
|
return stack:get_count()
|
|
end,
|
|
}, name)
|
|
|
|
bag_content:set_size("main", 4*4)
|
|
|
|
if data.bag then
|
|
local meta = bag:get_stack("main", 1):get_meta()
|
|
local content = dslz(meta:get_string"content")
|
|
|
|
if content then
|
|
bag_content:set_list("main", get_content(content))
|
|
end
|
|
end
|
|
end
|
|
|
|
local bag_recipes = {
|
|
small = {
|
|
rcp = {
|
|
{"", "farming:string", ""},
|
|
{"group:wool", "group:wool", "group:wool"},
|
|
{"group:wool", "group:wool", "group:wool"},
|
|
},
|
|
size = 2,
|
|
},
|
|
medium = {
|
|
rcp = {
|
|
{"farming:string", "i3:bag_small", "farming:string"},
|
|
{"farming:string", "i3:bag_small", "farming:string"},
|
|
},
|
|
size = 3,
|
|
},
|
|
large = {
|
|
rcp = {
|
|
{"farming:string", "i3:bag_medium", "farming:string"},
|
|
{"farming:string", "i3:bag_medium", "farming:string"},
|
|
},
|
|
size = 4,
|
|
},
|
|
}
|
|
|
|
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),
|
|
groups = {bag = item.size},
|
|
stack_max = 1,
|
|
})
|
|
|
|
core.register_craft{output = bagname, recipe = item.rcp}
|
|
core.register_craft{type = "fuel", recipe = bagname, burntime = 3}
|
|
end
|
|
|
|
return init_bags
|