From 1dd7beaae059e4f1e9020d4b7ed5da8b99426bb8 Mon Sep 17 00:00:00 2001 From: Juraj Vajda Date: Thu, 10 Nov 2022 00:15:51 -0500 Subject: [PATCH] Use node meta for formspec --- api.lua | 15 ++-- table.lua | 144 +++++++++++++++++++++---------------- types/xenchanting.type.lua | 2 +- 3 files changed, 86 insertions(+), 75 deletions(-) diff --git a/api.lua b/api.lua index d27d878..bdc5945 100644 --- a/api.lua +++ b/api.lua @@ -32,14 +32,7 @@ XEnchanting = { ['default:sword_bronze'] = 22, ['default:sword_steel'] = 14, ['default:sword_mese'] = 15, - ['default:sword_diamond'] = 10, - -- hoes - ['farming:hoe_wood'] = 15, - ['farming:hoe_stone'] = 5, - ['farming:hoe_steel'] = 14, - ['farming:hoe_bronze'] = 22, - ['farming:hoe_mese'] = 15, - ['farming:hoe_diamond'] = 10, + ['default:sword_diamond'] = 10 }, roman_numbers = { [1] = 'I', @@ -343,14 +336,14 @@ function XEnchanting.get_enchanted_tool_capabilities(self, tool_def, enchantment } end -function XEnchanting.set_enchanted_tool(self, itemstack, level, player_name) +function XEnchanting.set_enchanted_tool(self, pos, itemstack, level, player_name) local data = self.form_context[player_name].data - local pos = self.form_context[player_name].pos local capabilities = data.slots[level].tool_cap_data.tool_capabilities local description = data.slots[level].tool_cap_data.enchantments_desc local final_enchantments = data.slots[level].final_enchantments local inv = minetest.get_meta(pos):get_inventory() local tool_def = minetest.registered_tools[itemstack:get_name()] + local node_meta = minetest.get_meta(pos) if not tool_def then return @@ -374,7 +367,7 @@ function XEnchanting.set_enchanted_tool(self, itemstack, level, player_name) self.randomseed = tonumber(tostring(os.time()):reverse():sub(1, 9)) --[[@as number]] local formspec = self:get_formspec(pos, player_name) - minetest.show_formspec(player_name, 'x_enchanting:table', formspec) + node_meta:set_string('formspec', formspec) minetest.sound_play('x_enchanting_enchant', { gain = 0.3, diff --git a/table.lua b/table.lua index a56d56c..9c8dd48 100644 --- a/table.lua +++ b/table.lua @@ -70,6 +70,9 @@ minetest.register_node('x_enchanting:table', { meta:set_string('owner', player_name) meta:set_string('infotext', S('Enchanting Table') .. ' (' .. S('owned by') .. ' ' .. player_name .. ')') + + local formspec = XEnchanting:get_formspec(pos, player_name) + meta:set_string('formspec', formspec) end, ---@param pos Vector ---@param node NodeDef @@ -77,6 +80,7 @@ minetest.register_node('x_enchanting:table', { ---@param itemstack ItemStack ---@param pointed_thing? PointedThingDef on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) local p_name = clicker:get_player_name() if minetest.is_protected(pos, p_name) then @@ -103,11 +107,11 @@ minetest.register_node('x_enchanting:table', { local data = XEnchanting:get_enchantment_data(#bookshelfs, minetest.registered_tools[item_stack:get_name()]) local formspec = XEnchanting:get_formspec(pos, p_name, data) - minetest.show_formspec(p_name, 'x_enchanting:table', formspec) + meta:set_string('formspec', formspec) else local formspec = XEnchanting:get_formspec(pos, p_name) - minetest.show_formspec(p_name, 'x_enchanting:table', formspec) + meta:set_string('formspec', formspec) end return itemstack @@ -326,8 +330,9 @@ minetest.register_node('x_enchanting:table', { ---@param stack ItemStack ---@param player ObjectRef on_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) local p_name = player:get_player_name() - local inv = minetest.get_meta(pos):get_inventory() + local inv = meta:get_inventory() if not inv:is_empty('item') then -- bookshelfs @@ -341,11 +346,11 @@ minetest.register_node('x_enchanting:table', { local data = XEnchanting:get_enchantment_data(#bookshelfs, minetest.registered_tools[item_stack:get_name()]) local formspec = XEnchanting:get_formspec(pos, p_name, data) - minetest.show_formspec(p_name, 'x_enchanting:table', formspec) + meta:set_string('formspec', formspec) else local formspec = XEnchanting:get_formspec(pos, p_name) - minetest.show_formspec(p_name, 'x_enchanting:table', formspec) + meta:set_string('formspec', formspec) end end, ---@param pos Vector @@ -354,8 +359,9 @@ minetest.register_node('x_enchanting:table', { ---@param stack ItemStack ---@param player ObjectRef on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) local p_name = player:get_player_name() - local inv = minetest.get_meta(pos):get_inventory() + local inv = meta:get_inventory() if not inv:is_empty('item') then -- bookshelfs @@ -369,70 +375,70 @@ minetest.register_node('x_enchanting:table', { local data = XEnchanting:get_enchantment_data(#bookshelfs, minetest.registered_tools[item_stack:get_name()]) local formspec = XEnchanting:get_formspec(pos, p_name, data) - minetest.show_formspec(p_name, 'x_enchanting:table', formspec) + meta:set_string('formspec', formspec) else local formspec = XEnchanting:get_formspec(pos, p_name) - minetest.show_formspec(p_name, 'x_enchanting:table', formspec) + meta:set_string('formspec', formspec) end + end, + -- form receive fields + ---@param pos Vector + ---@param formname string + ---@param fields table + ---@param sender ObjectRef + on_receive_fields = function(pos, formname, fields, sender) + local p_name = sender:get_player_name() + + if fields.quit then + XEnchanting.form_context[p_name] = nil + return + end + + local selected_slot + + if fields.slot_1 and fields.slot_1 ~= '' then + selected_slot = 1 + elseif fields.slot_2 and fields.slot_2 ~= '' then + selected_slot = 2 + elseif fields.slot_3 and fields.slot_3 ~= '' then + selected_slot = 3 + end + + if not XEnchanting.form_context[p_name] or not selected_slot then + return + end + + local inv = minetest.get_meta(pos):get_inventory() + + if inv:is_empty('trade') or inv:is_empty('item') then + return + end + + local trade_stack = inv:get_stack('trade', 1) + local data = XEnchanting.form_context[p_name].data + + if trade_stack:get_count() < selected_slot or not data then + return + end + + local item_stack = inv:get_stack('item', 1) + local is_enchanted = item_stack:get_meta():get_int('is_enchanted') + + if is_enchanted == 1 then + return + end + + -- Enchant item + XEnchanting:set_enchanted_tool( + pos, + item_stack, + selected_slot, + p_name + ) end }) --- form receive fields ----@param player ObjectRef ----@param formname string ----@param fields table -minetest.register_on_player_receive_fields(function(player, formname, fields) - local p_name = player:get_player_name() - - if formname ~= 'x_enchanting:table' or fields.quit then - XEnchanting.form_context[p_name] = nil - return - end - - local selected_slot - - if fields.slot_1 and fields.slot_1 ~= '' then - selected_slot = 1 - elseif fields.slot_2 and fields.slot_2 ~= '' then - selected_slot = 2 - elseif fields.slot_3 and fields.slot_3 ~= '' then - selected_slot = 3 - end - - if not XEnchanting.form_context[p_name] or not selected_slot then - return - end - - local pos = XEnchanting.form_context[p_name].pos - local inv = minetest.get_meta(pos):get_inventory() - - if inv:is_empty('trade') or inv:is_empty('item') then - return - end - - local trade_stack = inv:get_stack('trade', 1) - local data = XEnchanting.form_context[p_name].data - - if trade_stack:get_count() < selected_slot or not data then - return - end - - local item_stack = inv:get_stack('item', 1) - local is_enchanted = item_stack:get_meta():get_int('is_enchanted') - - if is_enchanted == 1 then - return - end - - -- Enchant item - XEnchanting:set_enchanted_tool( - item_stack, - selected_slot, - p_name - ) -end) - ---- --- Entity (Scroll) ---- @@ -530,9 +536,21 @@ minetest.register_entity('x_enchanting:table_scroll', { if self._player and self._scroll_closed then self._scroll_closed = false self.object:set_animation(unpack(XEnchanting.scroll_animations.scroll_open)) + + minetest.sound_play('x_enchanting_scroll', { + gain = 0.3, + pos = pos, + max_hear_distance = 10 + }, true) elseif not self._player and not self._scroll_closed then self._scroll_closed = true self.object:set_animation(unpack(XEnchanting.scroll_animations.scroll_close)) + + minetest.sound_play('x_enchanting_scroll', { + gain = 0.3, + pos = pos, + max_hear_distance = 10 + }, true) end end diff --git a/types/xenchanting.type.lua b/types/xenchanting.type.lua index 994b28f..0201bf6 100644 --- a/types/xenchanting.type.lua +++ b/types/xenchanting.type.lua @@ -8,7 +8,7 @@ ---@field has_tool_group fun(self: XEnchanting, name: string): string | boolean Check if tool has one of the known tool groups, returns `false` otherwise. ---@field set_tool_enchantability fun(self: XEnchanting, tool_def: ItemDef): nil Sets `enchantibility` group and values from base table (`XEnchanting.tools_enchantability`) to all registered tools (atching known group names). If tool has already `enchantibility` group defined it will take the defined value insted. ---@field get_enchanted_tool_capabilities fun(self: XEnchanting, tool_def: ItemDef, enchantments: Enchantments[]): GetEnchantedToolCapabilitiesReturn Applies enchantments to item tool capabilities. ----@field set_enchanted_tool fun(self: XEnchanting, itemstack: ItemStack, level: number, player_name: string): nil Set choosen enchantment and its modified tool capabilities to itemstack and `item` inventory. This will also get new `randomseed`. +---@field set_enchanted_tool fun(self: XEnchanting, pos: Vector, itemstack: ItemStack, level: number, player_name: string): nil Set choosen enchantment and its modified tool capabilities to itemstack and `item` inventory. This will also get new `randomseed`. ---@field get_enchantment_data fun(self: XEnchanting, nr_of_bookshelfs: number, tool_def: ItemDef): EnchantmentData Algoritm to get aplicable random enchantments. ---@field get_formspec fun(self: XEnchanting, pos: Vector, player_name: string, data?: EnchantmentData): string Builds and returns `formspec` string