From 13bca402752a9f0e7d119404f2ac35b7a71c20c8 Mon Sep 17 00:00:00 2001 From: Juraj Vajda Date: Wed, 26 Oct 2022 09:45:59 -0400 Subject: [PATCH] add unified_inventory and i3 support --- .luacheckrc | 4 +- api.lua | 378 ++++++++++++++++++++++++++++++++++++++++++++++++---- init.lua | 22 ++- items.lua | 6 + mod.conf | 2 +- 5 files changed, 382 insertions(+), 30 deletions(-) diff --git a/.luacheckrc b/.luacheckrc index 7612294..c929771 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -60,5 +60,7 @@ read_globals = { "hb", "mesecon", "armor", - "default" + "default", + "i3", + "unified_inventory" } diff --git a/api.lua b/api.lua index 63868ba..1649ea6 100644 --- a/api.lua +++ b/api.lua @@ -1932,15 +1932,15 @@ function XBowsQuiver.sfinv_register_page(self) get = function(this, player, context) local formspec = { ---arrow - 'label[0,0;Arrows you are wearing:]', + 'label[0,0;Arrows you are holding:]', 'list[current_player;x_bows:arrow_inv;0,0.5;1,1;]', 'image[0,0.5;1,1;x_bows_arrow_slot.png;]', 'listring[current_player;x_bows:arrow_inv]', 'listring[current_player;main]', ---quiver - 'label[0,1.5;Quiver you are wearing:]', - 'list[current_player;x_bows:quiver_inv;0,2;1,1;]', - 'image[0,2;1,1;x_bows_quiver_slot.png]', + 'label[2.5,0;Quiver you are wearing:]', + 'list[current_player;x_bows:quiver_inv;2.5,0.5;1,1;]', + 'image[2.5,0.5;1,1;x_bows_quiver_slot.png]', 'listring[current_player;x_bows:quiver_inv]', 'listring[current_player;main]', } @@ -1957,7 +1957,7 @@ function XBowsQuiver.sfinv_register_page(self) local x_bows_registered_arrow_def = self.registered_arrows[context._itemstack_arrow:get_name()] if x_bows_registered_arrow_def then - formspec[#formspec + 1] = 'label[2.5,0;' .. minetest.formspec_escape(context._itemstack_arrow:get_short_description()) .. '\n'.. minetest.formspec_escape(x_bows_registered_arrow_def.custom.description_abilities) ..']' + formspec[#formspec + 1] = 'label[0,1.5;' .. minetest.formspec_escape(context._itemstack_arrow:get_short_description()) .. '\n'.. minetest.formspec_escape(x_bows_registered_arrow_def.custom.description_abilities) ..']' end end @@ -1968,28 +1968,12 @@ function XBowsQuiver.sfinv_register_page(self) ---description formspec[#formspec + 1] = 'label[2.5,1.5;' .. minetest.formspec_escape(context._itemstack_quiver:get_short_description()) .. ']' - formspec[#formspec + 1] = 'list[detached:'..quiver_id..';main;0,3.2;3,1;]' + formspec[#formspec + 1] = 'list[detached:'..quiver_id..';main;3.5,0.5;3,1;]' formspec[#formspec + 1] = 'listring[detached:'..quiver_id..';main]' formspec[#formspec + 1] = 'listring[current_player;main]' end return sfinv.make_formspec(player, context, table.concat(formspec, ''), true) - end, - on_enter = function(this, player, context) - if not context._itemstack_quiver then - context._itemstack_quiver = player:get_inventory():get_stack('x_bows:quiver_inv', 1) - end - - if context._itemstack_quiver and not context._itemstack_quiver:is_empty() then - local st_meta = context._itemstack_quiver:get_meta() - local quiver_id = st_meta:get_string('quiver_id') - - self:get_or_create_detached_inv( - quiver_id, - player:get_player_name(), - st_meta:get_string('quiver_items') - ) - end end }) @@ -2080,6 +2064,7 @@ function XBowsQuiver.sfinv_register_page(self) sfinv.set_player_inventory_formspec(player) elseif action == 'take' and inventory_info.listname == 'x_bows:arrow_inv' then local context = sfinv.get_or_create_context(player) + context._itemstack_arrow = nil sfinv.set_context(player, context) sfinv.set_player_inventory_formspec(player) @@ -2118,16 +2103,355 @@ function XBowsQuiver.sfinv_register_page(self) elseif action == 'put' and inventory_info.listname == 'x_bows:quiver_inv' then local context = sfinv.get_or_create_context(player) - if minetest.get_item_group(inventory_info.stack:get_name(), 'quiver') ~= 0 then - context._itemstack_quiver = inventory_info.stack - sfinv.set_context(player, context) - sfinv.set_player_inventory_formspec(player) - end + context._itemstack_quiver = inventory_info.stack + sfinv.set_context(player, context) + sfinv.set_player_inventory_formspec(player) elseif action == 'take' and inventory_info.listname == 'x_bows:quiver_inv' then local context = sfinv.get_or_create_context(player) + context._itemstack_quiver = nil sfinv.set_context(player, context) sfinv.set_player_inventory_formspec(player) end end) end + +---Register i3 page +function XBowsQuiver.i3_register_page(self) + i3.new_tab('x_bows:quiver_page', { + description = 'X Bows', + formspec = function(player, data, fs) + local formspec = { + ---arrow + 'label[1,1;Arrows you are holding:]', + 'list[current_player;x_bows:arrow_inv;1,1.5;1,1;]', + 'listring[current_player;x_bows:arrow_inv]', + 'listring[current_player;main]', + ---quiver + 'label[3,1;Quiver you are wearing:]', + 'list[current_player;x_bows:quiver_inv;3,1.5;1,1;]', + 'listring[current_player;x_bows:quiver_inv]', + 'listring[current_player;main]', + ---main + 'background9[0,0;10.23,12;i3_bg_full.png;false;12]', + 'listcolors[#bababa50;#bababa99]', + 'style_type[box;colors=#77777710,#77777710,#777,#777]', + 'box[0.22,6.9;1,1;]', + 'box[1.32,6.9;1,1;]', + 'box[2.42,6.9;1,1;]', + 'box[3.52,6.9;1,1;]', + 'box[4.62,6.9;1,1;]', + 'box[5.72,6.9;1,1;]', + 'box[6.82,6.9;1,1;]', + 'box[7.92,6.9;1,1;]', + 'box[9.02,6.9;1,1;]', + 'style_type[list;size=1;spacing=0.1]', + 'list[current_player;main;0.22,6.9;9,1;]', + 'style_type[list;size=1;spacing=0.1,0.1]', + 'list[current_player;main;0.22,8.05;9,4;9]', + 'style_type[list;size=1;spacing=0.15]', + 'listring[current_player;craft]listring[current_player;main]' + } + + local context = {} + local player_inv = player:get_inventory() + context._itemstack_arrow = player_inv:get_stack('x_bows:arrow_inv', 1) + context._itemstack_quiver = player_inv:get_stack('x_bows:quiver_inv', 1) + + if context._itemstack_arrow and not context._itemstack_arrow:is_empty() then + local x_bows_registered_arrow_def = self.registered_arrows[context._itemstack_arrow:get_name()] + + if x_bows_registered_arrow_def then + formspec[#formspec + 1] = 'label[1,3;' .. minetest.formspec_escape(context._itemstack_arrow:get_short_description()) .. '\n'.. minetest.formspec_escape(x_bows_registered_arrow_def.custom.description_abilities) ..']' + end + end + + + if context._itemstack_quiver and not context._itemstack_quiver:is_empty() then + local st_meta = context._itemstack_quiver:get_meta() + local quiver_id = st_meta:get_string('quiver_id') + + ---description + formspec[#formspec + 1] = 'label[3,3;' .. minetest.formspec_escape(context._itemstack_quiver:get_short_description()) .. ']' + formspec[#formspec + 1] = 'list[detached:'..quiver_id..';main;4.5,1.5;3,1;]' + formspec[#formspec + 1] = 'listring[detached:'..quiver_id..';main]' + formspec[#formspec + 1] = 'listring[current_player;main]' + end + + formspec = table.concat(formspec, '') + + fs(formspec) + end, + }) + + minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + ---arrow inventory + if action == 'move' and inventory_info.to_list == 'x_bows:arrow_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + + if minetest.get_item_group(stack:get_name(), 'arrow') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'move' and inventory_info.from_list == 'x_bows:arrow_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + + if minetest.get_item_group(stack:get_name(), 'arrow') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'put' and inventory_info.listname == 'x_bows:arrow_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'arrow') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + elseif action == 'take' and inventory_info.listname == 'x_bows:arrow_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'arrow') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + end + + ---quiver inventory + if action == 'move' and inventory_info.to_list == 'x_bows:quiver_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + if minetest.get_item_group(stack:get_name(), 'quiver') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'move' and inventory_info.from_list == 'x_bows:quiver_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + if minetest.get_item_group(stack:get_name(), 'quiver') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'put' and inventory_info.listname == 'x_bows:quiver_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'quiver') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + elseif action == 'take' and inventory_info.listname == 'x_bows:quiver_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'quiver') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + end + + return inventory_info.count or inventory_info.stack:get_count() + end) + + minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + ---arrow + if action == 'move' and inventory_info.to_list == 'x_bows:arrow_inv' then + i3.set_fs(player) + elseif action == 'move' and inventory_info.from_list == 'x_bows:arrow_inv' then + i3.set_fs(player) + elseif action == 'put' and inventory_info.listname == 'x_bows:arrow_inv' then + i3.set_fs(player) + elseif action == 'take' and inventory_info.listname == 'x_bows:arrow_inv' then + i3.set_fs(player) + end + + ---quiver + if action == 'move' and inventory_info.to_list == 'x_bows:quiver_inv' then + local stack = inventory:get_stack(inventory_info.to_list, inventory_info.to_index) + local st_meta = stack:get_meta() + local player_name = player:get_player_name() + local quiver_id = st_meta:get_string('quiver_id') + + if quiver_id == '' then + quiver_id = stack:get_name()..'_'..uuid() + st_meta:set_string('quiver_id', quiver_id) + inventory:set_stack(inventory_info.to_list, inventory_info.to_index, stack) + end + + self:get_or_create_detached_inv( + quiver_id, + player_name, + st_meta:get_string('quiver_items') + ) + + i3.set_fs(player) + elseif action == 'move' and inventory_info.from_list == 'x_bows:quiver_inv' then + i3.set_fs(player) + elseif action == 'put' and inventory_info.listname == 'x_bows:quiver_inv' then + i3.set_fs(player) + elseif action == 'take' and inventory_info.listname == 'x_bows:quiver_inv' then + i3.set_fs(player) + end + end) +end + +---Register i3 page +function XBowsQuiver.ui_register_page(self) + unified_inventory.register_page('x_bows:quiver_page', { + get_formspec = function(player, data, fs) + local formspec = { + unified_inventory.style_full.standard_inv_bg, + 'listcolors[#00000000;#00000000]', + ---arrow + 'label[0.5,0.5;Arrows you are holding:]', + unified_inventory.single_slot(0.4,0.9), + 'list[current_player;x_bows:arrow_inv;0.5,1;1,1;]', + 'listring[current_player;x_bows:arrow_inv]', + 'listring[current_player;main]', + ---quiver + 'label[3,0.5;Quiver you are wearing:]', + unified_inventory.single_slot(2.9,0.9), + 'list[current_player;x_bows:quiver_inv;3,1;1,1;]', + 'listring[current_player;x_bows:quiver_inv]', + 'listring[current_player;main]', + } + + local context = {} + context._itemstack_arrow = player:get_inventory():get_stack('x_bows:arrow_inv', 1) + context._itemstack_quiver = player:get_inventory():get_stack('x_bows:quiver_inv', 1) + + if context._itemstack_arrow and not context._itemstack_arrow:is_empty() then + local x_bows_registered_arrow_def = self.registered_arrows[context._itemstack_arrow:get_name()] + + if x_bows_registered_arrow_def then + formspec[#formspec + 1] = 'label[0.5,2.5;' .. minetest.formspec_escape(context._itemstack_arrow:get_short_description()) .. '\n'.. minetest.formspec_escape(x_bows_registered_arrow_def.custom.description_abilities) ..']' + end + end + + + if context._itemstack_quiver and not context._itemstack_quiver:is_empty() then + local st_meta = context._itemstack_quiver:get_meta() + local quiver_id = st_meta:get_string('quiver_id') + + ---description + formspec[#formspec + 1] = 'label[3,2.5;' .. minetest.formspec_escape(context._itemstack_quiver:get_short_description()) .. ']' + formspec[#formspec + 1] = unified_inventory.single_slot(4.4,0.9) + formspec[#formspec + 1] = unified_inventory.single_slot(5.65,0.9) + formspec[#formspec + 1] = unified_inventory.single_slot(6.9,0.9) + formspec[#formspec + 1] = 'list[detached:'..quiver_id..';main;4.5,1;3,1;]' + formspec[#formspec + 1] = 'listring[detached:'..quiver_id..';main]' + formspec[#formspec + 1] = 'listring[current_player;main]' + end + + return { + formspec = table.concat(formspec, '') + } + end + }) + + unified_inventory.register_button('x_bows:quiver_page', { + type = 'image', + image = "x_bows_bow_wood_charged.png", + tooltip = 'X Bows', + }) + + minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + ---arrow inventory + if action == 'move' and inventory_info.to_list == 'x_bows:arrow_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + + if minetest.get_item_group(stack:get_name(), 'arrow') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'move' and inventory_info.from_list == 'x_bows:arrow_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + + if minetest.get_item_group(stack:get_name(), 'arrow') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'put' and inventory_info.listname == 'x_bows:arrow_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'arrow') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + elseif action == 'take' and inventory_info.listname == 'x_bows:arrow_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'arrow') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + end + + ---quiver inventory + if action == 'move' and inventory_info.to_list == 'x_bows:quiver_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + if minetest.get_item_group(stack:get_name(), 'quiver') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'move' and inventory_info.from_list == 'x_bows:quiver_inv' then + local stack = inventory:get_stack(inventory_info.from_list, inventory_info.from_index) + if minetest.get_item_group(stack:get_name(), 'quiver') ~= 0 then + return inventory_info.count + else + return 0 + end + elseif action == 'put' and inventory_info.listname == 'x_bows:quiver_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'quiver') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + elseif action == 'take' and inventory_info.listname == 'x_bows:quiver_inv' then + if minetest.get_item_group(inventory_info.stack:get_name(), 'quiver') ~= 0 then + return inventory_info.stack:get_count() + else + return 0 + end + end + + return inventory_info.count or inventory_info.stack:get_count() + end) + + minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + ---arrow + if action == 'move' and inventory_info.to_list == 'x_bows:arrow_inv' then + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + elseif action == 'move' and inventory_info.from_list == 'x_bows:arrow_inv' then + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + elseif action == 'put' and inventory_info.listname == 'x_bows:arrow_inv' then + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + elseif action == 'take' and inventory_info.listname == 'x_bows:arrow_inv' then + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + end + + ---quiver + if action == 'move' and inventory_info.to_list == 'x_bows:quiver_inv' then + local stack = inventory:get_stack(inventory_info.to_list, inventory_info.to_index) + local st_meta = stack:get_meta() + local player_name = player:get_player_name() + local quiver_id = st_meta:get_string('quiver_id') + + if quiver_id == '' then + quiver_id = stack:get_name()..'_'..uuid() + st_meta:set_string('quiver_id', quiver_id) + inventory:set_stack(inventory_info.to_list, inventory_info.to_index, stack) + end + + self:get_or_create_detached_inv( + quiver_id, + player_name, + st_meta:get_string('quiver_items') + ) + + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + elseif action == 'move' and inventory_info.from_list == 'x_bows:quiver_inv' then + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + elseif action == 'put' and inventory_info.listname == 'x_bows:quiver_inv' then + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + elseif action == 'take' and inventory_info.listname == 'x_bows:quiver_inv' then + unified_inventory.set_inventory_formspec(player, 'x_bows:quiver_page') + end + end) +end diff --git a/init.lua b/init.lua index 67f1d0f..90b5afc 100644 --- a/init.lua +++ b/init.lua @@ -20,7 +20,14 @@ dofile(path .. '/arrow.lua') dofile(path .. '/items.lua') dofile(path .. '/quiver.lua') -XBowsQuiver:sfinv_register_page() + +if minetest.get_modpath('i3') then + XBowsQuiver:i3_register_page() +elseif minetest.get_modpath('unified_inventory') then + XBowsQuiver:ui_register_page() +else + XBowsQuiver:sfinv_register_page() +end minetest.register_on_joinplayer(function(player) local inv_quiver = player:get_inventory()--[[@as InvRef]] @@ -28,6 +35,19 @@ minetest.register_on_joinplayer(function(player) inv_quiver:set_size('x_bows:quiver_inv', 1 * 1) inv_arrow:set_size('x_bows:arrow_inv', 1 * 1) + + local quiver = player:get_inventory():get_stack('x_bows:quiver_inv', 1) + + if quiver and not quiver:is_empty() then + local st_meta = quiver:get_meta() + local quiver_id = st_meta:get_string('quiver_id') + + XBowsQuiver:get_or_create_detached_inv( + quiver_id, + player:get_player_name(), + st_meta:get_string('quiver_items') + ) + end end) ---backwards compatibility diff --git a/items.lua b/items.lua index ab42f2f..147dc14 100644 --- a/items.lua +++ b/items.lua @@ -23,6 +23,7 @@ XBows:register_bow('bow_wood', { XBows:register_arrow('arrow_wood', { description = 'Arrow Wood', + short_description = 'Arrow Wood', inventory_image = 'x_bows_arrow_wood.png', custom = { recipe = { @@ -41,6 +42,7 @@ XBows:register_arrow('arrow_wood', { XBows:register_arrow('arrow_stone', { description = 'Arrow Stone', + short_description = 'Arrow Stone', inventory_image = 'x_bows_arrow_stone.png', custom = { recipe = { @@ -58,6 +60,7 @@ XBows:register_arrow('arrow_stone', { XBows:register_arrow('arrow_bronze', { description = 'Arrow Bronze', + short_description = 'Arrow Bronze', inventory_image = 'x_bows_arrow_bronze.png', custom = { recipe = { @@ -75,6 +78,7 @@ XBows:register_arrow('arrow_bronze', { XBows:register_arrow('arrow_steel', { description = 'Arrow Steel', + short_description = 'Arrow Steel', inventory_image = 'x_bows_arrow_steel.png', custom = { recipe = { @@ -92,6 +96,7 @@ XBows:register_arrow('arrow_steel', { XBows:register_arrow('arrow_mese', { description = 'Arrow Mese', + short_description = 'Arrow Mese', inventory_image = 'x_bows_arrow_mese.png', custom = { recipe = { @@ -109,6 +114,7 @@ XBows:register_arrow('arrow_mese', { XBows:register_arrow('arrow_diamond', { description = 'Arrow Diamond', + short_description = 'Arrow Diamond', inventory_image = 'x_bows_arrow_diamond.png', custom = { recipe = { diff --git a/mod.conf b/mod.conf index 5f177b6..096215d 100644 --- a/mod.conf +++ b/mod.conf @@ -1,6 +1,6 @@ name = x_bows description = Adds bow and arrows to Minetest. depends = -optional_depends = default, farming, 3d_armor, mesecons, playerphysics, player_monoids, wool +optional_depends = default, farming, 3d_armor, mesecons, playerphysics, player_monoids, wool, i3, unified_inventory supported_games = minetest_game min_minetest_version = 5.4