From ed738da01628f269e6dc7c067419067a87998157 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 25 Nov 2020 12:47:27 +0100 Subject: [PATCH] Added Enchanting Table --- mods/CORE/mcl_enchanting/README | 5 - mods/CORE/mcl_enchanting/book.lua | 9 - mods/CORE/mcl_enchanting/command.lua | 41 -- mods/CORE/mcl_enchanting/enchantments.lua | 209 ++++++++- mods/CORE/mcl_enchanting/engine.lua | 497 ++++++++++++++++++---- mods/CORE/mcl_enchanting/init.lua | 264 +++++++++++- mods/CORE/mcl_enchanting/mod.conf | 4 +- mods/CORE/mcl_enchanting/table.lua | 189 -------- mods/CORE/mcl_enchanting/table_book.lua | 87 ---- mods/CORE/mcl_enchanting/tt.lua | 18 - mods/HELP/tt/init.lua | 23 +- mods/HUD/mcl_inventory/depends.txt | 1 + mods/HUD/mcl_inventory/init.lua | 15 +- mods/ITEMS/mcl_armor/armor.lua | 2 +- mods/ITEMS/mcl_armor/init.lua | 40 +- mods/ITEMS/mcl_books/init.lua | 3 +- mods/ITEMS/mcl_bows/bow.lua | 10 +- mods/ITEMS/mcl_compass/init.lua | 4 +- mods/ITEMS/mcl_farming/hoes.lua | 10 +- mods/ITEMS/mcl_farming/pumpkin.lua | 1 + mods/ITEMS/mcl_fire/flint_and_steel.lua | 2 +- mods/ITEMS/mcl_fishing/init.lua | 2 +- mods/ITEMS/mcl_heads/init.lua | 2 +- mods/ITEMS/mcl_tools/init.lua | 40 +- mods/ITEMS/screwdriver/init.lua | 2 +- 25 files changed, 952 insertions(+), 528 deletions(-) delete mode 100644 mods/CORE/mcl_enchanting/README delete mode 100644 mods/CORE/mcl_enchanting/book.lua delete mode 100644 mods/CORE/mcl_enchanting/command.lua delete mode 100644 mods/CORE/mcl_enchanting/table.lua delete mode 100644 mods/CORE/mcl_enchanting/table_book.lua delete mode 100644 mods/CORE/mcl_enchanting/tt.lua diff --git a/mods/CORE/mcl_enchanting/README b/mods/CORE/mcl_enchanting/README deleted file mode 100644 index 4d1d5af9d..000000000 --- a/mods/CORE/mcl_enchanting/README +++ /dev/null @@ -1,5 +0,0 @@ -Enchanting for MineClone2 --------------------------- - -This is a rewrite of the mtg enchanting mod. Beta Version, more features coming soon. -The textures look absolutely shit, but as far as I know I have to use the textures from Pixel Perfection so I dont get trouble with Mocrisoft. There is a version with original textures and sounds, but I can't publish that one. If you'd like to advice me how I can somehow do that anyway, please open an issue or contact me via email (eliasfleckenstein@web.de). diff --git a/mods/CORE/mcl_enchanting/book.lua b/mods/CORE/mcl_enchanting/book.lua deleted file mode 100644 index 7b0ee5080..000000000 --- a/mods/CORE/mcl_enchanting/book.lua +++ /dev/null @@ -1,9 +0,0 @@ -minetest.register_craftitem("mcl_enchanting:book_enchanted", { - description = "Enchanted Book", - inventory_image = "mcl_enchanting_book_enchanted.png^[colorize:purple:50", - groups = {enchanted = 1, not_in_creative_inventory = 1}, - _mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted", - stack_max = 1, -}) - -minetest.registered_items["mcl_books:book"]._mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted" diff --git a/mods/CORE/mcl_enchanting/command.lua b/mods/CORE/mcl_enchanting/command.lua deleted file mode 100644 index e93a3979c..000000000 --- a/mods/CORE/mcl_enchanting/command.lua +++ /dev/null @@ -1,41 +0,0 @@ -minetest.register_chatcommand("enchant", { - description = "Enchant an item.", - params = " []", - privs = {give = true}, - func = function(_, param) - local sparam = param:split(" ") - local target_name = sparam[1] - local enchantment = sparam[2] - local level_str = sparam[3] - local level = tonumber(level_str or "1") - if not target_name or not enchantment then - return false, "Usage: /enchant []" - end - local target = minetest.get_player_by_name(target_name) - if not target then - return false, "Player '" .. target_name .. "' cannot be found" - end - local itemstack = target:get_wielded_item() - local can_enchant, errorstring, extra_info = mcl_enchanting.can_enchant(itemstack, enchantment, level) - if not can_enchant then - if errorstring == "enchantment invalid" then - return false, "There is no such enchantment '" .. enchantment .. "'" - elseif errorstring == "item missing" then - return false, "The target doesn't hold an item" - elseif errorstring == "item not supported" then - return false, "The selected enchantment can't be added to the target item" - elseif errorstring == "level invalid" then - return false, "'" .. level_str .. "' is not a valid number" - elseif errorstring == "level too high" then - return false, "The number you have entered (" .. level_str .. ") is too big, it must be at most " .. extra_info - elseif errorstring == "level too small" then - return false, "The number you have entered (" .. level_str .. ") is too small, it must be at least " .. extra_info - elseif errorstring == "incompatible" then - return false, mcl_enchanting.get_enchantment_description(enchantment, level) .. " can't be combined with " .. extra_info - end - else - target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level)) - return true, "Enchanting succeded" - end - end -}) diff --git a/mods/CORE/mcl_enchanting/enchantments.lua b/mods/CORE/mcl_enchanting/enchantments.lua index c03cf9988..4ed94a0b3 100644 --- a/mods/CORE/mcl_enchanting/enchantments.lua +++ b/mods/CORE/mcl_enchanting/enchantments.lua @@ -21,6 +21,8 @@ end curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{1, 41}}, }]]-- -- implemented via on_enchant and additions in mobs_mc; Slowness IV part unimplemented @@ -36,6 +38,8 @@ mcl_enchanting.enchantments.bane_of_arthropods = { curse = false, on_enchant = increase_damage("anthropod", 2.5), requires_tool = false, + treasure = false, + power_range_table = {{5, 25}, {13, 33}, {21, 41}, {29, 49}, {37, 57}}, } -- implemented in mcl_armor @@ -51,8 +55,27 @@ mcl_enchanting.enchantments.blast_protection = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{5, 13}, {13, 21}, {21, 29}, {29, 37}}, } +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.channeling = { + name = "Channeling", + max_level = 1, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {riptide = true}, + weight = 1, + description = "Trident \"channels\" a bolt of lightning toward a hit entity. Functions only during thunderstorms and if target is unobstructed with opaque blocks.", + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{25, 50}}, +}]]-- + -- implemented in mcl_armor mcl_enchanting.enchantments.curse_of_binding = { name = "Curse of Binding", @@ -66,6 +89,8 @@ mcl_enchanting.enchantments.curse_of_binding = { curse = true, on_enchant = function() end, requires_tool = false, + treasure = true, + power_range_table = {{25, 50}}, } -- implemented in mcl_death_drop @@ -74,17 +99,19 @@ mcl_enchanting.enchantments.curse_of_vanishing = { max_level = 1, primary = {}, secondary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true, tool = true, weapon = true}, - disallow = {clock = true}, + disallow = {}, incompatible = {}, weight = 1, description = "Item destroyed on death.", curse = true, on_enchant = function() end, requires_tool = false, + treasure = true, + power_range_table = {{25, 50}}, } -- unimplemented -mcl_enchanting.enchantments.depth_strider = { +--[[mcl_enchanting.enchantments.depth_strider = { name = "Depth Strider", max_level = 3, primary = {}, @@ -96,7 +123,9 @@ mcl_enchanting.enchantments.depth_strider = { curse = false, on_enchant = function() end, requires_tool = false, -} + treasure = false, + power_range_table = {{10, 25}, {20, 35}, {30, 45}}, +}]]-- -- implemented via on_enchant mcl_enchanting.enchantments.efficiency = { @@ -121,6 +150,8 @@ mcl_enchanting.enchantments.efficiency = { itemstack:get_meta():set_tool_capabilities(tool_capabilities) end, requires_tool = false, + treasure = false, + power_range_table = {{1, 61}, {11, 71}, {21, 81}, {31, 91}, {41, 101}}, } -- implemented in mcl_armor @@ -135,6 +166,8 @@ mcl_enchanting.enchantments.feather_falling = { description = "Reduces fall damage.",curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{5, 11}, {11, 17}, {17, 23}, {23, 29}}, } -- requires missing MineClone2 feature @@ -150,6 +183,8 @@ mcl_enchanting.enchantments.feather_falling = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{10, 61}, {30, 71}}, }]]-- -- implemented in mcl_armor @@ -165,6 +200,8 @@ mcl_enchanting.enchantments.fire_protection = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{10, 18}, {18, 26}, {26, 34}, {34, 42}}, } -- requires missing MineClone2 feature @@ -180,12 +217,14 @@ mcl_enchanting.enchantments.fire_protection = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{20, 50}}, }]]-- -- implemented in mcl_item_entity mcl_enchanting.enchantments.fortune = { name = "Fortune", - max_level = 4, + max_level = 3, primary = {pickaxe = true, shovel = true, axe = true, hoe = true}, secondary = {}, disallow = {}, @@ -195,6 +234,8 @@ mcl_enchanting.enchantments.fortune = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, } -- implemented via walkover.register_global @@ -210,6 +251,8 @@ mcl_enchanting.enchantments.frost_walker = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = true, + power_range_table = {{10, 25}, {20, 35}}, } walkover.register_global(function(pos, _, player) @@ -229,6 +272,23 @@ walkover.register_global(function(pos, _, player) end end) +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.impaling = { + name = "Impaling", + max_level = 5, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 2, + description = "Trident deals additional damage to mobs that spawn naturally in the ocean.", + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{1, 21}, {9, 29}, {17, 37}, {25, 45}, {33, 53}}, +}]]-- + -- implemented in mcl_bows mcl_enchanting.enchantments.infinity = { name = "Infinity", @@ -242,6 +302,8 @@ mcl_enchanting.enchantments.infinity = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{20, 50}}, } -- implemented via minetest.calculate_knockback @@ -257,6 +319,8 @@ mcl_enchanting.enchantments.knockback = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{5, 61}, {25, 71}}, } local old_calculate_knockback = minetest.calculate_knockback @@ -276,7 +340,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end -- unimplemented -mcl_enchanting.enchantments.looting = { +--[[mcl_enchanting.enchantments.looting = { name = "Looting", max_level = 3, primary = {sword = true}, @@ -288,10 +352,29 @@ mcl_enchanting.enchantments.looting = { curse = false, on_enchant = function() end, requires_tool = false, -} + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, +}]]-- + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.loyalty = { + name = "Loyalty", + max_level = 3, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {riptide = true}, + weight = 5, + description = "Trident returns after being thrown. Higher levels reduce return time.", + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{12, 50}, {19, 50}, {26, 50}}, +}]]-- -- unimplemented -mcl_enchanting.enchantments.luck_of_the_sea = { +--[[mcl_enchanting.enchantments.luck_of_the_sea = { name = "Luck of the Sea", max_level = 3, primary = {fishing_rod = true}, @@ -303,7 +386,9 @@ mcl_enchanting.enchantments.luck_of_the_sea = { curse = false, on_enchant = function() end, requires_tool = false, -} + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, +}]]-- -- implemented in mcl_fishing mcl_enchanting.enchantments.lure = { @@ -318,10 +403,12 @@ mcl_enchanting.enchantments.lure = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{15, 61}, {24, 71}, {33, 81}}, } -- unimplemented -mcl_enchanting.enchantments.mending = { +--[[mcl_enchanting.enchantments.mending = { name = "Mending", max_level = 1, primary = {}, @@ -333,14 +420,50 @@ mcl_enchanting.enchantments.mending = { curse = false, on_enchant = function() end, requires_tool = true, -} + treasure = true, + power_range_table = {{25, 75}}, +}]]-- + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.multishot = { + name = "Multishot", + max_level = 1, + primary = {crossbow = true}, + secondary = {}, + disallow = {}, + incompatible = {piercing = true}, + weight = 2, + description = "Shoot 3 arrows at the cost of one.", + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{20, 50}}, +}]]-- + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.piercing = { + name = "Piercing", + max_level = 4, + primary = {crossbow = true}, + secondary = {}, + disallow = {}, + incompatible = {multishot = true}, + weight = 10, + description = "Arrows pass through multiple entities.", + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{1, 50}, {11, 50}, {21, 50}, {31, 50}}, +}]]-- -- implemented in mcl_bows mcl_enchanting.enchantments.power = { name = "Power", max_level = 5, - primary = {}, - secondary = {bow = true}, + primary = {bow = true}, + secondary = {}, disallow = {}, incompatible = {}, weight = 10, @@ -348,6 +471,8 @@ mcl_enchanting.enchantments.power = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{1, 16}, {11, 26}, {21, 36}, {31, 46}, {41, 56}}, } -- implemented in mcl_armor @@ -363,6 +488,8 @@ mcl_enchanting.enchantments.projectile_protection = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{1, 16}, {11, 26}, {21, 36}, {31, 46}, {41, 56}}, } -- implemented in mcl_armor @@ -378,6 +505,8 @@ mcl_enchanting.enchantments.protection = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{1, 12}, {12, 23}, {23, 34}, {34, 45}}, } -- implemented via minetest.calculate_knockback (together with the Knockback enchantment) and mcl_bows @@ -393,10 +522,29 @@ mcl_enchanting.enchantments.punch = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{12, 37}, {32, 57}}, } +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.quick_charge = { + name = "Quick Charge", + max_level = 3, + primary = {crossbow = true}, + secondary = {}, + disallow = {}, + incompatible = {}, + weight = 5, + description = "Decreases crossbow charging time.", + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{12, 50}, {32, 50}, {52, 50}}, +}]]-- + -- unimplemented -mcl_enchanting.enchantments.respiration = { +--[[mcl_enchanting.enchantments.respiration = { name = "Respiration", max_level = 3, primary = {armor_head = true}, @@ -408,7 +556,26 @@ mcl_enchanting.enchantments.respiration = { curse = false, on_enchant = function() end, requires_tool = false, -} + treasure = false, + power_range_table = {{10, 40}, {20, 50}, {30, 60}}, +}]]-- + +-- requires missing MineClone2 feature +--[[mcl_enchanting.enchantments.riptide = { + name = "Riptide", + max_level = 3, + primary = {trident = true}, + secondary = {}, + disallow = {}, + incompatible = {channeling = true, loyalty = true}, + weight = 2, + description = "Trident launches player with itself when thrown. Functions only in water or rain.", + curse = false, + on_enchant = function() end, + requires_tool = false, + treasure = false, + power_range_table = {{17, 50}, {24, 50}, {31, 50}}, +}]]-- -- implemented via on_enchant mcl_enchanting.enchantments.sharpness = { @@ -423,6 +590,8 @@ mcl_enchanting.enchantments.sharpness = { curse = false, on_enchant = increase_damage("fleshy", 0.5), requires_tool = false, + treasure = false, + power_range_table = {{1, 21}, {12, 32}, {23, 43}, {34, 54}, {45, 65}}, } -- implemented in mcl_item_entity @@ -438,6 +607,8 @@ mcl_enchanting.enchantments.silk_touch = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{15, 61}}, } -- implemented via on_enchant and additions in mobs_mc @@ -453,6 +624,8 @@ mcl_enchanting.enchantments.smite = { curse = false, on_enchant = increase_damage("undead", 2.5), requires_tool = false, + treasure = false, + power_range_table = {{5, 25}, {13, 33}, {21, 41}, {29, 49}, {37, 57}}, } -- implemented in mcl_playerplus @@ -468,6 +641,8 @@ mcl_enchanting.enchantments.soul_speed = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = true, + power_range_table = {{10, 25}, {20, 35}, {30, 45}}, } -- requires missing MineClone2 feature @@ -483,6 +658,8 @@ mcl_enchanting.enchantments.soul_speed = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{5, 20}, {14, 29}, {23, 38}}, }]]-- -- implemented in mcl_armor @@ -498,6 +675,8 @@ mcl_enchanting.enchantments.thorns = { curse = false, on_enchant = function() end, requires_tool = false, + treasure = false, + power_range_table = {{10, 61}, {30, 71}, {50, 81}}, } -- for tools & weapons implemented via on_enchant; for bows implemented in mcl_bows; for armor implemented in mcl_armor and mcl_tt; for fishing rods implemented in mcl_fishing @@ -520,4 +699,6 @@ mcl_enchanting.enchantments.unbreaking = { itemstack:get_meta():set_tool_capabilities(tool_capabilities) end, requires_tool = true, + treasure = false, + power_range_table = {{5, 61}, {13, 71}, {21, 81}}, } diff --git a/mods/CORE/mcl_enchanting/engine.lua b/mods/CORE/mcl_enchanting/engine.lua index fa809cfac..1202ec70d 100644 --- a/mods/CORE/mcl_enchanting/engine.lua +++ b/mods/CORE/mcl_enchanting/engine.lua @@ -1,3 +1,7 @@ +function mcl_enchanting.is_book(itemname) + return itemname == "mcl_books:book" or itemname == "mcl_enchanting:book_enchanted" +end + function mcl_enchanting.get_enchantments(itemstack) return minetest.deserialize(itemstack:get_meta():get_string("mcl_enchanting:enchantments")) or {} end @@ -5,7 +9,7 @@ end function mcl_enchanting.set_enchantments(itemstack, enchantments) itemstack:get_meta():set_string("mcl_enchanting:enchantments", minetest.serialize(enchantments)) local itemdef = itemstack:get_definition() - if itemstack:get_name() ~= "mcl_enchanting:book_enchanted" then + if not mcl_enchanting.is_book(itemstack:get_name()) then if itemdef.tool_capabilities then itemstack:get_meta():set_tool_capabilities(itemdef.tool_capabilities) end @@ -20,9 +24,6 @@ function mcl_enchanting.set_enchantments(itemstack, enchantments) end function mcl_enchanting.get_enchantment(itemstack, enchantment) - if itemstack:get_name() == "mcl_enchanting:book_enchanted" then - return 0 - end return mcl_enchanting.get_enchantments(itemstack)[enchantment] or 0 end @@ -44,22 +45,34 @@ function mcl_enchanting.get_enchanted_itemstring(itemname) return def and def._mcl_enchanting_enchanted_tool end -function mcl_enchanting.is_enchanted_def(itemname) +function mcl_enchanting.set_enchanted_itemstring(itemstack) + itemstack:set_name(mcl_enchanting.get_enchanted_itemstring(itemstack:get_name())) +end + +function mcl_enchanting.is_enchanted(itemname) return minetest.get_item_group(itemname, "enchanted") > 0 end -function mcl_enchanting.is_enchanted(itemstack) - return mcl_enchanting.is_enchanted_def(itemstack:get_name()) +function mcl_enchanting.is_enchantable(itemname) + return mcl_enchanting.get_enchantability(itemname) > 0 +end + +function mcl_enchanting.can_enchant_freshly(itemname) + return mcl_enchanting.is_enchantable(itemname) and not mcl_enchanting.is_enchanted(itemname) +end + +function mcl_enchanting.get_enchantability(itemname) + return minetest.get_item_group(itemname, "enchantability") end function mcl_enchanting.item_supports_enchantment(itemname, enchantment, early) - if itemname == "mcl_enchanting:book_enchanted" then - return true, true - end - if not early and not mcl_enchanting.get_enchanted_itemstring(itemname) then + if not mcl_enchanting.is_enchantable(itemname) then return false end local enchantment_def = mcl_enchanting.enchantments[enchantment] + if mcl_enchanting.is_book(itemname) then + return true, (not enchantment_def.treasure) + end local itemdef = minetest.registered_items[itemname] if itemdef.type ~= "tool" and enchantment_def.requires_tool then return false @@ -91,7 +104,8 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level) if itemname == "" then return false, "item missing" end - if not mcl_enchanting.item_supports_enchantment(itemstack:get_name(), enchantment) then + local supported, primary = mcl_enchanting.item_supports_enchantment(itemstack:get_name(), enchantment) + if not supported then return false, "item not supported" end if not level then @@ -107,7 +121,7 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level) if enchantment_level then return false, "incompatible", mcl_enchanting.get_enchantment_description(enchantment, enchantment_level) end - if itemname ~= "mcl_enchanting:book_enchanted" then + if not mcl_enchanting.is_book(itemname) then for incompatible in pairs(enchantment_def.incompatible) do local incompatible_level = item_enchantments[incompatible] if incompatible_level then @@ -115,11 +129,11 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level) end end end - return true + return true, nil, nil, primary end function mcl_enchanting.enchant(itemstack, enchantment, level) - itemstack:set_name(mcl_enchanting.get_enchanted_itemstring(itemstack:get_name())) + mcl_enchanting.set_enchanted_itemstring(itemstack) local enchantments = mcl_enchanting.get_enchantments(itemstack) enchantments[enchantment] = level mcl_enchanting.set_enchantments(itemstack, enchantments) @@ -130,7 +144,7 @@ function mcl_enchanting.combine(itemstack, combine_with) local itemname = itemstack:get_name() local combine_name = combine_with:get_name() local enchanted_itemname = mcl_enchanting.get_enchanted_itemstring(itemname) - if enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and combine_name ~= "mcl_enchanting:book_enchanted" then + if enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and not mcl_enchanting.is_book(itemname) then return false end local enchantments = mcl_enchanting.get_enchantments(itemstack) @@ -173,68 +187,44 @@ function mcl_enchanting.combine(itemstack, combine_with) return true end -function mcl_enchanting.initialize() - local all_groups = {} - local weighted = {} - local accum_weight = 0 - for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do - accum_weight = accum_weight + enchantment_def.weight - weighted[#weighted + 1] = {enchantment = enchantment, weight = accum_weight} - for primary in pairs(enchantment_def.primary) do - all_groups[primary] = true - end - for secondary in pairs(enchantment_def.secondary) do - all_groups[secondary] = true - end +function mcl_enchanting.enchantments_snippet(_, _, itemstack) + if not itemstack then + return end - mcl_enchanting.accumulated_weight = accum_weight - mcl_enchanting.accumulated_weight = weighted + local enchantments = mcl_enchanting.get_enchantments(itemstack) + local text = "" + for enchantment, level in pairs(enchantments) do + text = text .. mcl_enchanting.get_colorized_enchantment_description(enchantment, level) .. "\n" + end + if text ~= "" then + if not itemstack:get_definition()._tt_original_description then + text = text:sub(1, text:len() - 1) + end + return text, false + end +end + +function mcl_enchanting.initialize() local register_tool_list = {} local register_item_list = {} for itemname, itemdef in pairs(minetest.registered_items) do - if itemdef.groups.enchanted then - break - end - local quick_test = false - for group, groupv in pairs(itemdef.groups) do - if groupv > 0 and all_groups[group] then - quick_test = true - break + if mcl_enchanting.can_enchant_freshly(itemname) then + local new_name = itemname .. "_enchanted" + minetest.override_item(itemname, {_mcl_enchanting_enchanted_tool = new_name}) + local new_def = table.copy(itemdef) + new_def.inventory_image = itemdef.inventory_image .. mcl_enchanting.overlay + if new_def.wield_image then + new_def.wield_image = new_def.wield_image .. mcl_enchanting.overlay end - end - if quick_test then - if mcl_enchanting.debug then - print(itemname) - end - local expensive_test = false - for enchantment in pairs(mcl_enchanting.enchantments) do - if mcl_enchanting.item_supports_enchantment(itemname, enchantment, true) then - expensive_test = true - if mcl_enchanting.debug then - print("\tSupports " .. enchantment) - else - break - end - end - end - if expensive_test then - local new_name = itemname .. "_enchanted" - minetest.override_item(itemname, {_mcl_enchanting_enchanted_tool = new_name}) - local new_def = table.copy(itemdef) - new_def.inventory_image = itemdef.inventory_image .. "^[colorize:white:50^[colorize:purple:50" - if new_def.wield_image then - new_def.wield_image = new_def.wield_image .. "^[colorize:white:50^[colorize:purple:50" - end - new_def.groups.not_in_creative_inventory = 1 - new_def.groups.enchanted = 1 - new_def.texture = itemdef.texture or itemname:gsub("%:", "_") - new_def._mcl_enchanting_enchanted_tool = new_name - local register_list = register_item_list - if itemdef.type == "tool" then - register_list = register_tool_list - end - register_list[":" .. new_name] = new_def + new_def.groups.not_in_creative_inventory = 1 + new_def.groups.enchanted = 1 + new_def.texture = itemdef.texture or itemname:gsub("%:", "_") + new_def._mcl_enchanting_enchanted_tool = new_name + local register_list = register_item_list + if itemdef.type == "tool" then + register_list = register_tool_list end + register_list[":" .. new_name] = new_def end end for new_name, new_def in pairs(register_item_list) do @@ -244,3 +234,366 @@ function mcl_enchanting.initialize() minetest.register_tool(new_name, new_def) end end + +function mcl_enchanting.get_possible_enchantments(itemstack, enchantment_level, treasure) + local possible_enchantments, weights, accum_weight = {}, {}, 0 + for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do + local supported, _, _, primary = mcl_enchanting.can_enchant(itemstack, enchantment, 1) + if primary or treasure then + table.insert(possible_enchantments, enchantment) + accum_weight = accum_weight + enchantment_def.weight + weights[enchantment] = accum_weight + end + end + return possible_enchantments, weights, accum_weight +end + +function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance) + local itemname = itemstack:get_name() + if not mcl_enchanting.can_enchant_freshly(itemname) then + return + end + itemstack = ItemStack(itemstack) + local enchantability = minetest.get_item_group(itemname, "enchantability") + enchantability = 1 + math.random(0, math.floor(enchantability / 4)) + math.random(0, math.floor(enchantability / 4)) + enchantment_level = enchantment_level + enchantability + enchantment_level = enchantment_level + enchantment_level * (math.random() + math.random() - 1) * 0.15 + enchantment_level = math.max(math.floor(enchantment_level + 0.5), 1) + local enchantments = {} + local description + enchantment_level = enchantment_level * 2 + repeat + enchantment_level = math.floor(enchantment_level / 2) + if enchantment_level == 0 then + break + end + local possible, weights, accum_weight = mcl_enchanting.get_possible_enchantments(itemstack, enchantment_level, treasure) + local selected_enchantment, enchantment_power + if #possible > 0 then + local r = math.random(accum_weight) + for _, enchantment in ipairs(possible) do + if weights[enchantment] >= r then + selected_enchantment = enchantment + break + end + end + local enchantment_def = mcl_enchanting.enchantments[selected_enchantment] + local power_range_table = enchantment_def.power_range_table + for i = enchantment_def.max_level, 1, -1 do + local power_range = power_range_table[i] + if enchantment_level >= power_range[1] and enchantment_level <= power_range[2] then + enchantment_power = i + break + end + end + if not description then + if not enchantment_power then + return + end + description = mcl_enchanting.get_enchantment_description(selected_enchantment, enchantment_power) + end + if enchantment_power then + enchantments[selected_enchantment] = enchantment_power + mcl_enchanting.enchant(itemstack, selected_enchantment, enchantment_power) + end + else + break + end + until not no_reduced_bonus_chance and math.random() >= (enchantment_level + 1) / 50 + return enchantments, description +end + +function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance) + local enchantments = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance) + if enchantments then + mcl_enchanting.set_enchanted_itemstring(itemstack) + mcl_enchanting.set_enchantments(itemstack, enchantments) + end + return itemstack +end + +function mcl_enchanting.get_randomly_enchanted_book(enchantment_level, treasure, no_reduced_bonus_chance) + return mcl_enchanting.enchant_randomly(enchantment_level, treasure, no_reduced_bonus_chance) +end + +function mcl_enchanting.get_random_glyph_row() + local glyphs = "" + local x = 1.3 + for i = 1, 9 do + glyphs = glyphs .. "image[".. x .. ",0.1;0.5,0.5;mcl_enchanting_glyph_" .. math.random(18) .. ".png^[colorize:#675D49:255]" + x = x + 0.6 + end + return glyphs +end + +function mcl_enchanting.generate_random_table_slots(itemstack, num_bookshelves) + local base = math.random(8) + math.floor(num_bookshelves / 2) + math.random(0, num_bookshelves) + local required_levels = { + math.max(base / 3, 1), + (base * 2) / 3 + 1, + math.max(base, num_bookshelves * 2) + } + local slots = {} + for i, enchantment_level in ipairs(required_levels) do + local slot = false + local enchantments, description = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level) + if enchantments then + slot = { + enchantments = enchantments, + description = description, + glyphs = mcl_enchanting.get_random_glyph_row(), + level_requirement = math.max(i, math.floor(enchantment_level)), + } + end + slots[i] = slot + end + return slots +end + +function mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) + if not mcl_enchanting.can_enchant_freshly(itemstack:get_name()) then + return {false, false, false} + end + local itemname = itemstack:get_name() + local meta = player:get_meta() + local player_slots = minetest.deserialize(meta:get_string("mcl_enchanting:slots")) or {} + local player_bookshelves_slots = player_slots[num_bookshelves] or {} + local player_bookshelves_item_slots = player_bookshelves_slots[itemname] + if player_bookshelves_item_slots then + return player_bookshelves_item_slots + else + player_bookshelves_item_slots = mcl_enchanting.generate_random_table_slots(itemstack, num_bookshelves) + if player_bookshelves_item_slots then + player_bookshelves_slots[itemname] = player_bookshelves_item_slots + player_slots[num_bookshelves] = player_bookshelves_slots + meta:set_string("mcl_enchanting:slots", minetest.serialize(player_slots)) + return player_bookshelves_item_slots + else + return {false, false, false} + end + end +end + +function mcl_enchanting.reset_table_slots(player) + player:get_meta():set_string("mcl_enchanting:slots", "") +end + +function mcl_enchanting.show_enchanting_formspec(player) + local C = minetest.get_color_escape_sequence + local name = player:get_player_name() + local meta = player:get_meta() + local inv = player:get_inventory() + local num_bookshelves = meta:get_int("mcl_enchanting:num_bookshelves") + local table_name = meta:get_string("mcl_enchanting:table_name") + local formspec = "" + .. "size[9.07,8.6;]" + .. "formspec_version[3]" + .. "label[0,0;" .. C("#313131") .. table_name .. "]" + .. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1) + .. "list[detached:" .. name .. "_enchanting;enchanting;0.2,2.4;1,1;1]" + .. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1) + .. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]" + .. "list[detached:" .. name .. "_enchanting;enchanting;1.1,2.4;1,1;2]" + .. "label[0,4;" .. C("#313131") .. "Inventory]" + .. mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3) + .. mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1) + .. "list[current_player;main;0,4.5;9,3;9]" + .. "listring[detached:" .. name .. "_enchanting;enchanting]" + .. "listring[current_player;main]" + .. "list[current_player;main;0,7.74;9,1;]" + .. "real_coordinates[true]" + .. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]" + local itemstack = inv:get_stack("enchanting_item", 1) + local player_levels = mcl_experience.get_player_xp_level(player) + local y = 0.65 + local any_enchantment = false + local table_slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) + for i, slot in ipairs(table_slots) do + any_enchantment = any_enchantment or slot + local enough_lapis = inv:contains_item("enchanting_lapis", ItemStack({name = "mcl_dye:blue", count = i})) + local enough_levels = slot and slot.level_requirement <= player_levels + local can_enchant = (slot and enough_lapis and enough_levels) + local ending = (can_enchant and "" or "_off") + local hover_ending = (can_enchant and "_hovered" or "_off") + formspec = formspec + .. "container[3.2," .. y .. "]" + .. (slot and "tooltip[button_" .. i .. ";" .. C("#818181") .. slot.description .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and "#818181" or "#FC5454") .. i .. " Lapis Lazuli\n" .. C("#818181") .. i .. " Enchantment Levels" or C("#FC5454") .. "Level Requirement: " .. slot.level_requirement) .. "]" or "") + .. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" + .. "button[0,0;7.5,1.3;button_" .. i .. ";]" + .. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") + .. (slot and "label[7.2,1.1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "") + .. (slot and slot.glyphs or "") + .. "container_end[]" + y = y + 1.35 + end + formspec = formspec + .. "image[" .. (any_enchantment and 0.58 or 1.15) .. ",1.2;" .. (any_enchantment and 2 or 0.87) .. ",1.43;mcl_enchanting_book_" .. (any_enchantment and "open" or "closed") .. ".png]" + minetest.show_formspec(name, "mcl_enchanting:table", formspec) +end + +function mcl_enchanting.handle_formspec_fields(player, formname, fields) + if formname == "mcl_enchanting:table" then + local button_pressed + for i = 1, 3 do + if fields["button_" .. i] then + button_pressed = i + end + end + if not button_pressed then return end + local name = player:get_player_name() + local inv = player:get_inventory() + local meta = player:get_meta() + local num_bookshelfes = meta:get_int("mcl_enchanting:num_bookshelves") + local itemstack = inv:get_stack("enchanting_item", 1) + local cost = ItemStack({name = "mcl_dye:blue", count = button_pressed}) + if not inv:contains_item("enchanting_lapis", cost) then + return + end + local slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelfes) + local slot = slots[button_pressed] + if not slot then + return + end + local player_level = mcl_experience.get_player_xp_level(player) + if player_level < slot.level_requirement then + return + end + mcl_experience.set_player_xp_level(player, player_level - button_pressed) + inv:remove_item("enchanting_lapis", cost) + mcl_enchanting.set_enchanted_itemstring(itemstack) + mcl_enchanting.set_enchantments(itemstack, slot.enchantments) + inv:set_stack("enchanting_item", 1, itemstack) + minetest.sound_play("mcl_enchanting_enchant", {to_player = name, gain = 5.0}) + mcl_enchanting.reset_table_slots(player) + mcl_enchanting.reload_inventory(player) + mcl_enchanting.show_enchanting_formspec(player) + end +end + +function mcl_enchanting.initialize_player(player) + local player_inv = player:get_inventory() + player_inv:set_size("enchanting_lapis", 1) + player_inv:set_size("enchanting_item", 1) + local name = player:get_player_name() + local detached_inv = minetest.create_detached_inventory(name .. "_enchanting", { + allow_put = function(inv, listname, index, stack, player) + if player:get_player_name() ~= name then + return 0 + end + if stack:get_name() == "mcl_dye:blue" and index ~= 2 then + return math.min(inv:get_stack(listname, 3):get_free_space(), stack:get_count()) + elseif index ~= 3 and inv:get_stack(listname, 2):get_count() == 0 then + return 1 + else + return 0 + end + end, + allow_take = function(inv, listname, index, stack, player) + if player:get_player_name() ~= name or index == 1 then + return 0 + end + return stack:get_count() + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + on_put = function(inv, listname, index, stack, player) + local result_list + if index == 1 then + if stack:get_name() == "mcl_dye:blue" then + result_list = "lapis" + stack:add_item(inv:get_stack(listname, 3)) + inv:set_stack(listname, 1, nil) + inv:set_stack(listname, 3, stack) + else + result_list = "item" + inv:set_stack(listname, 1, nil) + inv:set_stack(listname, 2, stack) + end + elseif index == 2 then + result_list = "item" + elseif index == 3 then + result_list = "lapis" + stack = inv:get_stack(listname, 3) + end + player:get_inventory():set_stack("enchanting_" .. result_list, 1, stack) + mcl_enchanting.show_enchanting_formspec(player) + end, + on_take = function(inv, listname, index, stack, player) + local result_list + if index == 2 then + result_list = "item" + elseif index == 3 then + result_list = "lapis" + end + player:get_inventory():set_stack("enchanting_" .. result_list, 1, nil) + mcl_enchanting.show_enchanting_formspec(player) + end + }, name) + detached_inv:set_size("enchanting", 3) + mcl_enchanting.reload_inventory(player) +end + +function mcl_enchanting.reload_inventory(player) + local player_inv = player:get_inventory() + local detached_inv = minetest.get_inventory({type = "detached", name = player:get_player_name() .. "_enchanting"}) + detached_inv:set_stack("enchanting", 2, player_inv:get_stack("enchanting_item", 1)) + detached_inv:set_stack("enchanting", 3, player_inv:get_stack("enchanting_lapis", 1)) +end + +function mcl_enchanting.schedule_book_animation(self, anim) + self.scheduled_anim = {timer = self.anim_length, anim = anim} +end + +function mcl_enchanting.set_book_animation(self, anim) + local anim_index = mcl_enchanting.book_animations[anim] + local start, stop = mcl_enchanting.book_animation_steps[anim_index], mcl_enchanting.book_animation_steps[anim_index + 1] + self.object:set_animation({x = start, y = stop}, mcl_enchanting.book_animation_speed) + self.scheduled_anim = nil + self.anim_length = (stop - start) / 40 +end + +function mcl_enchanting.check_animation_schedule(self, dtime) + local schedanim = self.scheduled_anim + if schedanim then + schedanim.timer = schedanim.timer - dtime + if schedanim.timer <= 0 then + mcl_enchanting.set_book_animation(self, schedanim.anim) + end + end +end + +function mcl_enchanting.look_at(self, pos2) + local pos1 = self.object:get_pos() + local vec = vector.subtract(pos1, pos2) + local yaw = math.atan(vec.z / vec.x) - math.pi/2 + yaw = yaw + (pos1.x >= pos2.x and math.pi or 0) + self.object:set_yaw(yaw + math.pi) +end + +function mcl_enchanting.check_book(pos) + local obj_pos = vector.add(pos, mcl_enchanting.book_offset) + for _, obj in pairs(minetest.get_objects_inside_radius(obj_pos, 0.1)) do + local luaentity = obj:get_luaentity() + if luaentity and luaentity.name == "mcl_enchanting:book" then + if minetest.get_node(pos).name ~= "mcl_enchanting:table" then + obj:remove() + end + return + end + end + minetest.add_entity(obj_pos, "mcl_enchanting:book") +end + +function mcl_enchanting.get_bookshelves(pos) + local absolute, relative = {}, {} + for i, rp in ipairs(mcl_enchanting.bookshelf_positions) do + local airp = vector.add(pos, mcl_enchanting.air_positions[i]) + local ap = vector.add(pos, rp) + if minetest.get_node(ap).name == "mcl_books:bookshelf" and minetest.get_node(airp).name == "air" then + table.insert(absolute, ap) + table.insert(relative, rp) + end + end + return absolute, relative +end diff --git a/mods/CORE/mcl_enchanting/init.lua b/mods/CORE/mcl_enchanting/init.lua index f0f7a9513..d1f351b62 100644 --- a/mods/CORE/mcl_enchanting/init.lua +++ b/mods/CORE/mcl_enchanting/init.lua @@ -2,21 +2,265 @@ local modpath = minetest.get_modpath("mcl_enchanting") mcl_enchanting = { book_offset = vector.new(0, 0.75, 0), + book_animations = {["close"] = 1, ["opening"] = 2, ["open"] = 3, ["closing"] = 4}, + book_animation_steps = {0, 640, 680, 700, 740}, + book_animation_speed = 40, roman_numerals = dofile(modpath .. "/roman_numerals.lua"), -- https://exercism.io/tracks/lua/exercises/roman-numerals/solutions/73c2fb7521e347209312d115f872fa49 enchantments = {}, - weighted_enchantments = {}, - accumulated_weight = 0, - debug = false, + overlay = "^[colorize:white:50^[colorize:purple:50", + bookshelf_positions = { + {x = -2, y = 0, z = -2}, {x = -2, y = 1, z = -2}, + {x = -1, y = 0, z = -2}, {x = -1, y = 1, z = -2}, + {x = 0, y = 0, z = -2}, {x = 0, y = 1, z = -2}, + {x = 1, y = 0, z = -2}, {x = 1, y = 1, z = -2}, + {x = 2, y = 0, z = -2}, {x = 2, y = 1, z = -2}, + {x = -2, y = 0, z = 2}, {x = -2, y = 1, z = 2}, + {x = -1, y = 0, z = 2}, {x = -1, y = 1, z = 2}, + {x = 0, y = 0, z = 2}, {x = 0, y = 1, z = 2}, + {x = 1, y = 0, z = 2}, {x = 1, y = 1, z = 2}, + {x = 2, y = 0, z = 2}, {x = 2, y = 1, z = 2}, + -- {x = -2, y = 0, z = -2}, {x = -2, y = 1, z = -2}, + {x = -2, y = 0, z = -1}, {x = -2, y = 1, z = -1}, + {x = -2, y = 0, z = 0}, {x = -2, y = 1, z = 0}, + {x = -2, y = 0, z = 1}, {x = -2, y = 1, z = 1}, + {x = -2, y = 0, z = 2}, {x = -2, y = 1, z = 2}, + {x = 2, y = 0, z = -2}, {x = 2, y = 1, z = -2}, + {x = 2, y = 0, z = -1}, {x = 2, y = 1, z = -1}, + {x = 2, y = 0, z = 0}, {x = 2, y = 1, z = 0}, + {x = 2, y = 0, z = 1}, {x = 2, y = 1, z = 1}, + -- {x = 2, y = 0, z = 2}, {x = 2, y = 1, z = 2}, + }, + air_positions = { + {x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1}, + {x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1}, + {x = 0, y = 0, z = -1}, {x = 0, y = 1, z = -1}, + {x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1}, + {x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1}, + {x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1}, + {x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1}, + {x = 0, y = 0, z = 1}, {x = 0, y = 1, z = 1}, + {x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1}, + {x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1}, + -- {x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1}, + {x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1}, + {x = -1, y = 0, z = 0}, {x = -1, y = 1, z = 0}, + {x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1}, + {x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1}, + {x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1}, + {x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1}, + {x = 1, y = 0, z = 0}, {x = 1, y = 1, z = 0}, + {x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1}, + -- {x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1}, + }, } dofile(modpath .. "/engine.lua") dofile(modpath .. "/enchantments.lua") -dofile(modpath .. "/command.lua") -dofile(modpath .. "/tt.lua") -dofile(modpath .. "/book.lua") --- dofile(modpath .. "/ui.lua") --- dofile(modpath .. "/fx.lua") --- dofile(modpath .. "/book.lua") --- dofile(modpath .. "/table.lua") + +minetest.register_chatcommand("enchant", { + description = "Enchant an item.", + params = " []", + privs = {give = true}, + func = function(_, param) + local sparam = param:split(" ") + local target_name = sparam[1] + local enchantment = sparam[2] + local level_str = sparam[3] + local level = tonumber(level_str or "1") + if not target_name or not enchantment then + return false, "Usage: /enchant []" + end + local target = minetest.get_player_by_name(target_name) + if not target then + return false, "Player '" .. target_name .. "' cannot be found" + end + local itemstack = target:get_wielded_item() + local can_enchant, errorstring, extra_info = mcl_enchanting.can_enchant(itemstack, enchantment, level) + if not can_enchant then + if errorstring == "enchantment invalid" then + return false, "There is no such enchantment '" .. enchantment .. "'" + elseif errorstring == "item missing" then + return false, "The target doesn't hold an item" + elseif errorstring == "item not supported" then + return false, "The selected enchantment can't be added to the target item" + elseif errorstring == "level invalid" then + return false, "'" .. level_str .. "' is not a valid number" + elseif errorstring == "level too high" then + return false, "The number you have entered (" .. level_str .. ") is too big, it must be at most " .. extra_info + elseif errorstring == "level too small" then + return false, "The number you have entered (" .. level_str .. ") is too small, it must be at least " .. extra_info + elseif errorstring == "incompatible" then + return false, mcl_enchanting.get_enchantment_description(enchantment, level) .. " can't be combined with " .. extra_info + end + else + target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level)) + return true, "Enchanting succeded" + end + end +}) + +minetest.register_chatcommand("forceenchant", { + description = "Forcefully enchant an item.", + params = " []", + func = function(_, param) + local sparam = param:split(" ") + local target_name = sparam[1] + local enchantment = sparam[2] + local level_str = sparam[3] + local level = tonumber(level_str or "1") + if not target_name or not enchantment then + return false, "Usage: /forceenchant []" + end + local target = minetest.get_player_by_name(target_name) + if not target then + return false, "Player '" .. target_name .. "' cannot be found" + end + local itemstack = target:get_wielded_item() + local can_enchant, errorstring, extra_info = mcl_enchanting.can_enchant(itemstack, enchantment, level) + if errorstring == "enchantment invalid" then + return false, "There is no such enchantment '" .. enchantment .. "'" + elseif errorstring == "item missing" then + return false, "The target doesn't hold an item" + elseif errorstring == "item not supported" and not mcl_enchanting.is_enchantable(itemstack:get_name()) then + return false, "The target item is not enchantable" + elseif errorstring == "level invalid" then + return false, "'" .. level_str .. "' is not a valid number" + else + target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level)) + return true, "Enchanting succeded" + end + end +}) + +minetest.register_craftitem("mcl_enchanting:book_enchanted", { + description = "Enchanted Book", + inventory_image = "mcl_enchanting_book_enchanted.png" .. mcl_enchanting.overlay, + groups = {enchanted = 1, not_in_creative_inventory = 1, enchantability = 1}, + _mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted", + stack_max = 1, +}) + +minetest.register_entity("mcl_enchanting:book", { + initial_properties = { + visual = "mesh", + mesh = "mcl_enchanting_book.b3d", + visual_size = {x = 12.5, y = 12.5}, + collisionbox = {0, 0, 0}, + physical = false, + textures = {"mcl_enchanting_book_entity.png"}, + }, + player_near = false, + on_activate = function(self) + self.object:set_armor_groups({immortal = 1}) + mcl_enchanting.set_book_animation(self, "close") + mcl_enchanting.check_book(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset)) + end, + on_step = function(self, dtime) + local old_player_near = self.player_near + local player_near = false + local player + for _, obj in ipairs(minetest.get_objects_inside_radius(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset), 2.5)) do + if obj:is_player() then + player_near = true + player = obj + end + end + if player_near and not old_player_near then + mcl_enchanting.set_book_animation(self, "opening") + mcl_enchanting.schedule_book_animation(self, "open") + elseif old_player_near and not player_near then + mcl_enchanting.set_book_animation(self, "closing") + mcl_enchanting.schedule_book_animation(self, "close") + end + if player then + mcl_enchanting.look_at(self, player:get_pos()) + end + self.player_near = player_near + mcl_enchanting.check_animation_schedule(self, dtime) + end, +}) + +minetest.register_node("mcl_enchanting:table", { + description = "Enchanting Table", + drawtype = "nodebox", + tiles = {"mcl_enchanting_table_top.png", "mcl_enchanting_table_bottom.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png"}, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0.25, 0.5}, + }, + sounds = mcl_sounds.node_sound_stone_defaults(), + groups = {pickaxey = 2}, + on_rotate = (rawget(_G, "screwdriver") or {}).rotate_simple, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local player_meta = clicker:get_meta() + local table_meta = minetest.get_meta(pos) + local num_bookshelves = table_meta:get_int("mcl_enchanting:num_bookshelves") + local table_name = table_meta:get_string("name") + if table_name == "" then + table_name = "Enchant" + end + player_meta:set_int("mcl_enchanting:num_bookshelves", num_bookshelves) + player_meta:set_string("mcl_enchanting:table_name", table_name) + mcl_enchanting.show_enchanting_formspec(clicker) + end, + on_construct = function(pos) + minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book") + end, + on_destruct = function(pos) + local itemstack = ItemStack("mcl_enchanting:table") + local meta = minetest.get_meta(pos) + local itemmeta = itemstack:get_meta() + itemmeta:set_string("name", meta:get_string("name")) + itemmeta:set_string("description", meta:get_string("description")) + minetest.add_item(pos, itemstack) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local itemmeta = itemstack:get_meta() + meta:set_string("name", itemmeta:get_string("name")) + meta:set_string("description", itemmeta:get_string("description")) + end, + after_destruct = mcl_enchanting.check_table, + drop = "", + _mcl_blast_resistance = 1200, + _mcl_hardness = 5, +}) + +minetest.register_craft({ + output = "mcl_enchanting:table", + recipe = { + {"", "mcl_books:book", ""}, + {"mcl_core:diamond", "mcl_core:obsidian", "mcl_core:diamond"}, + {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"} + } +}) + +minetest.register_abm({ + name = "Enchanting table bookshelf particles", + interval = 1, + chance = 1, + nodenames = "mcl_enchanting:table", + action = function(pos) + mcl_enchanting.check_book(pos) + local absolute, relative = mcl_enchanting.get_bookshelves(pos) + for i, ap in ipairs(absolute) do + if math.random(10) == 1 then + local rp = relative[i] + minetest.add_particle({ + pos = ap, + velocity = vector.subtract(vector.new(0, 5, 0), rp), + acceleration = {x = 0, y = -9.81, z = 0}, + expirationtime = 2, + size = 2, + texture = "mcl_enchanting_glyph_" .. math.random(18) .. ".png" + }) + end + end + minetest.get_meta(pos):set_int("mcl_enchanting:num_bookshelves", math.min(15, #absolute)) + end +}) minetest.register_on_mods_loaded(mcl_enchanting.initialize) +minetest.register_on_joinplayer(mcl_enchanting.initialize_player) +minetest.register_on_player_receive_fields(mcl_enchanting.handle_formspec_fields) +table.insert(tt.registered_snippets, 1, mcl_enchanting.enchantments_snippet) diff --git a/mods/CORE/mcl_enchanting/mod.conf b/mods/CORE/mcl_enchanting/mod.conf index fef460ab1..ac4dad644 100644 --- a/mods/CORE/mcl_enchanting/mod.conf +++ b/mods/CORE/mcl_enchanting/mod.conf @@ -1,5 +1,5 @@ name = mcl_enchanting -description = The rewrite of the Enchanting mod for MineClone2 -depends = mcl_formspec, tt, mcl_books, walkover +description = Enchanting for MineClone2 +depends = tt, walkover, mcl_sounds optional_depends = screwdriver author = Fleckenstein diff --git a/mods/CORE/mcl_enchanting/table.lua b/mods/CORE/mcl_enchanting/table.lua deleted file mode 100644 index fde16f848..000000000 --- a/mods/CORE/mcl_enchanting/table.lua +++ /dev/null @@ -1,189 +0,0 @@ -local enchanting_table_formspec = "" - .. "size[9.07,8.6;]" - .. "formspec_version[3]" - .. "label[0,0;" .. minetest.formspec_escape(minetest.colorize("#313131", "Enchant")) .. "]" - .. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1) - .. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]" - .. "list[context;lapis;1.1,2.4;1,1;]" - .. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1) - .. "list[context;tool;0.2,2.4;1,1;]" - .. "label[0,4;" .. minetest.formspec_escape(minetest.colorize("#313131", "Inventory")) .. "]" - .. mcl_formspec.get_itemslot_bg(0,4.5,9,3) - .. mcl_formspec.get_itemslot_bg(0,7.74,9,1) - .. "list[current_player;main;0,4.5;9,3;9]" - .. "listring[]" - .. "list[current_player;main;0,7.74;9,1;]" - .. "real_coordinates[true]" - .. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]" - -local bookshelf_positions = {{x = 1}, {x = -1}, {z = 1}, {z = -1}} - -for _, p in pairs(bookshelf_positions) do - for _, d in pairs({"x", "y", "z"}) do - p[d] = p[d] or 0 - end -end - -minetest.register_abm({ - name = "Enchanting table bookshelf particles", - interval = 0.1, - chance = 1, - nodenames = "mcl_books:bookshelf", - action = function(pos) - for _, relative_pos in pairs(bookshelf_positions) do - if minetest.get_node(vector.add(pos, vector.multiply(relative_pos, 2))).name == "mcl_enchanting:table" and minetest.get_node(vector.add(pos, relative_pos, 2)).name == "air" then - minetest.add_particle({ - pos = pos, - velocity = vector.subtract(relative_pos, vector.new(0, -2, 0)), - acceleration = {x = 0, y = -2, z = 0}, - expirationtime = 2, - size = 2, - texture = "mcl_enchanting_glyph_" .. math.random(18) .. ".png" - }) - end - end - end -}) - - -function mcl_enchanting.update_formspec(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local full_tool_name = inv:get_stack("tool", 1):get_name() - local shortened_tool_name = mcl_enchanting.all_tools[full_tool_name] - local supported_enchantments = (shortened_tool_name and mcl_enchanting.tools[shortened_tool_name].enchantments or {}) - local sup_ench = false - local formspec = enchanting_table_formspec - local e_list = minetest.deserialize(meta:get_string("enchantments")) - local y = 0.65 - for i, e in pairs(e_list) do - local enchantment_supported = table.indexof(supported_enchantments, e.enchantment) ~= -1 - sup_ench = sup_ench or enchantment_supported - local enough_lapis = inv:contains_item("lapis", ItemStack(mcl_enchanting.lapis_itemstring .. " " .. e.cost)) - local ending = (enough_lapis and enchantment_supported and "" or "_off") - local hover_ending = (enough_lapis and enchantment_supported and "_hovered" or "_off") - formspec = formspec - .. "container[3.2," .. y .. "]" - .. (enchantment_supported and "tooltip[button_" .. i .. ";" .. C("#818181") .. mcl_enchanting.get_enchantment_description(e.enchantment, e.level) .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. C(enough_lapis and "#818181" or "#FC5454") .. e.cost .. " Lapis Lazuli" .. "]" or "") - .. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" - .. "button[0,0;7.5,1.3;button_" .. i .. ";]" - .. (enchantment_supported and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") - .. (enchantment_supported and e.glyphs or "") - .. "container_end[]" - y = y + 1.35 - end - formspec = formspec - .. "image[" .. (sup_ench and 0.58 or 1.15) .. ",1.2;" .. (sup_ench and 2 or 0.87) .. ",1.43;mcl_enchanting_book_" .. (sup_ench and "open" or "closed") .. ".png]" - meta:set_string("formspec", formspec) -end - -function mcl_enchanting.progress_formspec_input(pos, _, fields, player) - if fields.quit then - return - end - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local e_list = minetest.deserialize(meta:get_string("enchantments")) - local button_pressed - for i = 1, 3 do - if fields["button_" .. i] then - button_pressed = i - end - end - if not button_pressed then return end - local e = e_list[button_pressed] - local lapis_cost = ItemStack(mcl_enchanting.lapis_itemstring .. " " .. e.cost) - if not inv:contains_item("lapis", lapis_cost) then return end - local tool_stack = inv:get_stack("tool", 1) - local full_tool_name = tool_stack:get_name() - local shortened_tool_name = mcl_enchanting.all_tools[full_tool_name] - if not shortened_tool_name then return end - if table.indexof(mcl_enchanting.tools[shortened_tool_name].enchantments, e.enchantment) == -1 then return end - local wear = tool_stack:get_wear() - inv:remove_item("lapis", lapis_cost) - local enchanted_tool_stack = ItemStack(full_tool_name .. "_enchanted_" .. e.enchantment .. "_" .. e.level) - enchanted_tool_stack:add_wear(tool_stack:get_wear()) - inv:set_stack("tool", 1, enchanted_tool_stack) - minetest.sound_play("mcl_enchanting_enchant", {to_player = player:get_player_name(), gain = 5.0}) - mcl_enchanting.add_enchantments(pos) -end - - -function mcl_enchanting.drop_inventory(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for _, listname in ipairs({"tool", "lapis"}) do - local stack = inv:get_stack(listname, 1) - if not stack:is_empty() then - minetest.add_item(vector.add(pos, {x = math.random(0, 10) / 10 - 0.5, y = 0, z = math.random(0, 10) / 10 - 0.5}), stack) - end - end -end - -function mcl_enchanting.init_table(pos) - local inv = minetest.get_meta(pos):get_inventory() - inv:set_size("tool", 1) - inv:set_size("lapis", 1) - mcl_enchanting.add_enchantments(pos) - minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book") -end - -function mcl_enchanting.add_enchantments_to_table(pos) - local meta = minetest.get_meta(pos) - local e_list = {} - for i = 1, 3 do - local e = {} - e.cost = math.random(mcl_enchanting.max_cost) - e.enchantment = mcl_enchanting.enchantment_name_list[math.random(#mcl_enchanting.enchantment_name_list)] - local max_level = mcl_enchanting.enchantments[e.enchantment].max_level - e.level = max_level + 1 - math.ceil(math.pow(math.random(math.pow(max_level, mcl_enchanting.level_rarity_grade)), 1 / mcl_enchanting.level_rarity_grade)) - e.glyphs = "" - local x = 1.3 - for i = 1, 9 do - e.glyphs = e.glyphs .. "image[".. x .. ",0.1;0.5,0.5;mcl_enchanting_glyph_" .. math.random(18) .. ".png^[colorize:#675D49:255]" - x = x + 0.6 - end - e_list[i] = e - end - meta:set_string("enchantments", minetest.serialize(e_list)) - mcl_enchanting.update_formspec(pos) -end - -minetest.register_node("mcl_enchanting:table", { - description = "Enchanting Table", - drawtype = "nodebox", - tiles = {"mcl_enchanting_table_top.png", "mcl_enchanting_table_bottom.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png"}, - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 0.25, 0.5}, - }, - sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {pickaxey = 2}, - _mcl_blast_resistance = 1200, - _mcl_hardness = 5, - on_rotate = (screwdriver or {}).rotate_simple, - on_construct = mcl_enchanting.init_table, - on_destruct = mcl_enchanting.drop_inventory, - after_destruct = mcl_enchanting.check_book, - on_receive_fields = mcl_enchanting.progress_formspec_input, - on_metadata_inventory_put = mcl_enchanting.update_formspec, - on_metadata_inventory_take = mcl_enchanting.update_formspec, - allow_metadata_inventory_put = function(_, listname, _, stack) - if listname == "lapis" then - return (stack:get_name() == mcl_enchanting.lapis_itemstring) and stack:get_count() or 0 - end - return 1 - end, - allow_metadata_inventory_move = function() - return 0 - end, -}) - -minetest.register_craft({ - output = "mcl_enchanting:table", - recipe = { - {"", "mcl_books:book", ""}, - {"mcl_core:diamond", "mcl_core:obsidian", "mcl_core:diamond"}, - {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"} - } -}) diff --git a/mods/CORE/mcl_enchanting/table_book.lua b/mods/CORE/mcl_enchanting/table_book.lua deleted file mode 100644 index 132fb880b..000000000 --- a/mods/CORE/mcl_enchanting/table_book.lua +++ /dev/null @@ -1,87 +0,0 @@ -local book_animations = {["close"] = 1, ["opening"] = 2, ["open"] = 3, ["closing"] = 4} -local book_animation_steps = {0, 640, 680, 700, 740} -local book_animation_speed = 40 - -function mcl_enchanting.schedule_book_animation(self, anim) - self.scheduled_anim = {timer = self.anim_length, anim = anim} -end - -function mcl_enchanting.set_book_animation(self, anim) - local anim_index = book_animations[anim] - local start, stop = book_animation_steps[anim_index], book_animation_steps[anim_index + 1] - self.object:set_animation({x = start, y = stop}, book_animation_speed) - self.scheduled_anim = nil - self.anim_length = (stop - start) / 40 -end - -function mcl_enchanting.check_animation_schedule(self, dtime) - local schedanim = self.scheduled_anim - if schedanim then - schedanim.timer = schedanim.timer - dtime - if schedanim.timer <= 0 then - mcl_enchanting.set_book_animation(self, schedanim.anim)local pos1=self.object:get_pos() - end - end -end - -function mcl_enchanting.look_at(self, pos2) - local pos1 = self.object:get_pos() - local vec = vector.subtract(pos1, pos2) - local yaw = math.atan(vec.z / vec.x) - math.pi/2 - yaw = yaw + (pos1.x >= pos2.x and math.pi or 0) - self.object:set_yaw(yaw + math.pi) -end - -function mcl_enchanting.check_book(pos) - local obj_pos = vector.add(pos, mcl_enchanting.book_offset) - for _, obj in pairs(minetest.get_objects_inside_radius(obj_pos, 0.1)) do - local luaentity = obj:get_luaentity() - if luaentity and luaentity.name == "mcl_enchanting:book" then - if minetest.get_node(pos).name ~= "mcl_enchanting:table" then - obj:remove() - end - return - end - end - minetest.add_entity(obj_pos, "mcl_enchanting:book") -end - -minetest.register_entity("mcl_enchanting:book", { - initial_properties = { - visual = "mesh", - mesh = "mcl_enchanting_book.b3d", - visual_size = {x = 12.5, y = 12.5}, - collisionbox = {0, 0, 0}, - physical = false, - textures = {"mcl_enchanting_book_entity.png"}, - }, - player_near = false, - on_activate = function(self) - self.object:set_armor_groups({immortal = 1}) - mcl_enchanting.set_book_animation(self, "close") - mcl_enchanting.check_book(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset)) - end, - on_step = function(self, dtime) - local old_player_near = self.player_near - local player_near = false - local player - for _, obj in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), 2.5)) do - if obj:is_player() then - player_near = true - player = obj - end - end - if player_near and not old_player_near then - mcl_enchanting.set_book_animation(self, "opening") - mcl_enchanting.schedule_book_animation(self, "open") - elseif old_player_near and not player_near then - mcl_enchanting.set_book_animation(self, "closing") - mcl_enchanting.schedule_book_animation(self, "close") - end - if player then - mcl_enchanting.look_at(self, player:get_pos()) - end - self.player_near = player_near - mcl_enchanting.check_animation_schedule(self, dtime) - end, -}) diff --git a/mods/CORE/mcl_enchanting/tt.lua b/mods/CORE/mcl_enchanting/tt.lua deleted file mode 100644 index e6529b058..000000000 --- a/mods/CORE/mcl_enchanting/tt.lua +++ /dev/null @@ -1,18 +0,0 @@ -function mcl_enchanting.enchantments_snippet(_, _, itemstack) - if not itemstack then - return - end - local enchantments = mcl_enchanting.get_enchantments(itemstack) - local text = "" - for enchantment, level in pairs(enchantments) do - text = text .. mcl_enchanting.get_colorized_enchantment_description(enchantment, level) .. "\n" - end - if text ~= "" then - if not itemstack:get_definition()._tt_original_description then - text = text:sub(1, text:len() - 1) - end - return text, false - end -end - -table.insert(tt.registered_snippets, 1, mcl_enchanting.enchantments_snippet) diff --git a/mods/HELP/tt/init.lua b/mods/HELP/tt/init.lua index aa42290bb..f23778b6c 100644 --- a/mods/HELP/tt/init.lua +++ b/mods/HELP/tt/init.lua @@ -14,22 +14,6 @@ dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets.lua") -- Apply item description updates -local function equals(t1, t2) - for k, v in pairs(t1) do - local equal - local v2 = rawget(t2, k) - if type(v) == "table" then - equal = equals(v, v2) - else - equal = (v == v2) - end - if not equal then - return false - end - end - return true -end - local function apply_snippets(desc, itemstring, toolcaps, itemstack) local first = true -- Apply snippets @@ -80,10 +64,9 @@ tt.reload_itemstack_description = function(itemstack) if def and def._mcl_generate_description then def._mcl_generate_description(itemstack) elseif should_change(itemstring, def) and meta:get_string("name") == "" then - local toolcaps = itemstack:get_tool_capabilities() - local hand_toolcaps = ItemStack(""):get_tool_capabilities() - if equals(toolcaps, hand_toolcaps) then - toolcaps = nil + local toolcaps + if def.tool_capabilities then + toolcaps = itemstack:get_tool_capabilities() end local orig_desc = def._tt_original_description or def.description local desc = apply_snippets(orig_desc, itemstring, toolcaps or def.tool_capabilities, itemstack) diff --git a/mods/HUD/mcl_inventory/depends.txt b/mods/HUD/mcl_inventory/depends.txt index cf04c75ef..27231e5df 100644 --- a/mods/HUD/mcl_inventory/depends.txt +++ b/mods/HUD/mcl_inventory/depends.txt @@ -5,3 +5,4 @@ _mcl_autogroup? mcl_armor? mcl_brewing? mcl_potions? +mcl_enchanting diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index c358754f4..a4bd0e167 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -8,7 +8,7 @@ local mod_player = minetest.get_modpath("mcl_player") ~= nil local mod_craftguide = minetest.get_modpath("mcl_craftguide") ~= nil -- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left -local function return_item(itemstack, dropper, pos, inv) +function return_item(itemstack, dropper, pos, inv) if dropper:is_player() then -- Return to main inventory if inv:room_for_item("main", itemstack) then @@ -36,9 +36,11 @@ local function return_item(itemstack, dropper, pos, inv) end -- Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left -local function return_fields(player, name) +function return_fields(player, name) local inv = player:get_inventory() - for i,stack in ipairs(inv:get_list(name)) do + local list = inv:get_list(name) + if not list then return end + for i,stack in ipairs(list) do return_item(stack, player, player:get_pos(), inv) stack:clear() inv:set_stack(name, i, stack) @@ -137,6 +139,9 @@ end minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit then return_fields(player,"craft") + return_fields(player,"enchanting_lapis") + return_fields(player,"enchanting_item") + mcl_enchanting.reload_inventory(player) if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then set_inventory(player) end @@ -152,6 +157,8 @@ end -- Drop crafting grid items on leaving minetest.register_on_leaveplayer(function(player) return_fields(player, "craft") + return_fields(player, "enchanting_lapis") + return_fields(player, "enchanting_item") end) minetest.register_on_joinplayer(function(player) @@ -189,6 +196,8 @@ minetest.register_on_joinplayer(function(player) when the server has been shutdown and the server didn't clean up the player inventories. ]] return_fields(player, "craft") + return_fields(player, "enchanting_item") + return_fields(player, "enchanting_lapis") end) if minetest.is_creative_enabled("") then diff --git a/mods/ITEMS/mcl_armor/armor.lua b/mods/ITEMS/mcl_armor/armor.lua index 0c57186b7..69801d010 100644 --- a/mods/ITEMS/mcl_armor/armor.lua +++ b/mods/ITEMS/mcl_armor/armor.lua @@ -137,7 +137,7 @@ armor.set_player_armor = function(self, player) local level = def.groups["armor_"..k] if level then local texture = def.texture or item:gsub("%:", "_") - local enchanted_addition = (mcl_enchanting.is_enchanted_def(item) and "^[colorize:white:50^[colorize:purple:50" or "") + local enchanted_addition = (mcl_enchanting.is_enchanted(item) and mcl_enchanting.overlay or "") table.insert(textures, "("..texture..".png"..enchanted_addition..")") preview = "(player.png^[opacity:0^"..texture.."_preview.png"..enchanted_addition..")"..(preview and "^"..preview or "") armor_level = armor_level + level diff --git a/mods/ITEMS/mcl_armor/init.lua b/mods/ITEMS/mcl_armor/init.lua index 1eb03d32b..c5502cf42 100644 --- a/mods/ITEMS/mcl_armor/init.lua +++ b/mods/ITEMS/mcl_armor/init.lua @@ -13,7 +13,7 @@ minetest.register_tool("mcl_armor:helmet_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_helmet_leather.png", - groups = {armor_head=1, mcl_armor_points=1, mcl_armor_uses=56}, + groups = {armor_head=1, mcl_armor_points=1, mcl_armor_uses=56, enchantability=15}, _repair_material = "mcl_mobitems:leather", sounds = { _mcl_armor_equip = "mcl_armor_equip_leather", @@ -28,7 +28,7 @@ minetest.register_tool("mcl_armor:helmet_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_helmet_iron.png", - groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166}, + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166, enchantability=9 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -44,7 +44,7 @@ minetest.register_tool("mcl_armor:helmet_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_helmet_gold.png", - groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=78}, + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=78, enchantability=25 }, _repair_material = "mcl_core:gold_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -59,7 +59,7 @@ minetest.register_tool("mcl_armor:helmet_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_helmet_diamond.png", - groups = {armor_head=1, mcl_armor_points=3, mcl_armor_uses=364, mcl_armor_toughness=2}, + groups = {armor_head=1, mcl_armor_points=3, mcl_armor_uses=364, mcl_armor_toughness=2, enchantability=10 }, _repair_material = "mcl_core:diamond", sounds = { _mcl_armor_equip = "mcl_armor_equip_diamond", @@ -74,7 +74,7 @@ minetest.register_tool("mcl_armor:helmet_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_helmet_chain.png", - groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166}, + groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166, enchantability=12 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_chainmail", @@ -91,7 +91,7 @@ minetest.register_tool("mcl_armor:chestplate_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_chestplate_leather.png", - groups = {armor_torso=1, mcl_armor_points=3, mcl_armor_uses=81}, + groups = {armor_torso=1, mcl_armor_points=3, mcl_armor_uses=81, enchantability=15 }, _repair_material = "mcl_mobitems:leather", sounds = { _mcl_armor_equip = "mcl_armor_equip_leather", @@ -106,7 +106,7 @@ minetest.register_tool("mcl_armor:chestplate_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_chestplate_iron.png", - groups = {armor_torso=1, mcl_armor_points=6, mcl_armor_uses=241}, + groups = {armor_torso=1, mcl_armor_points=6, mcl_armor_uses=241, enchantability=9 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -121,7 +121,7 @@ minetest.register_tool("mcl_armor:chestplate_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_chestplate_gold.png", - groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=113}, + groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=113, enchantability=25 }, _repair_material = "mcl_core:gold_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -136,7 +136,7 @@ minetest.register_tool("mcl_armor:chestplate_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_chestplate_diamond.png", - groups = {armor_torso=1, mcl_armor_points=8, mcl_armor_uses=529, mcl_armor_toughness=2}, + groups = {armor_torso=1, mcl_armor_points=8, mcl_armor_uses=529, mcl_armor_toughness=2, enchantability=10 }, _repair_material = "mcl_core:diamond", sounds = { _mcl_armor_equip = "mcl_armor_equip_diamond", @@ -151,7 +151,7 @@ minetest.register_tool("mcl_armor:chestplate_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_chestplate_chain.png", - groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=241}, + groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=241, enchantability=12 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_chainmail", @@ -168,7 +168,7 @@ minetest.register_tool("mcl_armor:leggings_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_leggings_leather.png", - groups = {armor_legs=1, mcl_armor_points=2, mcl_armor_uses=76}, + groups = {armor_legs=1, mcl_armor_points=2, mcl_armor_uses=76, enchantability=15 }, _repair_material = "mcl_mobitems:leather", sounds = { _mcl_armor_equip = "mcl_armor_equip_leather", @@ -183,7 +183,7 @@ minetest.register_tool("mcl_armor:leggings_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_leggings_iron.png", - groups = {armor_legs=1, mcl_armor_points=5, mcl_armor_uses=226}, + groups = {armor_legs=1, mcl_armor_points=5, mcl_armor_uses=226, enchantability=9 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -198,7 +198,7 @@ minetest.register_tool("mcl_armor:leggings_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_leggings_gold.png", - groups = {armor_legs=1, mcl_armor_points=3, mcl_armor_uses=106}, + groups = {armor_legs=1, mcl_armor_points=3, mcl_armor_uses=106, enchantability=25 }, _repair_material = "mcl_core:gold_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -213,7 +213,7 @@ minetest.register_tool("mcl_armor:leggings_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_leggings_diamond.png", - groups = {armor_legs=1, mcl_armor_points=6, mcl_armor_uses=496, mcl_armor_toughness=2}, + groups = {armor_legs=1, mcl_armor_points=6, mcl_armor_uses=496, mcl_armor_toughness=2, enchantability=10 }, _repair_material = "mcl_core:diamond", sounds = { _mcl_armor_equip = "mcl_armor_equip_diamond", @@ -228,7 +228,7 @@ minetest.register_tool("mcl_armor:leggings_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_leggings_chain.png", - groups = {armor_legs=1, mcl_armor_points=4, mcl_armor_uses=226}, + groups = {armor_legs=1, mcl_armor_points=4, mcl_armor_uses=226, enchantability=12 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_chainmail", @@ -244,7 +244,7 @@ minetest.register_tool("mcl_armor:boots_leather", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_boots_leather.png", - groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=66}, + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=66, enchantability=15 }, _repair_material = "mcl_mobitems:leather", sounds = { _mcl_armor_equip = "mcl_armor_equip_leather", @@ -259,7 +259,7 @@ minetest.register_tool("mcl_armor:boots_iron", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_boots_iron.png", - groups = {armor_feet=1, mcl_armor_points=2, mcl_armor_uses=196}, + groups = {armor_feet=1, mcl_armor_points=2, mcl_armor_uses=196, enchantability=9 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -274,7 +274,7 @@ minetest.register_tool("mcl_armor:boots_gold", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_boots_gold.png", - groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=92}, + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=92, enchantability=25 }, _repair_material = "mcl_core:gold_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_iron", @@ -289,7 +289,7 @@ minetest.register_tool("mcl_armor:boots_diamond",{ _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_boots_diamond.png", - groups = {armor_feet=1, mcl_armor_points=3, mcl_armor_uses=430, mcl_armor_toughness=2}, + groups = {armor_feet=1, mcl_armor_points=3, mcl_armor_uses=430, mcl_armor_toughness=2, enchantability=10 }, _repair_material = "mcl_core:diamond", sounds = { _mcl_armor_equip = "mcl_armor_equip_diamond", @@ -304,7 +304,7 @@ minetest.register_tool("mcl_armor:boots_chain", { _doc_items_longdesc = longdesc, _doc_items_usagehelp = usage, inventory_image = "mcl_armor_inv_boots_chain.png", - groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=196}, + groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=196, enchantability=12 }, _repair_material = "mcl_core:iron_ingot", sounds = { _mcl_armor_equip = "mcl_armor_equip_chainmail", diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 0be575939..45208c413 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -15,7 +15,8 @@ minetest.register_craftitem("mcl_books:book", { _doc_items_longdesc = S("Books are used to make bookshelves and book and quills."), inventory_image = "default_book.png", stack_max = 64, - groups = { book=1, craftitem = 1 }, + groups = { book=1, craftitem = 1, enchantability = 1 }, + _mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted", }) if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index fa2c2c530..6e41007cd 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -133,7 +133,7 @@ S("The speed and damage of the arrow increases the longer you charge. The regula range = 1, -- Trick to disable digging as well on_use = function() end, - groups = {weapon=1,weapon_ranged=1,bow=1}, + groups = {weapon=1,weapon_ranged=1,bow=1,enchantability=1}, }) -- Iterates through player inventory and resets all the bows in "charging" state back to their original stage @@ -173,10 +173,10 @@ for level=0, 2 do wield_scale = { x = 1.8, y = 1.8, z = 1 }, stack_max = 1, range = 0, -- Pointing range to 0 to prevent punching with bow :D - groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1}, + groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1, enchantability=1}, on_drop = function(itemstack, dropper, pos) reset_bow_state(dropper) - if mcl_enchanting.is_enchanted(itemstack) then + if mcl_enchanting.is_enchanted(itemstack:get_name()) then itemstack:set_name("mcl_bows:bow_enchanted") else itemstack:set_name("mcl_bows:bow") @@ -201,7 +201,7 @@ controls.register_on_release(function(player, key, time) wielditem:get_name()=="mcl_bows:bow_0_enchanted" or wielditem:get_name()=="mcl_bows:bow_1_enchanted" or wielditem:get_name()=="mcl_bows:bow_2_enchanted") then local has_shot = false - local enchanted = mcl_enchanting.is_enchanted(wielditem) + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) local speed, damage local p_load = bow_load[player:get_player_name()] local charge @@ -269,7 +269,7 @@ controls.register_on_hold(function(player, key, time) local inv = minetest.get_inventory({type="player", name=name}) local wielditem = player:get_wielded_item() if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") and (creative or get_arrow(player)) then - local enchanted = mcl_enchanting.is_enchanted(wielditem) + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) if enchanted then wielditem:set_name("mcl_bows:bow_0_enchanted") else diff --git a/mods/ITEMS/mcl_compass/init.lua b/mods/ITEMS/mcl_compass/init.lua index 1b2810de6..66553dfc0 100644 --- a/mods/ITEMS/mcl_compass/init.lua +++ b/mods/ITEMS/mcl_compass/init.lua @@ -57,7 +57,7 @@ minetest.register_globalstep(function(dtime) if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then local itemname = "mcl_compass:"..compass_image - if mcl_enchanting.is_enchanted(stack) then + if mcl_enchanting.is_enchanted(stack:get_name()) then itemname = itemname .. "_enchanted" end stack:set_name(itemname) @@ -98,7 +98,7 @@ for i,img in ipairs(images) do inventory_image = img, wield_image = img, stack_max = 64, - groups = {not_in_creative_inventory=inv, compass=i, tool=1, disable_repair=1} + groups = {not_in_creative_inventory=inv, compass=i, tool=1, disable_repair=1, enchantability=1 } }) -- Help aliases. Makes sure the lookup tool works correctly diff --git a/mods/ITEMS/mcl_farming/hoes.lua b/mods/ITEMS/mcl_farming/hoes.lua index a7caadb35..0a483f304 100644 --- a/mods/ITEMS/mcl_farming/hoes.lua +++ b/mods/ITEMS/mcl_farming/hoes.lua @@ -70,7 +70,7 @@ minetest.register_tool("mcl_farming:hoe_wood", { inventory_image = "farming_tool_woodhoe.png", wield_scale = { x = 1.8, y = 1.8, z = 1 }, on_place = hoe_on_place_function(uses.wood), - groups = { tool=1, hoe=1 }, + groups = { tool=1, hoe=1, enchantability=15 }, tool_capabilities = { full_punch_interval = 1, damage_groups = { fleshy = 1, }, @@ -109,7 +109,7 @@ minetest.register_tool("mcl_farming:hoe_stone", { inventory_image = "farming_tool_stonehoe.png", wield_scale = { x = 1.8, y = 1.8, z = 1 }, on_place = hoe_on_place_function(uses.stone), - groups = { tool=1, hoe=1 }, + groups = { tool=1, hoe=1, enchantability=5 }, tool_capabilities = { full_punch_interval = 0.5, damage_groups = { fleshy = 1, }, @@ -143,7 +143,7 @@ minetest.register_tool("mcl_farming:hoe_iron", { inventory_image = "farming_tool_steelhoe.png", wield_scale = { x = 1.8, y = 1.8, z = 1 }, on_place = hoe_on_place_function(uses.iron), - groups = { tool=1, hoe=1 }, + groups = { tool=1, hoe=1, enchantability=14 }, tool_capabilities = { -- 1/3 full_punch_interval = 0.33333333, @@ -185,7 +185,7 @@ minetest.register_tool("mcl_farming:hoe_gold", { inventory_image = "farming_tool_goldhoe.png", wield_scale = { x = 1.8, y = 1.8, z = 1 }, on_place = hoe_on_place_function(uses.gold), - groups = { tool=1, hoe=1 }, + groups = { tool=1, hoe=1, enchantability=22 }, tool_capabilities = { full_punch_interval = 1, damage_groups = { fleshy = 1, }, @@ -228,7 +228,7 @@ minetest.register_tool("mcl_farming:hoe_diamond", { inventory_image = "farming_tool_diamondhoe.png", wield_scale = { x = 1.8, y = 1.8, z = 1 }, on_place = hoe_on_place_function(uses.diamond), - groups = { tool=1, hoe=1 }, + groups = { tool=1, hoe=1, enchantability=10 }, tool_capabilities = { full_punch_interval = 0.25, damage_groups = { fleshy = 1, }, diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 72b4e5412..990da549d 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -112,6 +112,7 @@ pumpkin_face_base_def._doc_items_longdesc = S("A pumpkin can be worn as a helmet pumpkin_face_base_def._doc_items_usagehelp = nil pumpkin_face_base_def.tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"} pumpkin_face_base_def.groups.armor_head=1 +pumpkin_face_base_def.groups.enchantability=1 pumpkin_face_base_def._mcl_armor_mob_range_factor = 0 pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman" pumpkin_face_base_def.groups.non_combat_armor=1 diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index e0bfca288..7b585f348 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -9,7 +9,7 @@ minetest.register_tool("mcl_fire:flint_and_steel", { inventory_image = "mcl_fire_flint_and_steel.png", liquids_pointable = false, stack_max = 1, - groups = { tool = 1 }, + groups = { tool = 1, enchantability = 1 }, on_place = function(itemstack, user, pointed_thing) -- Use pointed node's on_rightclick function first, if present local node = minetest.get_node(pointed_thing.under) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index ac64f07d9..3b7ba37c0 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -322,7 +322,7 @@ minetest.register_tool("mcl_fishing:fishing_rod", { _tt_help = S("Catches fish in water"), _doc_items_longdesc = S("Fishing rods can be used to catch fish."), _doc_items_usagehelp = S("Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?"), - groups = { tool=1, fishing_rod=1 }, + groups = { tool=1, fishing_rod=1, enchantability=1 }, inventory_image = "mcl_fishing_fishing_rod.png", wield_image = "mcl_fishing_fishing_rod.png^[transformR270", wield_scale = { x = 1.5, y = 1.5, z = 1 }, diff --git a/mods/ITEMS/mcl_heads/init.lua b/mods/ITEMS/mcl_heads/init.lua index cb83ed1fa..7502bf115 100644 --- a/mods/ITEMS/mcl_heads/init.lua +++ b/mods/ITEMS/mcl_heads/init.lua @@ -42,7 +42,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor) { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, }, }, - groups = {handy=1, armor_head=1,non_combat_armor=1, head=1, deco_block=1, dig_by_piston=1}, + groups = {handy=1, armor_head=1,non_combat_armor=1, head=1, deco_block=1, dig_by_piston=1, enchantability=1}, -- The head textures are based off the textures of an actual mob. tiles = { -- Note: bottom texture is overlaid over top texture to get rid of possible transparency. diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index f88ea8fa1..5df422f08 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -81,7 +81,7 @@ minetest.register_tool("mcl_tools:pick_wood", { _doc_items_hidden = false, inventory_image = "default_tool_woodpick.png", wield_scale = wield_scale, - groups = { tool=1, pickaxe=1, dig_speed_class=2, }, + groups = { tool=1, pickaxe=1, dig_speed_class=2, enchantability=15 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -100,7 +100,7 @@ minetest.register_tool("mcl_tools:pick_stone", { _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_stonepick.png", wield_scale = wield_scale, - groups = { tool=1, pickaxe=1, dig_speed_class=3, }, + groups = { tool=1, pickaxe=1, dig_speed_class=3, enchantability=5 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -119,7 +119,7 @@ minetest.register_tool("mcl_tools:pick_iron", { _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_steelpick.png", wield_scale = wield_scale, - groups = { tool=1, pickaxe=1, dig_speed_class=4, }, + groups = { tool=1, pickaxe=1, dig_speed_class=4, enchantability=14 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -138,7 +138,7 @@ minetest.register_tool("mcl_tools:pick_gold", { _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_goldpick.png", wield_scale = wield_scale, - groups = { tool=1, pickaxe=1, dig_speed_class=6, }, + groups = { tool=1, pickaxe=1, dig_speed_class=6, enchantability=22 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -157,7 +157,7 @@ minetest.register_tool("mcl_tools:pick_diamond", { _doc_items_longdesc = pickaxe_longdesc, inventory_image = "default_tool_diamondpick.png", wield_scale = wield_scale, - groups = { tool=1, pickaxe=1, dig_speed_class=5, }, + groups = { tool=1, pickaxe=1, dig_speed_class=5, enchantability=10 }, tool_capabilities = { -- 1/1.2 full_punch_interval = 0.83333333, @@ -277,7 +277,7 @@ minetest.register_tool("mcl_tools:shovel_wood", { inventory_image = "default_tool_woodshovel.png", wield_image = "default_tool_woodshovel.png^[transformR90", wield_scale = wield_scale, - groups = { tool=1, shovel=1, dig_speed_class=2, }, + groups = { tool=1, shovel=1, dig_speed_class=2, enchantability=15 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=1, @@ -298,7 +298,7 @@ minetest.register_tool("mcl_tools:shovel_stone", { inventory_image = "default_tool_stoneshovel.png", wield_image = "default_tool_stoneshovel.png^[transformR90", wield_scale = wield_scale, - groups = { tool=1, shovel=1, dig_speed_class=3, }, + groups = { tool=1, shovel=1, dig_speed_class=3, enchantability=5 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=3, @@ -319,7 +319,7 @@ minetest.register_tool("mcl_tools:shovel_iron", { inventory_image = "default_tool_steelshovel.png", wield_image = "default_tool_steelshovel.png^[transformR90", wield_scale = wield_scale, - groups = { tool=1, shovel=1, dig_speed_class=4, }, + groups = { tool=1, shovel=1, dig_speed_class=4, enchantability=14 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=4, @@ -361,7 +361,7 @@ minetest.register_tool("mcl_tools:shovel_diamond", { inventory_image = "default_tool_diamondshovel.png", wield_image = "default_tool_diamondshovel.png^[transformR90", wield_scale = wield_scale, - groups = { tool=1, shovel=1, dig_speed_class=5, }, + groups = { tool=1, shovel=1, dig_speed_class=5, enchantability=10 }, tool_capabilities = { full_punch_interval = 1, max_drop_level=5, @@ -383,7 +383,7 @@ minetest.register_tool("mcl_tools:axe_wood", { _doc_items_hidden = false, inventory_image = "default_tool_woodaxe.png", wield_scale = wield_scale, - groups = { tool=1, axe=1, dig_speed_class=2, }, + groups = { tool=1, axe=1, dig_speed_class=2, enchantability=15 }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=1, @@ -401,7 +401,7 @@ minetest.register_tool("mcl_tools:axe_stone", { _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_stoneaxe.png", wield_scale = wield_scale, - groups = { tool=1, axe=1, dig_speed_class=3, }, + groups = { tool=1, axe=1, dig_speed_class=3, enchantability=5 }, tool_capabilities = { full_punch_interval = 1.25, max_drop_level=3, @@ -419,7 +419,7 @@ minetest.register_tool("mcl_tools:axe_iron", { _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_steelaxe.png", wield_scale = wield_scale, - groups = { tool=1, axe=1, dig_speed_class=4, }, + groups = { tool=1, axe=1, dig_speed_class=4, enchantability=14 }, tool_capabilities = { -- 1/0.9 full_punch_interval = 1.11111111, @@ -438,7 +438,7 @@ minetest.register_tool("mcl_tools:axe_gold", { _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_goldaxe.png", wield_scale = wield_scale, - groups = { tool=1, axe=1, dig_speed_class=6, }, + groups = { tool=1, axe=1, dig_speed_class=6, enchantability=22 }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=2, @@ -456,7 +456,7 @@ minetest.register_tool("mcl_tools:axe_diamond", { _doc_items_longdesc = axe_longdesc, inventory_image = "default_tool_diamondaxe.png", wield_scale = wield_scale, - groups = { tool=1, axe=1, dig_speed_class=5, }, + groups = { tool=1, axe=1, dig_speed_class=5, enchantability=10 }, tool_capabilities = { full_punch_interval = 1.0, max_drop_level=5, @@ -477,7 +477,7 @@ minetest.register_tool("mcl_tools:sword_wood", { _doc_items_hidden = false, inventory_image = "default_tool_woodsword.png", wield_scale = wield_scale, - groups = { weapon=1, sword=1, dig_speed_class=2, }, + groups = { weapon=1, sword=1, dig_speed_class=2, enchantability=15 }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=1, @@ -496,7 +496,7 @@ minetest.register_tool("mcl_tools:sword_stone", { _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_stonesword.png", wield_scale = wield_scale, - groups = { weapon=1, sword=1, dig_speed_class=3, }, + groups = { weapon=1, sword=1, dig_speed_class=3, enchantability=5 }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=3, @@ -515,7 +515,7 @@ minetest.register_tool("mcl_tools:sword_iron", { _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_steelsword.png", wield_scale = wield_scale, - groups = { weapon=1, sword=1, dig_speed_class=4, }, + groups = { weapon=1, sword=1, dig_speed_class=4, enchantability=14 }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=4, @@ -534,7 +534,7 @@ minetest.register_tool("mcl_tools:sword_gold", { _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_goldsword.png", wield_scale = wield_scale, - groups = { weapon=1, sword=1, dig_speed_class=6, }, + groups = { weapon=1, sword=1, dig_speed_class=6, enchantability=22 }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=2, @@ -553,7 +553,7 @@ minetest.register_tool("mcl_tools:sword_diamond", { _doc_items_longdesc = sword_longdesc, inventory_image = "default_tool_diamondsword.png", wield_scale = wield_scale, - groups = { weapon=1, sword=1, dig_speed_class=5, }, + groups = { weapon=1, sword=1, dig_speed_class=5, enchantability=10 }, tool_capabilities = { full_punch_interval = 0.625, max_drop_level=5, @@ -576,7 +576,7 @@ minetest.register_tool("mcl_tools:shears", { inventory_image = "default_tool_shears.png", wield_image = "default_tool_shears.png", stack_max = 1, - groups = { tool=1, shears=1, dig_speed_class=4, }, + groups = { tool=1, shears=1, dig_speed_class=4, enchantability=1 }, tool_capabilities = { full_punch_interval = 0.5, max_drop_level=1, diff --git a/mods/ITEMS/screwdriver/init.lua b/mods/ITEMS/screwdriver/init.lua index ec4f1a2ad..bf264a50c 100644 --- a/mods/ITEMS/screwdriver/init.lua +++ b/mods/ITEMS/screwdriver/init.lua @@ -176,7 +176,7 @@ minetest.register_tool("screwdriver:screwdriver", { description = S("Screwdriver"), inventory_image = "screwdriver.png", wield_image = "screwdriver.png^[transformFX", - groups = { tool = 1, not_in_creative_inventory = 1 }, + groups = { tool = 1, not_in_creative_inventory = 1, enchantability = 1 }, on_use = function(itemstack, user, pointed_thing) screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200) return itemstack