1
0
mirror of https://bitbucket.org/minetest_gamers/x_enchanting.git synced 2025-04-21 17:50:21 +02:00

Use node meta for formspec

This commit is contained in:
Juraj Vajda 2022-11-10 00:15:51 -05:00
parent db8d3e7a29
commit 1dd7beaae0
3 changed files with 86 additions and 75 deletions

15
api.lua
View File

@ -32,14 +32,7 @@ XEnchanting = {
['default:sword_bronze'] = 22, ['default:sword_bronze'] = 22,
['default:sword_steel'] = 14, ['default:sword_steel'] = 14,
['default:sword_mese'] = 15, ['default:sword_mese'] = 15,
['default:sword_diamond'] = 10, ['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,
}, },
roman_numbers = { roman_numbers = {
[1] = 'I', [1] = 'I',
@ -343,14 +336,14 @@ function XEnchanting.get_enchanted_tool_capabilities(self, tool_def, enchantment
} }
end 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 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 capabilities = data.slots[level].tool_cap_data.tool_capabilities
local description = data.slots[level].tool_cap_data.enchantments_desc local description = data.slots[level].tool_cap_data.enchantments_desc
local final_enchantments = data.slots[level].final_enchantments local final_enchantments = data.slots[level].final_enchantments
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
local tool_def = minetest.registered_tools[itemstack:get_name()] local tool_def = minetest.registered_tools[itemstack:get_name()]
local node_meta = minetest.get_meta(pos)
if not tool_def then if not tool_def then
return 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]] self.randomseed = tonumber(tostring(os.time()):reverse():sub(1, 9)) --[[@as number]]
local formspec = self:get_formspec(pos, player_name) 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', { minetest.sound_play('x_enchanting_enchant', {
gain = 0.3, gain = 0.3,

144
table.lua
View File

@ -70,6 +70,9 @@ minetest.register_node('x_enchanting:table', {
meta:set_string('owner', player_name) meta:set_string('owner', player_name)
meta:set_string('infotext', S('Enchanting Table') .. ' (' .. S('owned by') .. ' ' .. 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, end,
---@param pos Vector ---@param pos Vector
---@param node NodeDef ---@param node NodeDef
@ -77,6 +80,7 @@ minetest.register_node('x_enchanting:table', {
---@param itemstack ItemStack ---@param itemstack ItemStack
---@param pointed_thing? PointedThingDef ---@param pointed_thing? PointedThingDef
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local p_name = clicker:get_player_name() local p_name = clicker:get_player_name()
if minetest.is_protected(pos, p_name) then 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 data = XEnchanting:get_enchantment_data(#bookshelfs, minetest.registered_tools[item_stack:get_name()])
local formspec = XEnchanting:get_formspec(pos, p_name, data) local formspec = XEnchanting:get_formspec(pos, p_name, data)
minetest.show_formspec(p_name, 'x_enchanting:table', formspec) meta:set_string('formspec', formspec)
else else
local formspec = XEnchanting:get_formspec(pos, p_name) local formspec = XEnchanting:get_formspec(pos, p_name)
minetest.show_formspec(p_name, 'x_enchanting:table', formspec) meta:set_string('formspec', formspec)
end end
return itemstack return itemstack
@ -326,8 +330,9 @@ minetest.register_node('x_enchanting:table', {
---@param stack ItemStack ---@param stack ItemStack
---@param player ObjectRef ---@param player ObjectRef
on_metadata_inventory_put = function(pos, listname, index, stack, player) on_metadata_inventory_put = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
local p_name = player:get_player_name() 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 if not inv:is_empty('item') then
-- bookshelfs -- 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 data = XEnchanting:get_enchantment_data(#bookshelfs, minetest.registered_tools[item_stack:get_name()])
local formspec = XEnchanting:get_formspec(pos, p_name, data) local formspec = XEnchanting:get_formspec(pos, p_name, data)
minetest.show_formspec(p_name, 'x_enchanting:table', formspec) meta:set_string('formspec', formspec)
else else
local formspec = XEnchanting:get_formspec(pos, p_name) local formspec = XEnchanting:get_formspec(pos, p_name)
minetest.show_formspec(p_name, 'x_enchanting:table', formspec) meta:set_string('formspec', formspec)
end end
end, end,
---@param pos Vector ---@param pos Vector
@ -354,8 +359,9 @@ minetest.register_node('x_enchanting:table', {
---@param stack ItemStack ---@param stack ItemStack
---@param player ObjectRef ---@param player ObjectRef
on_metadata_inventory_take = function(pos, listname, index, stack, player) on_metadata_inventory_take = function(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
local p_name = player:get_player_name() 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 if not inv:is_empty('item') then
-- bookshelfs -- 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 data = XEnchanting:get_enchantment_data(#bookshelfs, minetest.registered_tools[item_stack:get_name()])
local formspec = XEnchanting:get_formspec(pos, p_name, data) local formspec = XEnchanting:get_formspec(pos, p_name, data)
minetest.show_formspec(p_name, 'x_enchanting:table', formspec) meta:set_string('formspec', formspec)
else else
local formspec = XEnchanting:get_formspec(pos, p_name) local formspec = XEnchanting:get_formspec(pos, p_name)
minetest.show_formspec(p_name, 'x_enchanting:table', formspec) meta:set_string('formspec', formspec)
end 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 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) --- Entity (Scroll)
---- ----
@ -530,9 +536,21 @@ minetest.register_entity('x_enchanting:table_scroll', {
if self._player and self._scroll_closed then if self._player and self._scroll_closed then
self._scroll_closed = false self._scroll_closed = false
self.object:set_animation(unpack(XEnchanting.scroll_animations.scroll_open)) 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 elseif not self._player and not self._scroll_closed then
self._scroll_closed = true self._scroll_closed = true
self.object:set_animation(unpack(XEnchanting.scroll_animations.scroll_close)) 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
end end

View File

@ -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 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 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 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_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 ---@field get_formspec fun(self: XEnchanting, pos: Vector, player_name: string, data?: EnchantmentData): string Builds and returns `formspec` string