Fix tools not taking wear when rightclicking

Added the API function mcl_autogroup.get_wear which is used to get the
tool wear for digging a node of a group.  This is used by mcl_tools to
compute the wear of shovels and shears when rightclicking to create
grass paths and carve pumpkins.
This commit is contained in:
Elias Åström 2021-03-18 11:35:29 +01:00
parent ba0a09243b
commit c92f0e5ce3
2 changed files with 28 additions and 41 deletions

View File

@ -49,6 +49,9 @@ mcl_autogroup contains the API functions used to register custom digging groups.
_mcl_autogroup contains most of the code. The leading underscore in the name _mcl_autogroup contains most of the code. The leading underscore in the name
"_mcl_autogroup" is used to force Minetest to load that part of the mod as late "_mcl_autogroup" is used to force Minetest to load that part of the mod as late
as possible. Minetest loads mods in reverse alphabetical order. as possible. Minetest loads mods in reverse alphabetical order.
This also means that it is very important that no mod adds _mcl_autogroups as a
dependency.
--]] --]]
-- Returns a table containing the unique "_mcl_hardness" for nodes belonging to -- Returns a table containing the unique "_mcl_hardness" for nodes belonging to
@ -233,21 +236,36 @@ end
-- or in the metadata of an enchanted tool. -- or in the metadata of an enchanted tool.
-- --
-- Parameters: -- Parameters:
-- tool_name - Name of the tool being enchanted (like "mcl_tools:diamond_pickaxe") -- toolname - Name of the tool being enchanted (like "mcl_tools:diamond_pickaxe")
-- efficiency - The efficiency level the tool is enchanted with (default 0) -- efficiency - The efficiency level the tool is enchanted with (default 0)
-- --
-- NOTE: -- NOTE:
-- Mods calling this function (like mcl_enchanting) should _not_ have -- This function can only be called after mod initialization. Otherwise a mod
-- _mcl_autogroups as a dependency. It is very important that this mod is -- would have to add _mcl_autogroup as a dependency which would break the mod
-- loaded last. This also means this function can only be called by other mods -- loading order.
-- after all mods have been initialized. function mcl_autogroup.get_groupcaps(toolname, efficiency)
function mcl_autogroup.get_groupcaps(tool_name, efficiency) local tdef = minetest.registered_tools[toolname]
local tdef = minetest.registered_tools[tool_name]
local groupcaps = table.copy(tdef.tool_capabilities.groupcaps or {}) local groupcaps = table.copy(tdef.tool_capabilities.groupcaps or {})
add_groupcaps(groupcaps, tdef._mcl_autogroup_groupcaps, efficiency) add_groupcaps(groupcaps, tdef._mcl_autogroup_groupcaps, efficiency)
return groupcaps return groupcaps
end end
-- Get the wear from using a tool on a digging group.
--
-- Parameters
-- toolname - Name of the tool used
-- diggroup - The name of the diggroup the tool is used on
--
-- NOTE:
-- This function can only be called after mod initialization. Otherwise a mod
-- would have to add _mcl_autogroup as a dependency which would break the mod
-- loading order.
function mcl_autogroup.get_wear(toolname, diggroup)
local tdef = minetest.registered_tools[toolname]
local uses = tdef._mcl_autogroup_groupcaps[diggroup].uses
return math.ceil(65535 / uses)
end
local overwrite = function() local overwrite = function()
for nname, ndef in pairs(minetest.registered_nodes) do for nname, ndef in pairs(minetest.registered_nodes) do
local newgroups = table.copy(ndef.groups) local newgroups = table.copy(ndef.groups)

View File

@ -179,26 +179,6 @@ minetest.register_tool("mcl_tools:pick_diamond", {
}, },
}) })
local get_shovel_dig_group = function(itemstack)
local itemstring = itemstack:get_name()
local efficiency_level = mcl_enchanting.get_enchantment(itemstack, "efficiency")
local postfix = efficiency_level > 0 and "_efficiency_" .. efficiency_level or ""
if itemstring:find("mcl_tools:shovel_wood") == 1 then
return "shovely_dig_wood" .. postfix
elseif itemstring:find("mcl_tools:shovel_stone") == 1 then
return "shovely_dig_stone" .. postfix
elseif itemstring:find("mcl_tools:shovel_iron") == 1 then
return "shovely_dig_iron" .. postfix
elseif itemstring:find("mcl_tools:shovel_gold") == 1 then
return "shovely_dig_gold" .. postfix
elseif itemstring:find("mcl_tools:shovel_diamond") == 1 then
return "shovely_dig_diamond" .. postfix
else
-- Fallback
return "shovely_dig_wood"
end
end
local make_grass_path = function(itemstack, placer, pointed_thing) local make_grass_path = function(itemstack, placer, pointed_thing)
-- Use pointed node's on_rightclick function first, if present -- Use pointed node's on_rightclick function first, if present
local node = minetest.get_node(pointed_thing.under) local node = minetest.get_node(pointed_thing.under)
@ -223,15 +203,9 @@ local make_grass_path = function(itemstack, placer, pointed_thing)
end end
if not minetest.is_creative_enabled(placer:get_player_name()) then if not minetest.is_creative_enabled(placer:get_player_name()) then
-- Add wear, as if digging a level 0 shovely node -- Add wear (as if digging a shovely node)
local toolname = itemstack:get_name() local toolname = itemstack:get_name()
local def = minetest.registered_items[toolname] local wear = mcl_autogroup.get_wear(toolname, "shovely")
local group = get_shovel_dig_group(itemstack)
local toolcaps = itemstack:get_tool_capabilities()
local base_uses = toolcaps.groupcaps[group].uses
local maxlevel = toolcaps.groupcaps[group].maxlevel
local uses = base_uses * math.pow(3, maxlevel)
local wear = math.ceil(65535 / uses)
itemstack:add_wear(wear) itemstack:add_wear(wear)
end end
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true) minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true)
@ -260,12 +234,7 @@ if minetest.get_modpath("mcl_farming") then
if not minetest.is_creative_enabled(placer:get_player_name()) then if not minetest.is_creative_enabled(placer:get_player_name()) then
-- Add wear (as if digging a shearsy node) -- Add wear (as if digging a shearsy node)
local toolname = itemstack:get_name() local toolname = itemstack:get_name()
local def = minetest.registered_items[toolname] local wear = mcl_autogroup.get_wear(toolname, "shearsy")
local group = get_shovel_dig_group(toolname)
local base_uses = def.tool_capabilities.groupcaps["shearsy_dig"].uses
local maxlevel = def.tool_capabilities.groupcaps["shearsy_dig"].maxlevel
local uses = base_uses * math.pow(3, maxlevel)
local wear = math.ceil(65535 / uses)
itemstack:add_wear(wear) itemstack:add_wear(wear)
end end
minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true) minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true)