a-planet-alive/mods/gui/smart_inventory/libs/maininv.lua

161 lines
4.8 KiB
Lua

-- Enhanced main inventory methods
local maininvClass = {}
maininvClass_mt = {__index = maininvClass}
-- Clear the inventory
function maininvClass:remove_all()
for idx = 1, self.inventory:get_size("main") do
self.inventory:set_stack("main", idx, "")
end
end
-- Save inventory content to a slot (file)
function maininvClass:save_to_slot(slot)
local savedata = {}
for idx, stack in ipairs(self.inventory:get_list("main")) do
if not stack:is_empty() then
savedata[idx] = stack:to_string()
end
end
local player = minetest.get_player_by_name(self.playername)
player:set_attribute("inv_save_slot_"..tostring(slot), minetest.serialize(savedata))
end
-- Get restore the inventory content from a slot (file)
function maininvClass:restore_from_slot(slot)
local player = minetest.get_player_by_name(self.playername)
local savedata = minetest.deserialize(player:get_attribute("inv_save_slot_"..tostring(slot)))
if savedata then
for idx = 1, self.inventory:get_size("main") do
self.inventory:set_stack("main", idx, savedata[idx])
end
end
end
-- Add a item to inventory
function maininvClass:add_item(item)
return self.inventory:add_item("main", item)
end
function maininvClass:add_sepearate_stack(item)
for idx, stack in ipairs(self.inventory:get_list("main")) do
if stack:is_empty() then
self.inventory:set_stack("main", idx, item)
item = ""
break
end
end
return item
end
-- Get inventory content as consolidated table
function maininvClass:get_items()
local items_in_inventory = {}
for _, stack in ipairs(self.inventory:get_list("main")) do
local itemname = stack:get_name()
if itemname and itemname ~= "" then
if not items_in_inventory[itemname] then
items_in_inventory[itemname] = stack:get_count()
else
items_in_inventory[itemname] = items_in_inventory[itemname] + stack:get_count()
end
end
end
-- add items in crafting field to the available items in inventory
for _, stack in ipairs(self.inventory:get_list("craft")) do
local itemname = stack:get_name()
if itemname and itemname ~= "" then
if not items_in_inventory[itemname] then
items_in_inventory[itemname] = stack:get_count()
else
items_in_inventory[itemname] = items_in_inventory[itemname] + stack:get_count()
end
end
end
return items_in_inventory
end
-- try to get empty stacks by move items to other stacky up to max_size
function maininvClass:compress()
for idx1 = self.inventory:get_size("main"), 1, -1 do
local stack1 = self.inventory:get_stack("main", idx1)
if not stack1:is_empty() then
for idx2 = 1, idx1 do
local stack2 = self.inventory:get_stack("main", idx2)
if idx1 ~= idx2 and stack1:get_name() == stack2:get_name() then
stack1 = stack2:add_item(stack1)
self.inventory:set_stack("main", idx1, stack1)
self.inventory:set_stack("main", idx2, stack2)
if stack1:is_empty() then
break
end
end
end
end
end
end
-- move items to crafting grid to craft item
function maininvClass:craft_item(grid)
for idx_main, stack_main in ipairs(self.inventory:get_list("main")) do
for x, col in pairs(grid) do
for y, item in pairs(col) do
local idx_craft = (y-1)*3+x
local stack_craft = self.inventory:get_stack("craft", idx_craft )
if not stack_main:is_empty() and stack_main:get_name() == item then --right item
local left = stack_craft:add_item(stack_main:take_item(1))
stack_main:add_item(left)
self.inventory:set_stack("craft", idx_craft, stack_craft)
self.inventory:set_stack("main", idx_main, stack_main)
end
end
end
end
end
-- move all items from crafting inventory back to main inventory
function maininvClass:sweep_crafting_inventory()
for idx = 1, self.inventory:get_size("craft") do
local stack = self.inventory:get_stack("craft", idx)
if not stack:is_empty() then
local left = self.inventory:add_item("main", stack)
self.inventory:set_stack("craft", idx, left)
end
end
end
-- Swap row to the top. Asumption the inventory is 8x4, the row number should be 2, 3 or 4
function maininvClass:swap_row_to_top(row)
local width = 8
for idx1 = 1, width do
local idx2 = (row -1) * width + idx1
local stack1 = self.inventory:get_stack("main", idx1)
local stack2 = self.inventory:get_stack("main", idx2)
self.inventory:set_stack("main", idx2, stack1)
self.inventory:set_stack("main", idx1, stack2)
end
end
-- player inventory class
local maininv = {}
function maininv.get(playername)
local self = setmetatable({}, maininvClass_mt)
self.playername = playername
self.inventory = minetest.get_player_by_name(playername):get_inventory()
self.inventory:set_width("craft", 3)
self.inventory:set_size("craft", 9)
return self
end
-- Check if player has creative privilege.
function maininvClass:get_has_creative()
return minetest.is_creative_enabled(self.playername)
end
return maininv