diff --git a/.luacheckrc b/.luacheckrc index 4af6dd8..d226b07 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -16,13 +16,14 @@ exclude_files = { } globals = { + 'minetest', 'XEnchanting' } read_globals = { "DIR_DELIM", "INIT", - "minetest", "core", + "core", "dump", "dump2", "Raycast", diff --git a/README.md b/README.md index ff06bb9..e89cb38 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,10 @@ Increases the item's durability. Increases the player's mining speed. Also adds mining groupcaps to item, e.g. enchanted wood pickaxe can mine level 1 nodes (e.g. obsidian) after enchantment. +#### Silk Touch + +Causes certain blocks to drop themselves as items instead of their usual drops when mined. Mods can prevent this behaviour with adding group `{ no_silktouch = 1 }` to the nodes. + ## Dependencies - none @@ -129,11 +133,11 @@ GNU Lesser General Public License v2.1 or later (see included LICENSE file) ### Sounds -**Mixkit Sound Effects Free License**, Sound effects obtained from https://mixkit.co +**Creative Commons License, Kostas17**, https://freesound.org - x_enchanting_enchant.ogg -**Standard License**, Sound effects obtained from https://mixkit.co +**Creative Commons License, jammaj**, https://freesound.org - x_enchanting_scroll.1.ogg - x_enchanting_scroll.2.ogg @@ -144,11 +148,6 @@ GNU Lesser General Public License v2.1 or later (see included LICENSE file) - x_enchanting_scroll.7.ogg - x_enchanting_scroll.8.ogg - x_enchanting_scroll.9.ogg -- x_enchanting_scroll.10.ogg -- x_enchanting_scroll.11.ogg -- x_enchanting_scroll.12.ogg -- x_enchanting_scroll.13.ogg -- x_enchanting_scroll.14.ogg ## Installation diff --git a/api.lua b/api.lua index bdc5945..e58ff5a 100644 --- a/api.lua +++ b/api.lua @@ -115,6 +115,16 @@ XEnchanting = { [5] = 45, }, weight = 10 + }, + silk_touch = { + name = S('Silk Touch'), + final_level_range = { + [1] = { 15, 65 } + }, + level_def = { + [1] = 'silk_touch' + }, + weight = 1 } }, randomseed = os.time(), @@ -323,6 +333,15 @@ function XEnchanting.get_enchanted_tool_capabilities(self, tool_def, enchantment .. self.roman_numbers[enchantment.level] end end + + -- Silk Touch + if enchantment.id == 'silk_touch' then + enchantments_desc[#enchantments_desc + 1] = self.enchantment_defs[enchantment.id].name + + if #enchantments_desc_masked == 0 then + enchantments_desc_masked[#enchantments_desc_masked + 1] = self.enchantment_defs[enchantment.id].name + end + end end enchantments_desc = '\n' .. minetest.colorize('#AE81FF', S('Enchanted')) @@ -350,6 +369,14 @@ function XEnchanting.set_enchanted_tool(self, pos, itemstack, level, player_name end local stack_meta = itemstack:get_meta() + local is_silk_touch = 0 + + for i, val in ipairs(final_enchantments) do + if val.id == 'silk_touch' then + is_silk_touch = 1 + break + end + end stack_meta:set_tool_capabilities(capabilities) stack_meta:set_string('description', itemstack:get_description() .. '\n' .. description) @@ -357,6 +384,10 @@ function XEnchanting.set_enchanted_tool(self, pos, itemstack, level, player_name stack_meta:set_int('is_enchanted', 1) stack_meta:set_string('x_enchanting', minetest.serialize({ enchantments = final_enchantments })) + if is_silk_touch > 0 then + stack_meta:set_int('is_silk_touch', 1) + end + inv:set_stack('item', 1, itemstack) local trade_stack = inv:get_stack('trade', 1) diff --git a/init.lua b/init.lua index 72493d0..0b78f59 100644 --- a/init.lua +++ b/init.lua @@ -23,6 +23,47 @@ minetest.register_on_leaveplayer(function(player, timed_out) XEnchanting.form_context[player:get_player_name()] = nil end) +-- Silk Touch +local old_handle_node_drops = minetest.handle_node_drops + +function minetest.handle_node_drops(pos, drops, digger) + if not digger + or not digger:is_player() + then + return old_handle_node_drops(pos, drops, digger) + end + + local wield_stack = digger:get_wielded_item() + local wield_stack_meta = wield_stack:get_meta() + if wield_stack_meta:get_int('is_silk_touch') == 0 then + return old_handle_node_drops(pos, drops, digger) + end + + local wield_stack_name = wield_stack:get_name() + local node = minetest.get_node(pos) + local silk_touch_group + + if minetest.get_item_group(wield_stack_name, 'pickaxe') > 0 then + silk_touch_group = 'cracky' + elseif minetest.get_item_group(wield_stack_name, 'shovel') > 0 then + silk_touch_group = 'crumbly' + elseif minetest.get_item_group(wield_stack_name, 'axe') > 0 then + silk_touch_group = 'choppy' + elseif minetest.get_item_group(wield_stack_name, 'sword') > 0 then + silk_touch_group = 'snappy' + end + + if not silk_touch_group + or minetest.get_item_group(node.name, silk_touch_group) == 0 + or minetest.get_item_group(node.name, 'no_silktouch') == 1 + then + return old_handle_node_drops(pos, drops, digger) + end + + -- drop raw item/node + return old_handle_node_drops(pos, { ItemStack(node.name) }, digger) +end + local mod_end_time = (minetest.get_us_time() - mod_start_time) / 1000000 print('[Mod] x_enchanting loaded.. [' .. mod_end_time .. 's]') diff --git a/sounds/x_enchanting_enchant.ogg b/sounds/x_enchanting_enchant.ogg index 731bbc1..c19d104 100644 Binary files a/sounds/x_enchanting_enchant.ogg and b/sounds/x_enchanting_enchant.ogg differ diff --git a/sounds/x_enchanting_scroll.1.ogg b/sounds/x_enchanting_scroll.1.ogg index dee40fd..9bfd2b5 100644 Binary files a/sounds/x_enchanting_scroll.1.ogg and b/sounds/x_enchanting_scroll.1.ogg differ diff --git a/sounds/x_enchanting_scroll.10.ogg b/sounds/x_enchanting_scroll.10.ogg deleted file mode 100644 index 9168ba0..0000000 Binary files a/sounds/x_enchanting_scroll.10.ogg and /dev/null differ diff --git a/sounds/x_enchanting_scroll.11.ogg b/sounds/x_enchanting_scroll.11.ogg deleted file mode 100644 index c60ad52..0000000 Binary files a/sounds/x_enchanting_scroll.11.ogg and /dev/null differ diff --git a/sounds/x_enchanting_scroll.12.ogg b/sounds/x_enchanting_scroll.12.ogg deleted file mode 100644 index 0b1bc3c..0000000 Binary files a/sounds/x_enchanting_scroll.12.ogg and /dev/null differ diff --git a/sounds/x_enchanting_scroll.13.ogg b/sounds/x_enchanting_scroll.13.ogg deleted file mode 100644 index 300ed5d..0000000 Binary files a/sounds/x_enchanting_scroll.13.ogg and /dev/null differ diff --git a/sounds/x_enchanting_scroll.14.ogg b/sounds/x_enchanting_scroll.14.ogg deleted file mode 100644 index e833a16..0000000 Binary files a/sounds/x_enchanting_scroll.14.ogg and /dev/null differ diff --git a/sounds/x_enchanting_scroll.2.ogg b/sounds/x_enchanting_scroll.2.ogg index 084a74f..e836966 100644 Binary files a/sounds/x_enchanting_scroll.2.ogg and b/sounds/x_enchanting_scroll.2.ogg differ diff --git a/sounds/x_enchanting_scroll.3.ogg b/sounds/x_enchanting_scroll.3.ogg index f31f6eb..eb4c26e 100644 Binary files a/sounds/x_enchanting_scroll.3.ogg and b/sounds/x_enchanting_scroll.3.ogg differ diff --git a/sounds/x_enchanting_scroll.4.ogg b/sounds/x_enchanting_scroll.4.ogg index 8e3e6a2..f7c50b1 100644 Binary files a/sounds/x_enchanting_scroll.4.ogg and b/sounds/x_enchanting_scroll.4.ogg differ diff --git a/sounds/x_enchanting_scroll.5.ogg b/sounds/x_enchanting_scroll.5.ogg index b6e5410..f2dd0f5 100644 Binary files a/sounds/x_enchanting_scroll.5.ogg and b/sounds/x_enchanting_scroll.5.ogg differ diff --git a/sounds/x_enchanting_scroll.6.ogg b/sounds/x_enchanting_scroll.6.ogg index 44ab34a..5f050cf 100644 Binary files a/sounds/x_enchanting_scroll.6.ogg and b/sounds/x_enchanting_scroll.6.ogg differ diff --git a/sounds/x_enchanting_scroll.7.ogg b/sounds/x_enchanting_scroll.7.ogg index d3e2a71..d013d11 100644 Binary files a/sounds/x_enchanting_scroll.7.ogg and b/sounds/x_enchanting_scroll.7.ogg differ diff --git a/sounds/x_enchanting_scroll.8.ogg b/sounds/x_enchanting_scroll.8.ogg index 8c7f0e3..4dd03b7 100644 Binary files a/sounds/x_enchanting_scroll.8.ogg and b/sounds/x_enchanting_scroll.8.ogg differ diff --git a/sounds/x_enchanting_scroll.9.ogg b/sounds/x_enchanting_scroll.9.ogg index 3c96beb..3fc5867 100644 Binary files a/sounds/x_enchanting_scroll.9.ogg and b/sounds/x_enchanting_scroll.9.ogg differ diff --git a/types/minetest.type.lua b/types/minetest.type.lua index 8a074ae..5124395 100644 --- a/types/minetest.type.lua +++ b/types/minetest.type.lua @@ -88,6 +88,7 @@ ---@field add_particle fun(def: ParticleDef): nil ---@field registered_tools table Map of registered tool definitions, indexed by name ---@field has_feature fun(args: table | string): boolean | table returns `boolean, missing_features`, `arg`: string or table in format `{foo=true, bar=true}`, `missing_features`: `{foo=true, bar=true}` +---@field handle_node_drops fun(pos: Vector, drops: string[], digger: ObjectRef) `drops`: list of itemstrings. Handles drops from nodes after digging: Default action is to put them into digger's inventory. Can be overridden to get different functionality (e.g. dropping items on ground) ---Minetest settings ---@class MinetestSettings diff --git a/types/xenchanting.type.lua b/types/xenchanting.type.lua index 0201bf6..d951598 100644 --- a/types/xenchanting.type.lua +++ b/types/xenchanting.type.lua @@ -4,7 +4,7 @@ ---@class XEnchanting ---@field tools_enchantability table Add enchantability to default tools. key/value = tool_name/enchantibility value ---@field roman_numbers table Convert Arabic numbers to Roman numbers ----@field enchantment_defs table<'sharpness' | 'fortune' | 'unbreaking' | 'efficiency', EnchantmentDef> +---@field enchantment_defs table<'sharpness' | 'fortune' | 'unbreaking' | 'efficiency' | 'silk_touch', EnchantmentDef> ---@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.