1
0
mirror of https://github.com/luanti-org/luanti.git synced 2025-10-12 16:15:20 +02:00

Fix meta tool capabilities regression (#16563)

This also adds a unittest to avoid issues in the future.
This commit is contained in:
cx384
2025-10-11 19:38:21 +02:00
committed by GitHub
parent c2e2b97944
commit f205f6f539
3 changed files with 54 additions and 10 deletions

View File

@@ -128,3 +128,42 @@ local function test_node_metadata(player, pos)
test_metadata(core.get_meta(pos)) test_metadata(core.get_meta(pos))
end end
unittests.register("test_node_metadata", test_node_metadata, {map=true}) unittests.register("test_node_metadata", test_node_metadata, {map=true})
local function get_cracky_cap(item)
local value = item:get_tool_capabilities()
assert(type(value) == "table")
value = value.groupcaps
assert(type(value) == "table")
value = value.cracky
assert(type(value) == "table")
value = value.times
assert(type(value) == "table")
value = value[1]
assert(type(value) == "number")
return value
end
local function test_item_metadata_tool_capabilities()
local test_caps = {
groupcaps={
cracky={times={123}},
},
}
-- has no tool capabilities
local item = ItemStack("unittests:stick")
local item_meta = item:get_meta()
assert(dump(item:get_tool_capabilities()) == dump(ItemStack(""):get_tool_capabilities()))
item_meta:set_tool_capabilities(test_caps)
-- Can't directly compare the tables, because the pushback to Lua from get_tool_capabilities()
-- adds values to left out fields of the tool capabilities table.
assert(get_cracky_cap(item) == 123)
-- has preexisting tool capabilities in its definition table
item = ItemStack("unittests:unrepairable_tool")
item_meta = item:get_meta()
assert(get_cracky_cap(item) == 3)
item_meta:set_tool_capabilities(test_caps)
assert(get_cracky_cap(item) == 123)
end
unittests.register("test_item_metadata_tool_capabilities", test_item_metadata_tool_capabilities)

View File

@@ -106,18 +106,24 @@ struct ItemStack
const ToolCapabilities& getToolCapabilities( const ToolCapabilities& getToolCapabilities(
const IItemDefManager *itemdef, const ItemStack *hand = nullptr) const const IItemDefManager *itemdef, const ItemStack *hand = nullptr) const
{ {
const ToolCapabilities *item_cap = itemdef->get(name).tool_capabilities; // Check for override
auto &meta_item_cap = metadata.getToolCapabilitiesOverride();
if (meta_item_cap.has_value())
return meta_item_cap.value();
if (item_cap) { const ToolCapabilities *item_cap = itemdef->get(name).tool_capabilities;
return metadata.getToolCapabilities(*item_cap); // Check for override if (item_cap)
} return *item_cap;
// Fall back to the hand's tool capabilities // Fall back to the hand's tool capabilities
if (hand) { if (hand) {
auto &hand_meta_item_cap = hand->metadata.getToolCapabilitiesOverride();
if (hand_meta_item_cap.has_value())
return hand_meta_item_cap.value();
item_cap = itemdef->get(hand->name).tool_capabilities; item_cap = itemdef->get(hand->name).tool_capabilities;
if (item_cap) { if (item_cap)
return hand->metadata.getToolCapabilities(*item_cap); return *item_cap;
}
} }
item_cap = itemdef->get("").tool_capabilities; item_cap = itemdef->get("").tool_capabilities;

View File

@@ -23,10 +23,9 @@ public:
void serialize(std::ostream &os) const; void serialize(std::ostream &os) const;
void deSerialize(std::istream &is); void deSerialize(std::istream &is);
const ToolCapabilities &getToolCapabilities( const std::optional<ToolCapabilities> &getToolCapabilitiesOverride() const
const ToolCapabilities &default_caps) const
{ {
return toolcaps_override.has_value() ? *toolcaps_override : default_caps; return toolcaps_override;
} }
void setToolCapabilities(const ToolCapabilities &caps); void setToolCapabilities(const ToolCapabilities &caps);