From de8bdbecb81ed8a7c454728de65587f950526b82 Mon Sep 17 00:00:00 2001 From: Alexsandro Percy Date: Mon, 21 Mar 2022 17:11:58 -0300 Subject: [PATCH] added the inventory manager and fuel dict --- init.lua | 4 + inventory_management.lua | 176 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 inventory_management.lua diff --git a/init.lua b/init.lua index ffafee8..a454d4c 100644 --- a/init.lua +++ b/init.lua @@ -20,9 +20,13 @@ airutils.colors ={ yellow='#ffe400', } +airutils.fuel = {['biofuel:biofuel'] = 1,['biofuel:bottle_fuel'] = 1, + ['biofuel:phial_fuel'] = 0.25, ['biofuel:fuel_can'] = 10} + dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_papi.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_tug.lua") dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "airutils_repair.lua") +dofile(minetest.get_modpath("airutils") .. DIR_DELIM .. "inventory_management.lua") function airutils.remove(pos) local meta = core.get_meta(pos) diff --git a/inventory_management.lua b/inventory_management.lua new file mode 100644 index 0000000..e03bd8c --- /dev/null +++ b/inventory_management.lua @@ -0,0 +1,176 @@ +local storage = minetest.get_mod_storage() +airutils.modname = minetest.get_current_modname() + +local function get_formspec_by_size(self, size) + local background = default.gui_bg .. default.gui_bg_img .. default.gui_slots + local default_inventory_formspecs = { + ["4"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;2,0;4,1;]" .. + "list[current_player;main;0,2;8,4;]" .. + "listring[]", + + ["6"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;1,0;6,1;]".. + "list[current_player;main;0,2;8,4;]" .. + "listring[]", + + ["8"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,1;]".. + "list[current_player;main;0,2;8,4;]" .. + "listring[]", + + ["12"]="size[8,7]".. background .. + "list[detached:" .. self._inv_id .. ";main;1,0;6,2;]".. + "list[current_player;main;0,3;8,4;]" .. + "listring[]", + + ["16"]="size[8,7]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,2;]".. + "list[current_player;main;0,3;8,4;]" .. + "listring[]", + + ["24"]="size[8,8]".. background .. + "list[context:" .. self._inv_id .. ";main;0,0;8,3;]".. + "list[current_player;main;0,4;8,4;]" .. + "listring[]", + + ["32"]="size[8,9]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + "listring[context;main]" .. + "listring[current_player;main]" .. + default.get_hotbar_bg(0,4.85), + + ["50"]="size[10,10]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0;10,5;]".. + "list[current_player;main;1,6;8,4;]" .. + "listring[]", + } + + local formspec = default_inventory_formspecs[tostring(size)] + return formspec +end + +local function inventory_id(maker_name) + local id= airutils.modname .. "_" .. maker_name .. "_" + for i=0,5 do + id=id..(math.random(0,9)) + end + return id +end + +function airutils.load_inventory(self) + if self._inv then + local inv_content = minetest.deserialize(storage:get_string(self._inv_id)) + if inv_content then + self._inv:set_list("main", inv_content) + end + end +end + +function airutils.save_inventory(self) + if self._inv then + local inv_content = self._inv:get_list("main") + if inv_content then + for k, v in pairs(inv_content) do + inv_content[k] = v:to_string() + end + + local inv_content = minetest.serialize(inv_content) + storage:set_string(self._inv_id, inv_content) + end + end +end + +function airutils.remove_inventory(self) + local inventory = airutils.get_inventory(self) + if inventory:is_empty("main") then + return minetest.remove_detached_inventory(self._inv_id) + else + local inv_content = inventory:get_list("main") + if inv_content then + local pos = self.object:get_pos() + for k, v in pairs(inv_content) do + for i = 0,v:get_count()-1,1 + do + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},v:get_name()) + end + end + end + return minetest.remove_detached_inventory(self._inv_id) + end + return false +end + +function airutils.destroy_inventory(self) + airutils.remove_inventory(self) + storage:set_string(self._inv_id, nil) +end + +--show inventory form to user +function airutils.show_vehicle_trunk_formspec(self, player, size) + local form = get_formspec_by_size(self, size) + minetest.show_formspec(player:get_player_name(), airutils.modname .. ":inventory", + form + ) +end + +function airutils.create_inventory(self, size, owner) + owner = owner or "" + if owner == "" then owner = self.owner end + --minetest.chat_send_all("slots: " .. size) + if owner ~= nil and owner ~= "" then + if self._inv_id == "" then + self._inv_id = inventory_id(owner) + end + local vehicle_inv = minetest.create_detached_inventory(self._inv_id, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return count -- allow moving + end, + + allow_put = function(inv, listname, index, stack, player) + return stack:get_count() -- allow putting + end, + + allow_take = function(inv, listname, index, stack, player) + return stack:get_count() -- allow taking + end, + on_put = function(inv, toList, toIndex, stack, player) + airutils.save_inventory(self) + end, + on_take = function(inv, toList, toIndex, stack, player) + airutils.save_inventory(self) + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + airutils.save_inventory(self) + end, + }) + if size >= 8 then + if vehicle_inv:set_size("main", size) then + vehicle_inv:set_width("main", 8) + end + else + vehicle_inv:set_size("main", size) + end + self._inv = vehicle_inv + airutils.load_inventory(self) + end +end + +function airutils.get_inventory(self) + if self._inv then + return minetest.get_inventory({type="detached", name=self._inv_id}) + end + return nil +end + +function airutils.list_inventory(self) + local inventory = airutils.get_inventory(self) + if inventory then + local list = inventory.get_list("main") + + minetest.chat_send_all(dump(list)) + end +end +