From 19acda1a88b29a4387ed80409901455481744a10 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 31 Aug 2025 12:55:02 +0300 Subject: [PATCH] add cached item.has_tag, block.has_tag & update docs --- doc/en/scripting/builtins/libblock.md | 3 ++ doc/en/scripting/builtins/libitem.md | 3 ++ doc/ru/scripting/builtins/libblock.md | 3 ++ doc/ru/scripting/builtins/libitem.md | 3 ++ res/scripts/post_content.lua | 42 +++++++++++++++++++-------- src/content/ContentBuilder.cpp | 2 +- 6 files changed, 43 insertions(+), 13 deletions(-) diff --git a/doc/en/scripting/builtins/libblock.md b/doc/en/scripting/builtins/libblock.md index 8d3b07f8..044555c4 100644 --- a/doc/en/scripting/builtins/libblock.md +++ b/doc/en/scripting/builtins/libblock.md @@ -68,6 +68,9 @@ block.get_variant(x: int, y: int, z: int) -> int -- Sets the block variant by index block.set_variant(x: int, y: int, z: int, index: int) -> int + +-- Checks if an block has specified tag +block.has_tag(id: int, tag: str) -> bool ``` ## Rotation diff --git a/doc/en/scripting/builtins/libitem.md b/doc/en/scripting/builtins/libitem.md index 25a7e48f..d8b42f5c 100644 --- a/doc/en/scripting/builtins/libitem.md +++ b/doc/en/scripting/builtins/libitem.md @@ -33,4 +33,7 @@ item.emission(itemid: int) -> str -- Returns the value of the `uses` property item.uses(itemid: int) -> int + +-- Checks if an item has specified tag +item.has_tag(itemid: int, tag: str) -> bool ``` diff --git a/doc/ru/scripting/builtins/libblock.md b/doc/ru/scripting/builtins/libblock.md index 67547909..1466d1c8 100644 --- a/doc/ru/scripting/builtins/libblock.md +++ b/doc/ru/scripting/builtins/libblock.md @@ -67,6 +67,9 @@ block.get_variant(x: int, y: int, z: int) -> int -- Устанавливает вариант блока по индексу block.set_variant(x: int, y: int, z: int, index: int) -> int + +-- Проверяет наличие тега у блока +block.has_tag(id: int, tag: str) -> bool ``` ### Raycast diff --git a/doc/ru/scripting/builtins/libitem.md b/doc/ru/scripting/builtins/libitem.md index 265bf099..2c312dc4 100644 --- a/doc/ru/scripting/builtins/libitem.md +++ b/doc/ru/scripting/builtins/libitem.md @@ -33,6 +33,9 @@ item.emission(itemid: int) -> str -- Возвращает значение свойства `uses` item.uses(itemid: int) -> int + +-- Проверяет наличие тега у предмета +item.has_tag(itemid: int, tag: str) -> bool ``` diff --git a/res/scripts/post_content.lua b/res/scripts/post_content.lua index 2ad3633b..c8fffc6e 100644 --- a/res/scripts/post_content.lua +++ b/res/scripts/post_content.lua @@ -12,22 +12,31 @@ local names = { for name, _ in pairs(user_props) do table.insert(names, name) end --- remove undefined properties -for id, blockprops in pairs(block.properties) do - for propname, value in pairs(blockprops) do - if not table.has(names, propname) then - blockprops[propname] = nil - end - end -end -for id, itemprops in pairs(item.properties) do - for propname, value in pairs(itemprops) do - if not table.has(names, propname) then - itemprops[propname] = nil + +-- remove undefined properties and build tags set +local function process_properties(properties) + for id, props in pairs(properties) do + local tags_set = nil + for propname, value in pairs(props) do + if propname == "tags" then + if #value > 0 then + tags_set = tags_set or {} + end + for _, tag in ipairs(value) do + tags_set[tag] = true + end + end + if not table.has(names, propname) then + props[propname] = nil + end end + props.tags_set = tags_set end end +process_properties(block.properties) +process_properties(item.properties) + local function make_read_only(t) setmetatable(t, { __newindex = function() @@ -57,6 +66,15 @@ local function cache_names(library) function library.index(name) return indices[name] end + + function library.has_tag(id, tag) + local tags_set = library.properties[id].tags_set + if tags_set then + return tags_set[tag] + else + return false + end + end end cache_names(block) diff --git a/src/content/ContentBuilder.cpp b/src/content/ContentBuilder.cpp index 84f2e688..66ad1acf 100644 --- a/src/content/ContentBuilder.cpp +++ b/src/content/ContentBuilder.cpp @@ -61,7 +61,7 @@ std::unique_ptr ContentBuilder::build() { } blockDefsIndices.push_back(&def); - groups->insert(def.defaults.drawGroup); // FIXME + groups->insert(def.defaults.drawGroup); // FIXME: variants } std::vector itemDefsIndices;