diff --git a/mods/CORE/_mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua index 16fa14c5fd..509542353f 100644 --- a/mods/CORE/_mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -18,7 +18,7 @@ digging times in seconds. These digging times can be then added verbatim into th Example: mcl_autogroup.digtimes.pickaxey_dig_diamond[1] = 0.2 -→ This menas that when a node has been assigned the group “pickaxey_dig_diamond=1”, it can be dug by the +→ This means that when a node has been assigned the group “pickaxey_dig_diamond=1”, it can be dug by the diamond pickaxe in 0.2 seconds. @@ -44,6 +44,7 @@ local divisors = { ["shearsy_wool"] = 5, ["swordy_cobweb"] = 15, } +local max_efficiency_level = 5 mcl_autogroup = {} mcl_autogroup.digtimes = {} @@ -53,11 +54,19 @@ for m=1, #materials do for g=1, #basegroups do mcl_autogroup.digtimes[basegroups[g].."_dig_"..materials[m]] = {} mcl_autogroup.creativetimes[basegroups[g].."_dig_"..materials[m]] = {} + for e=1, max_efficiency_level do + mcl_autogroup.digtimes[basegroups[g].."_dig_"..materials[m].."_efficiency_"..e] = {} + mcl_autogroup.creativetimes[basegroups[g].."_dig_"..materials[m].."_efficiency_"..e] = {} + end end end for g=1, #minigroups do mcl_autogroup.digtimes[minigroups[g].."_dig"] = {} mcl_autogroup.creativetimes[minigroups[g].."_dig"] = {} + for e=1, max_efficiency_level do + mcl_autogroup.digtimes[minigroups[g].."_dig_efficiency_"..e] = {} + mcl_autogroup.creativetimes[minigroups[g].."_dig_efficiency_"..e] = {} + end end local overwrite = function() @@ -80,7 +89,7 @@ local overwrite = function() groups_changed = true end - local function calculate_group(hardness, material, diggroup, newgroups, actual_rating, expected_rating) + local function calculate_group(hardness, material, diggroup, newgroups, actual_rating, expected_rating, efficiency) local time, validity_factor if actual_rating >= expected_rating then -- Valid tool @@ -89,7 +98,11 @@ local overwrite = function() -- Wrong tool (higher digging time) validity_factor = 5 end - time = (hardness * validity_factor) / divisors[material] + local speed_multiplier = divisors[material] + if efficiency then + speed_multiplier = speed_multiplier + efficiency * efficiency + 1 + end + time = (hardness * validity_factor) / speed_multiplier if time <= 0.05 then time = 0 else @@ -113,6 +126,9 @@ local overwrite = function() for g=1,#materials do local diggroup = basegroup.."_dig_"..materials[g] newgroups = calculate_group(hardness, materials[g], diggroup, newgroups, g, ndef.groups[basegroup]) + for e=1,max_efficiency_level do + newgroups = calculate_group(hardness, materials[g], diggroup .. "_efficiency_" .. e, newgroups, g, ndef.groups[basegroup], e) + end groups_changed = true end end @@ -134,6 +150,9 @@ local overwrite = function() or (ndef.groups[minigroup] and minigroup ~= "swordy_cobweb" and minigroup ~= "shearsy_wool") then newgroups = calculate_group(hardness, minigroup, diggroup, newgroups, ar, 1) + for e=1,max_efficiency_level do + newgroups = calculate_group(hardness, minigroup, diggroup .. "_efficiency_" .. e, newgroups, ar, 1, e) + end groups_changed = true end end diff --git a/mods/CORE/mcl_enchanting/enchantments.lua b/mods/CORE/mcl_enchanting/enchantments.lua index b5452f96e7..63316b8d8b 100644 --- a/mods/CORE/mcl_enchanting/enchantments.lua +++ b/mods/CORE/mcl_enchanting/enchantments.lua @@ -90,7 +90,7 @@ mcl_enchanting.enchantments.depth_strider = { requires_tool = false, } --- unimplemented +-- implemented via on_enchant mcl_enchanting.enchantments.efficiency = { name = "Efficiency", max_level = 5, @@ -101,7 +101,17 @@ mcl_enchanting.enchantments.efficiency = { weight = 10, description = "Increases mining speed.", curse = false, - on_enchant = function() end, + on_enchant = function(itemstack, level, itemdef) + local tool_capabilities = itemstack:get_tool_capabilities() + local groupcaps = {} + for group, capability in pairs(tool_capabilities.groupcaps) do + local groupname = group .. "_efficiency_" .. level + capability.times = mcl_autogroup.digtimes[groupname] + groupcaps[groupname] = capability + end + tool_capabilities.groupcaps = groupcaps + itemstack:get_meta():set_tool_capabilities(tool_capabilities) + end, requires_tool = false, } @@ -450,7 +460,7 @@ mcl_enchanting.enchantments.thorns = { requires_tool = false, } --- unimplemented +-- implemented via on_enchant; Unimplemented for Bows, Armor and Fishing Rods mcl_enchanting.enchantments.unbreaking = { name = "Unbreaking", max_level = 3, @@ -461,12 +471,17 @@ mcl_enchanting.enchantments.unbreaking = { weight = 5, description = "Increases item durability.", curse = false, - on_enchant = function() end, + on_enchant = function(itemstack, level, itemdef) + local new_capabilities = itemstack:get_tool_capabilities() + for group, capability in pairs(new_capabilities.groupcaps) do + capability.uses = capability.uses * (1 + level) + end + new_capabilities.punch_attack_uses = new_capabilities.punch_attack_uses * (1 + level) + itemstack:get_meta():set_tool_capabilities(new_capabilities) + end, requires_tool = true, } - - --[[ local pickaxes = {"mcl_tools:pick_wood", "mcl_tools:pick_stone", "mcl_tools:pick_gold", "mcl_tools:pick_iron", "mcl_tools:pick_diamond"} local pickaxes_better_than_iron = {"mcl_tools:pick_iron", "mcl_tools:pick_diamond"} @@ -544,48 +559,3 @@ minetest.register_on_mods_loaded(function() end end) --]] - - ---[[ - sharpness = { - name = "Sharpness", - max_level = 5, - create_itemdef = function(def, level) - def.tool_capabilities.damage_groups.fleshy = def.tool_capabilities.damage_groups.fleshy + (level + 1) / 2 - end, - }, - efficiency = { - name = "Efficiency", - max_level = 5, - create_itemdef = function(def, level) - local groupcaps = def.tool_capabilities.groupcaps - for _, groupcap in pairs(groupcaps) do - for i, t in pairs(groupcap.times) do - local m = 1 / t - m = m + math.pow(level, 2) + 1 - groupcap.times[i] = 1 / m - end - end - end, - }, - unbreaking = { - name = "Unbreaking", - max_level = 3, - create_itemdef = function(def, level) - local toolcaps = def.tool_capabilities - local armor_uses = def.groups.mcl_armor_uses - local factor = 0.5 - if toolcaps then - local groupcaps = toolcaps.groupcaps - for _, groupcap in pairs(groupcaps) do - groupcap.uses = math.floor(groupcap.uses * (1 + level)) - end - def.tool_capabilities.punch_attack_uses = math.floor(def.tool_capabilities.punch_attack_uses * (1 + level)) - elseif armor_uses then - def.groups.mcl_armor_uses = math.floor(armor_uses / (0.6 + (0.4 / (level + 1)))) - end - end - }, - },--]] - - diff --git a/mods/CORE/mcl_enchanting/api.lua b/mods/CORE/mcl_enchanting/engine.lua similarity index 98% rename from mods/CORE/mcl_enchanting/api.lua rename to mods/CORE/mcl_enchanting/engine.lua index 1581225627..349e8882a7 100644 --- a/mods/CORE/mcl_enchanting/api.lua +++ b/mods/CORE/mcl_enchanting/engine.lua @@ -6,6 +6,9 @@ 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 itemdef.tool_capabilities then + itemstack:get_meta():set_tool_capabilities(itemdef.tool_capabilities) + end for enchantment, level in pairs(enchantments) do local enchantment_def = mcl_enchanting.enchantments[enchantment] if enchantment_def.on_enchant then diff --git a/mods/CORE/mcl_enchanting/init.lua b/mods/CORE/mcl_enchanting/init.lua index 1611557cef..2181ef978d 100644 --- a/mods/CORE/mcl_enchanting/init.lua +++ b/mods/CORE/mcl_enchanting/init.lua @@ -8,7 +8,7 @@ mcl_enchanting = { debug = true, } -dofile(modpath .. "/api.lua") +dofile(modpath .. "/engine.lua") dofile(modpath .. "/enchantments.lua") dofile(modpath .. "/command.lua") dofile(modpath .. "/tt.lua") diff --git a/mods/PLAYER/mcl_death_drop/init.lua b/mods/PLAYER/mcl_death_drop/init.lua index 4e0fa6e629..56e6ea5227 100644 --- a/mods/PLAYER/mcl_death_drop/init.lua +++ b/mods/PLAYER/mcl_death_drop/init.lua @@ -23,7 +23,7 @@ minetest.register_on_dieplayer(function(player) local z = math.random(0, 9)/3 pos.x = pos.x + x pos.z = pos.z + z - if not void_deadly and drop and mcl_enchanting.has_enchantment(stack, "curse_of_vanishing") then + if not void_deadly and drop and not mcl_enchanting.has_enchantment(stack, "curse_of_vanishing") then local def = minetest.registered_items[stack:get_name()] if def and def.on_drop then stack = def.on_drop(stack, player, pos)